Antworten auf deine Fragen:
Neues Thema erstellen

Suchfuntion: select multiple, oder suche alle

strichcode

Nicht mehr ganz neu hier

Ihr Lieben, ich brauch mal wieder Eure Hilfe!

Ich erstelle gerade eine HP mit Inhalten aus einer DB. Es soll eine Suchfunktion geben.
Dazu habe ich ein Formular:


Code:
<select name="land" style="width: 160px;" multiple="multiple" class="testselect2">
        <option value="alle">alle</option>
        <option value="Deutschland">Deutschland</option>
        <option value="Niederlande">Niederlande</option>
        <option value="Frankreich">Frankreich</option>
        <option value="Spanien">Spanien</option>
</select>
Dazu dann in der ergebnis.php:

Code:
$Landwahl = $_GET['land'];
$abfrage = "SELECT * FROM Tabelle WHERE HAUS_LAND = '$Landwahl' ";
Ich möchte entweder eine Mehrfachauswahl treffen können (z.B. Deutschland und Frankreich. Oder, was auch ginge, alle Länder auswählen können.

Leider weiß ich nicht, wie ich dann den Select-Befehl schreiben kann.

Zur Mehrfachauswahl habe ich schon mit <select name="land[]" ...> experimentiert. Ich sehe dann in der Browserzeile: ..../ergebnis.php?land=Deutschland&land=Niederlande&...
weiß aber nicht, wie ich das trennen oder weiterverarbeiten kann.

Zur Auswahl alle: Im betreffenden DB-Feld steht das jeweilige Land ausgeschrieben (z.B. Deutschland).
Wie kann ich sowas schreiben wie: Select * from Tabelle Where Haus_Land = "alle Länder möglich"?

Könnt Ihr mir da weiter helfen?
Bitte setzt nicht allzuviele php-Kenntnisse voraus. Ich bin froh, bis hier hin gekommen zu sein. ;-)

Vielen Dank schon mal
Heike
 

msa1989

Bin da

Nachdem du nicht weißt ob ein oder mehrere Länder gesucht werden, brauchst du einen "flexiblen" SQL-Befehl. Sprich dein Grundbefehl sieht also so aus:
Code:
SELECT * FROM meineTabelle WHERE land = 'land1'
Je nachdem wieviele Länder angeklickt wurden, muss du dann
Code:
OR land = 'land2'
anhängen bis alle Länder durch sind. Dann sollte z.B. sowas bei rauskommen:
Code:
[code]SELECT * FROM meineTabelle WHERE land = 'land1' OR land = 'land2' OR land = 'land3'
[/code]

Weiterhin sei dir gesagt: Nimm "prepared statements" her. Mit deinen bisherigen Zeilen Code könnte ein Angreifer sowas machen:
Code:
SELECT * FROM meineTabelle WHERE land = ;
DROP TABLE meineTabelle;
Das ganze würde dann deine Tabelle löschen. (Ist vermutlich noch der harmloseste Fall)
 

strichcode

Nicht mehr ganz neu hier

Danke msa1989 für's Mitdenken.

Ich bin keine Logikleuchte, aber Deine Lösung bedeutet doch daß man entweder nur ein Land, oder alle Länder zur DB schickt, oder?
Was, wenn jemand Deutschland UND Frankreich in der selectbox auswählt, aber NICHT Niederlande?

Bzw. ist Dein Vorschlag also die Lösung für eine nicht-multiple Selectbox, bei der ich aber alle Länder zur DB schicken kann, richtig?

prepared statements werden gerade gegoogelt, danke für den Tipp. ;-)
 

mwxx

Nicht mehr ganz neu hier

Was, wenn jemand Deutschland UND Frankreich in der selectbox auswählt, aber NICHT Niederlande?

Oh das war schon korrekt von msa1989!


Wenn jemand Deutschland UND Frankreich erhalten soll, muss die WHERE-Klausel natürlich land="Deutschland" OR land="Frankreich" lauten, denn mit AND würde er ja alle suchen, die sowohl Deutschland als auch Frankreich sind !
 

strichcode

Nicht mehr ganz neu hier

Danke, mwxx! Langsam wird's hell. ;-) ("oder" war für mich so "ausschließend", sorry)

Jetzt fehlt mir noch der Weg für "entweder alle, oder einen".
Ich weiß nicht, wie ich mich richtig ausdrücken soll, aber:
Mit
Code:
$Landwahl = $_GET['land'];
bekomme ich das was im Select gewählt ist.
Mit
Code:
WHERE HAUS_LAND = '$Landwahl'
schreibe ich es in den mysql-Befehl.

Ich bekomme aber $_GET['land']; ja nur EIN mal. Wie kann ich dann eine Aufzählung hinkriegen, wie msa1989 sie vorschlägt?
Denn
Code:
WHERE land = 'land1' OR land = 'land2' OR land = 'land3'
ist der mysql-Befehl für ALLE Länder. Was, wenn nun jemand nur Frankreich will.

