| SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden. |
 |

27-07-2009, 23:00
|
|
dieter_koen
Registrierter Benutzer
|
|
Registriert seit: Jul 2009
Beiträge: 8
|
|
Hilfe bei Suchscript in MySQL-DB
Einen wunderschönen guten Abend,
Ich habe vor, bzw. Script steht schon, eine Suche via Formular durchzuführen, die anschließend die Daten mit der MySQL-Datenbank abgleicht und sie in einer Tabelle ausgibt.
Das Formular besteht aus 5 Feldern, die alle in der Suche berücksichtigt werden sollen. Ist ein Feld leer, sollen alle Werte der Spalte in der DB ausgegeben werden.
Allgemein sieht die Abfrage ja dann so aus:
PHP-Code:
$sql = "SELECT * FROM 'table' WHERE objekt1 = 'eingabe_suche1' AND WHERE objekt2 = 'eingabe_suche2' [...]";
]Das Problem besteht ja nun darin, dass sobald ein Feld in dem Formular nicht gesetzt wurde (soll auch keine Pflicht sein), der String in der Where-Clause (objekt1 = " " ) leer ist und schließlich keinen "leeren" Eintrag in der DB findet und es nicht zur Ausgabe kommt.
Ich weiß leider nicht, wie ich dieses Problem umgehen kann oder ob es irgendetwas Ähnliches wie das * beim SELECT auch für die WHERE x = - Anweisung gibt.
Ich hoffe ihr könnt mir irgendwie helfen, Google konnte es nicht (oder ich bin zu dumm zum Suchen).
Und ja, dass Script soll auf dem Formular basieren!
Vielen Dank schon mal für jede Antwort!
Mit freundlichen Grüßen
der Dieter
Geändert von dieter_koen (28-07-2009 um 00:27 Uhr)
|

27-07-2009, 23:31
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo Dieter,
du kannst doch PHP prüfen lassen, ob der Wert leer ist und nur wenn nicht, die Bedingung in die where-Klausel übernehmen, also den String $sql konditional füllen, statt fest vorzugeben.
Edit: das Schlüsselwort "WHERE" kommt dabei nur einmal vor, nicht nach jedem "AND".
Gruß,
Anja
|

28-07-2009, 00:23
|
|
dieter_koen
Registrierter Benutzer
|
|
Registriert seit: Jul 2009
Beiträge: 8
|
|
Erstmal danke für deine Antwort AmicaNoctis.
Die gleiche Überlegung wie du hatte ich auch schon, doch dort tritt ein weiteres Problem auf:
Wenn ich die Variablen wie folgt vergebe und die $sql konditionell fülle, sehe das ja beispielsweise so aus[stark vereinfacht]:
PHP-Code:
if isset ($eingabe) { $where_clause_kon = "WHERE objekt = eingabe1_suche AND" } //[...] (für jedes Statement durch)
Dann kommt die
PHP-Code:
$sql = "SELECT * FROM <table> $where_clause_kon [...]"
Nun müsste ich irgendwie noch die AND 's setzen.
Würde jetzt z.B. nur das erste Feld ausgefüllt, würde die $sql ausgeschrieben so aussehen:
PHP-Code:
$sql = "SELECT * FROM <table> WHERE objekt = eingabe1_suche AND"
Dies würde einen Fehler hervorrufen, da AND nicht alleine stehen darf.
Ich müsste also immer vorraussetzen, dass immer ganz bestimmte Felder ausgefüllt werden, was aber nicht Sinn der Sache ist.
Ich hoffe ich habe dich nicht falsch verstanden  , wenn doch dann versuch es mir bitte zu erklären 
Auf jeden Fall Dankeschön
Mit freundlichen Grüßen
der Dieter
Geändert von dieter_koen (28-07-2009 um 00:28 Uhr)
|

28-07-2009, 00:34
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Das lässt sich recht einfach beheben, indem du
a) nach der schleife "1=1" einfügst, um nach dem letzten and eine Tautologie einzufügen, die das Statement semantisch nicht verändert.
b) die Bedingungen in einem Array sammelst und dieses nach der Schleife mit " and " implodierst:
PHP-Code:
$sql .= implode(" and ", $einzelbedingungen);
Gruß,
Anja
|

28-07-2009, 10:05
|
Wurzel
Master  
|
|
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
|
|
du solltest bei der prüfung nicht mit isset() sondern mit empty() und/oder einen weiteren logik arbeiten. formulardaten sind immer "set", wenn die felder einen namen haben.
mysql_real_escape_string ist auch nie verkehrt ;-)
__________________
-
|

