• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP - Suche mit Mehrfachauswahl

kRuzeFiX

Neues Mitglied
Hallo,

ich habe wieder eine Frage zu PHP,
ich habe eine Datenbank die mehrere Spalten besitzt, hier ein Beispiel für einen Eintrag:
[TABLE="class: grid, width: 500, align: left"]
[TR]
[TD]id[/TD]
[TD]postleitzahl[/TD]
[TD]name[/TD]
[TD]geschmack[/TD]
[TD]gemuse[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]73492[/TD]
[TD]peter[/TD]
[TD]apfel, banane, zitrone minze, orange[/TD]
[TD]ja[/TD]
[/TR]
[/TABLE]




id = selbsterklärend, fortlaufende nummerierung
plz = selbsterklärend
name = selbsterklärend
geschmack = hier können mehrere Werte bei einem Eintrag ausgewählt werden, diese werden mit ", " voneinander getrennt. Ein Wert kann aber auch "zitrone minze" sein (alle möglichen Werte sind in einer anderen Datenbank gespeichert)
gemuse = kann entweder "ja", "nein" oder "keine Angabe" sein.

Nun möchte ich hierfür gern ein php-Suchskript mit Mehrfachauswahl schreiben.
Hierfür kann ich nach der plz mit z.B. "73*" suchen, bei Geschmack kann ich "zitrone minze" sowie "orange" oder auch mehr angeben und bei gemuse einer der drei Werte. Hierfür sucht mein Skript in der Datenbank jeden Datensatz nach den entsprechenden Kriterien ab und spuckt die Ergebnisse aus.

Bisher habe ich leider keine gute Lösung gefunden wie ich zuerst einmal das ganze mit der Mehrfachauswahl in html umsetze. In php bin ich mittlerweile so weit, dass ich plz, geschmack und gemuse (jeweils nur einzelangaben) suchen kann und entsprechend etwas gefunden wird. Jedoch funktioniert das Skript nicht immer und unter Safari und Chrome überhaupt nicht :?:

Das ist mein Code bisher:
PHP:
<?php 
$tbl_name="verzeichnis"; // Table name

    if(isset($_POST['search'])){
    $plz = mysql_real_escape_string($_POST['plz']);
    $geschmack = mysql_real_escape_string($_POST['geschmack']);
    $gemuse = mysql_real_escape_string($_POST['gemuse']);

$searcharray = array();

if($plz != '12345') { //12345 ist der Standardwert der bei plz in der Abfrage steht
$sql = "SELECT `id`,`plz` FROM `verzeichnis` WHERE MATCH (`plz`) AGAINST ('".$plz."' IN BOOLEAN MODE)";    
$result = mysql_query($sql) or die(mysql_error()); // Abfrage ausführen
while($row = mysql_fetch_object($result)) { // Für jeden Datensatz...
array_push($searcharray, $row->id); // schreibe seine id in das Array
}
$gefunden = implode(" OR `id` = ", $searcharray); // Array in String umformen
}

if($geschmack != '-') { // Wenn kein Suchwert ausgewählt wurde wird "-" als Wert übertragen
$searcharray = array();
if($gefunden != null) {
    $sql = "SELECT `id`,`geschmack` FROM `verzeichnis` WHERE `id` = ".$gefunden."";    
} else {
    $sql = "SELECT `id`,`geschmack` FROM `verzeichnis`";    
}
$result = mysql_query($sql) or die(mysql_error()); // Abfrage ausführen
while($row = mysql_fetch_object($result)) { // Für jeden Datensatz...
if(strpos($row->geschmack, $geschmack) !== false) { // ... prüfe, ob der String $geschmack vorkommt...
array_push($searcharray, $row->id); // ... und wenn ja, schreibe seine id in das Array
}
}
unset($gefunden);
$gefunden = implode(" OR `id` = ", $searcharray); // Array in String umformen
}

if($gemuse != '-') {
$searcharray = array();
if($gefunden != null) {
    $sql = "SELECT `id`,`gemuse` FROM `verzeichnis` WHERE `id` = ".$gefunden."";    
} else {
    $sql = "SELECT `id`,`gemuse` FROM `verzeichnis`";    
}
$result = mysql_query($sql) or die(mysql_error()); // Abfrage ausführen
while($row = mysql_fetch_object($result)) { // Für jeden Datensatz...
if(strpos($row->gemuse, $gemuse) !== false) { // ... prüfe, ob der String $gemuse vorkommt...
array_push($searcharray, $row->id); // ... und wenn ja, schreibe seine id in das Array
}
}
unset($gefunden);
$gefunden = implode(" OR `id` = ", $searcharray); // Array in String umformen
}

$abfrage = "SELECT * FROM `verzeichnis` WHERE `id` = ".$gefunden."";
$ergebnis = mysql_query($abfrage);
$zeilenanzahl = mysql_num_rows($ergebnis);
$zeilennummer = 0;

Danach erfolgt eine standardmäßige Ausgabe - Kann mir jemand helfen wie ich das mit der Mehrfachauswahl realisieren kann und vorallem warum mein Code manchmal nicht funktioniert und ob dieser so überhaupt okay ist?

Vielen Dank!
Gruß,
kRuzeFiX
 
In HTML ist eine Mehrfachauswahl so zu definieren:
SELFHTML: HTML/XHTML / Formulare / Auswahllisten, Radio-Buttons und Checkboxen

Das name-Attribut solltest Du per

HTML:
 .. name="variablenname[]" ..

für PHP zu einem Array machen. Die ausgewählten Einträge stehen dann in

PHP:
$_POST["variablenname"]

in Form eines Arrays. Dieses kannst Du wiederum z.B. mit explode() voneinander trennen und so die einzelnen Suchbegriffe zu einem SQL-Statement ergänzen.
 
Danke threadi, ich habe mich vielleicht falsch ausgedrückt, sorry. An sich weiß ich wie ich die Mehrfachauswahl in HTML realisiere - worrauf ich aber keine Lösung finde ist ein funktionierender Code, der eine SQL Abfrage mit allen gesuchten Kriterien ausführt. Welcher auch bei Chrome und Safari funktioniert.

Kannst du mit, oder jemand, dazu helfen?

Danke,
Gruß
 
Diese Frage habe ich eigentlich in meinem letzten Satz schon beantwortet. Falls die Begriffe/Werte alle in einer Spalte stehen und nicht nach Ähnlichkeiten gesucht werden soll, könnte dir auch folgendes Beispiel weiterhelfen:

PHP:
$sql = "SELECT * FROM tabelle WHERE spalte IN (".explode("','", $array).")";

Wenn dir das mit explode() nicht gelingt und dein Projekt ein komplexeres Statement erfordert, kannst Du übrigens auch mit einer foreach()-Schleife das Array einlesen und das Statement dadurch zusammensetzen.

PHP:
foreach( $array as $wert) {
 $sql .= "OR spalte LIKE '".mysql_escape_string($wert)."'";
}

wobei OR ggfs. auch durch AND ersetzt werden muss, falls Du eine Und-Bedingung brauchst.
 
Hallo threadi,

ich kam leider erst jetzt dazu an diesem Projekt weiterzuarbeiten, ich habe beide deiner Lösungsansätze ausprobiert - jedoch hat es mit keinem der beiden funktioniert.
Nun habe ich die foreach-Methode mit
PHP:
foreach( $array as $wert) {
 $sql .= "OR spalte LIKE '".mysql_escape_string($wert)."'";
}
probiert.
Daraufhin verarbeite ich die gefunden Ergebnisse wie folgt:
PHP:
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
array_push($searcharray, $row->id);
}
(vgl. Code vom Anfang)