Klingt um die Ecke gedacht, aber ich kann ja nicht zwei sql-befehle untereinander schreiben, und er sucht sich einen aus. Oder lassen sich if-bedingungen in's sql schreiben?

Ich schreibe mich hier um Kopf und Kragen, hoffentlich versteht Ihr was ich meine. ;-)
 

msa1989

Bin da

Hier mal ein Tipp:

HTML:
<select name="laender[]" multiple="multiple">
  <option value="Deutschland">Deutschland</option>
  <option value="Frankreich">Frankreich</option>
  <option value="Niederlande">Niederlande</option>
  <option value="...">etc</option>
</select>

in PHP kannst du dann Länder so bekommen. Probiere damit mal rum.
Diese Schleife kannst du dann natürlich auch nutzen um die SQL-Abfrage zu bauen
PHP:
foreach($_GET['laender'] as $land) {
  echo $land;
}
 

strichcode

Nicht mehr ganz neu hier

Ich danke Dir für Deine Geduld mit mir msa1989!

Es kommt "DeutschlandNiederlande" dabei heraus.
Kann ich das irgendwie trennen und dann für die Platzhalter LandX einfügen
um an Dein

Code:
WHERE land = 'land1' OR land = 'land2' OR land = 'land3'

zu kommen?
 

Myhar

Hat es drauf

Ich kenne mich mit PHP zugegebenermaßen selber nicht so gut uas, aber diese foreach-Schleife sollte einem schon ein Begriff sein. Du bekommst nicht "DeutschlandNiederlande", sondern einmal Deutschland und beim zweiten Durchlauf dann Niederlande raus, Das ganze wird dann nur ohne Leerzeichen dazwischen ausgegeben. Jetzt musst du aus "Deutschland" "Niederlande" ein WHERE land = 'Deutschland' OR land = 'Niederlande' machen.

Edit: Du könntest die Funktion also folgendermaßen erweitern: statt echo $land nimmst du mal echo "land = " . $land . "OR"; Damit soltlest du dann land = Deutschland OR land = Niederlande OR bekommen. Du musst dann also nur mithilfe des index herausfinden ob du beim letzten Element bist und dann hast du kein OR mehr hinten dran.... Das nur mal als Denkanstoß :)
 

netbandit

Aktives Mitglied

Idee:

PHP:
if(is_array($land)){
    $sql="SELECT * FROM Tabelle WHERE HAUS_LAND = '" . implode("' OR HAUS_LAND = '", $land) . "'";
}

Setzt natürlich voraus, daß $land "sauber" ist
Grüße :)
 

msa1989

Bin da

PHP:
// Datenbankverbindung herstellen (ein Beispiel)
$DB_HOST = 'localhost';
$DB_NAME = 'name';
$DB_USER = 'benutzer';
$DB_PASS = 'passwort';
$db_conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
$db_conn->set_charset('utf8');

// sonstige Variablen die du benötigst
$erstesLand = true;
$alleLaender = array();
$basis_abfrage = 'SELECT * FROM meineTabelle WHERE land = ?';
$erweiterung = '';

// schleife über alle Länder
foreach ($_GET['laender'] as $land) {
  // nicht beim ersten Land ein OR hinzufügen sondern erst bei späteren
  if(!$erstesLand) {
    $erweiterung .= ' OR land = ?';
  }
  // in ein Array alle Länder speichern die du abfragen willst
  array_push($alleLaender, $land);
  $erstesLand = false;
}

// dein kompletten SQL-Befehl zusammenbaue:
// könnte für 3 Länder so aussehen: SELECT * FROM meineTabelle WHERE land = ? OR land = ? OR land = ?
$sql_befehl = $basis_abfrage.$erweiterung;
$stmt = $db_conn->prepare($sql_befehl);     // den SQL-Befehl "vorbereiten"
foreach ($alleLaender as $land) {           // und dann alle Länder einbinden
  $stmt->bind_param("s", $land);            // siehe http://php.net/manual/de/mysqli.quickstart.prepared-statements.php
}

Dein Job:
Schau dir das auf der PHP Seite an und versuche das Ergebnis der Abfrage zu bekommen und auszugeben. Ich will dir jetzt nicht den kompletten Code schreiben, sonst ist der Lerneffekt eher weniger da.
Ein wesentlicher Knackpunkt ist aber vermutlich der Schritt eine saubere und vor allem sichere SQL-Verbindung hinzubekommen. Mit dem Code oben bist du auf der sicheren Seite und hast denke ich eine gute Basis
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.635
Beiträge
1.538.449
Mitglieder
67.556
Neuestes Mitglied
Ggirl
Oben