28-07-2009, 10:18
|
|
dieter_koen
Registrierter Benutzer
|
|
Registriert seit: Jul 2009
Beiträge: 8
|
|
Hey,
danke nochmals für die Antworten 
Mit empty ist es wirklich besser, dann kann man sich das "blöde" && != " " sparen ;D, hatte ich ganz vergessen
Mit dem Implodieren habe ich es versucht, jedoch gelingt es mir nicht so richtig.
Ich weiß nicht, wie ich die Bedingung am besten setze.
Folglich kommt auch der Fehler:
[...] the right syntax to use near 'AND AND AND AND AND' at line 1
Weil er ja wieder, sobald die Felder leer sind, eben 5x hintereinander die AND 's schreibt.
Mein Code sieht also so aus:
PHP-Code:
$array = array($suche1, $suche2, $suche3, $suche4, $suche5, $suche6); $mysuche .= implode(" AND " , $array); $sql = ("SELECT * from anmeldungen WHERE $mysuche");
Vielen Dank schon einmal im Vorraus.
MfG
Geändert von dieter_koen (28-07-2009 um 10:20 Uhr)
|

28-07-2009, 11:23
|
|
dieter_koen
Registrierter Benutzer
|
|
Registriert seit: Jul 2009
Beiträge: 8
|
|
Soo, also nochmals Vielen Dank für die Antworten, hat mir wirklich sehr geholfen.
Ich habe es jetzt mit array_push gelöst, indem ich in jeder If-Abfrage das Array mit meinen Werten fülle.
Die SQL-Abfrage baue ich mit implode zusammen.
Falls jemand auch dieses Problem hat, hier der Code in vereinfacht:
PHP-Code:
$array = array(); //anstatt isset geht natürlich auch empty if(isset($_POST['eingabe1']) && $_POST['eingabe1'] != "") { $suche1 = "<spaltenname> = '" . "$_POST[eingabe1]'"; array_push($array, $suche1); } [...] //für jedes Formularfeld die Bedingungen durchgehen
//Teil der SQL-Abfrage aus Array zusammensetzen $mysuche .= implode(" AND " , $array); //SQL-Abfrage durchführen $sql = ("SELECT * from anmeldungen WHERE $mysuche"); [...] Daten und Array ausgeben.
Klappt alles perfekt!
Vielen Dank nochmal!
Mit freundlichen Grüßen
Dieter.
|

28-07-2009, 11:43
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von dieter_koen
Soo, also nochmals Vielen Dank für die Antworten, hat mir wirklich sehr geholfen.
Ich habe es jetzt mit array_push gelöst, indem ich in jeder If-Abfrage das Array mit meinen Werten fülle.
|
Wozu brauchst du array_push???
PHP-Code:
$where = array("1"); $where[] = "spalte1 = 'wert1'"; $where[] = "spalte2 = 'wert2'";
$sql = "SELECT * FROM tabelle WHERE " . implode(" AND ", $where);
Und du brauchst nicht für jedes Formularfeld ein eigenes if. Warum unnötige Tipparbeit machen, wenn das PHP für dich erledigen kann?
PHP-Code:
$suchfelder = array( 'feld1' => 'spalte1', 'feld2' => 'spalte2', 'feld3' => 'spalte3', 'feld4' => 'spalte4' );
$where = array("1");
foreach ($suchfelder as $feld => $spalte) { if (isset($_POST[$feld]) && $_POST[$feld] != '') { $where[] = sprintf("`%s` = '%s'", $spalte, mysql_real_escape_string($_POST[$feld])); } }
$sql = "SELECT * FROM tabelle WHERE " . implode(" AND ", $where);
Geändert von h3ll (28-07-2009 um 11:48 Uhr)
|

01-08-2009, 13:05
|
|
|
Ich hätte das so gelöst:
PHP-Code:
<?php $array=array(); $sql=''; foreach (array('spalte1','spalte2','spalte3') as $spalte) $test=!empty($_POST[$spalte]) ?$array[]=$spalte."='".mysql_real_escape_string($_POST[$spalte])."'":''; if (count($array)>0) $sql = "SELECT * from anmeldungen WHERE ".implode(" AND " , $array); if ($sql) // Abfrage else // fehlermeldung ?>
Prüfung über empty ist besser da isset darauf reagiert ob die Variable überhaupt existiert und nicht darauf ob diese leer ist.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|