Jedoch werden bei der Suche jeweils mit der Mehrfachauswahl zB beim Geschmack wenn ich nach plz "71*" und geschmack "zitrone minze" suche auch Ergebnisse angezeigt, welche keinen Eintrag bei geschmack haben, sowie welche die nur "zitrone" oder "minze" als wert besitzen aber nicht "zitrone minze".

Kannst du mir da weiterhelfen?

Vielen Dank!
Gruß
 
Hab jetzt zusammengesetzt z.B. folgenden SQL-Befehl:
Code:
SELECT `id`,`geschmack` FROM `verzeichnis` WHERE `id` = 183 OR `id` =  223 OR `id` = 244 OR `id` = 247 OR `id` = 283 AND  `geschmack` = 'zitrone minze'

Als Ergebnis kommt jedoch überhaupt nicht das raus, was ich eigentlich suche, sondern, wie schon oben erwähnt auch Einträge ohne wert und welche nur mit "zitrone"
 
Ziel muss ja auch ein Statement mit Klammerung sein:

Code:
SELECT `id`,`geschmack` FROM `verzeichnis` WHERE (`id` = 183 OR `id` =  223 OR `id` = 244 OR `id` = 247 OR `id` = 283 ) AND  `geschmack` = 'zitrone minze'
 
Ich denke ich bin nun nach langem weitercoden auf dem richtigen Weg und kurz davor :)
Nun habe ich aber noch - ich hoffe - ein letztes Problem; ich habe folgenden finalen SQL-Befehl:
Code:
SELECT `id`,`geschmack` FROM `verzeichnis` WHERE (`geschmack` = 'zitrone minze' AND `geschmack` = 'orange')

Wie wir ja wissen, soll er mir nun diese Datensätze ausspucken, welche zitrone minze und orange enthalten. Jedoch kann ein Datensatz ja folgenden Wert aufweisen: "apfel, maracuja, zitrone minze, zitrone, banane, orange"
Wie kann ich das nun in SQL richtig realisieren? Denn im moment gibt er mir kein Ergebnis zurück.

Viele Dank
 
Wie soll dabei auch etwas herauskommen?
Du hast in menschlicher Sprache geschrieben gesagt, dass er aus der Tabelle geschmack alle Datensätze ermitteln soll die sowohl den Geschmack "zitrone minze" als auch "orange" haben. Wie soll aber so ein Datensatz existieren? Gar nicht.

Wenn Du in menschlicher Sprache geschrieben haben willst: "Zeige mir alle Datensätze die als Geschmack "zitrone minze" oder"orange" haben", dann müsste es so aussehen:
Code:
SELECT `id`,`geschmack` FROM `verzeichnis` WHERE (`geschmack` = 'zitrone minze' OR `geschmack` = 'orange')

Die Klammerung kann man in dem Fall übrigens weglassen, wenn man möchte.

Da deine Datensätze in der Spalte "Geschmack" aber offenbar den Wert "apfel, maracuja, zitrone minze, zitrone, banane, orange" (also 1 Datensatz hat genau das in der Spalte Geschmack stehen) haben, kommen wir wieder zu meinem #4-Beitrag zurück. Dort hatte ich bereits geschrieben, dass Du in der Spalte nach jedem einzelnen Begriff suchen musst. Dazu hatte ich eine foreach-Schleife empfohlen bei der genau o.g. Statement herauskommen würde.
 
Sorry aber was du da treibst ist unsin. Du solltes erstmal deine Datenbank Normalisieren. Danach sind auch die Abfragen ein klax.

Mfg Splasch
 
Zurück
Oben