template
Index :: PHP/MySQL :: Suche nach Datensätzen (1 Suchfeld)
Die allgemeinste Form der Suche bietet dem Benutzer ein Formular mit einem einzeiligen Textfeld zur Eingabe des Suchbegriffs sowie einer Schaltfläche (meist ein Button) zum Starten der Aktion. Sollte es mehrere recherchierbare Datenbankfelder geben, kann man zusätzlich noch eine ComboBox zur Verfügung stellen, in der alle relevanten Feldnamen aufgelistet sind.
Der HTML-Code (hier in suche.php) könnte so aussehen:
<form action='liste.php' method='post'>
Feld: <select name='fnr' size='1'>
<option value='1'>Vorname</option>
<option value='2'>Nachname</option>
<option value='3'>Personalnummer</option>
</select><br>
Begriff: <input type='text' name='search' size='16' maxlength='24'><br>
<input type='submit' value='Suche'><br>
</form>
Man könnte in option.value zwar den jeweiligen DB-Feldnamen direkt hinterlegen, aber aus Sicherheitsgründen verwenden wir nur eine Nummer: es geht den Benutzer nichts an, wie die Feldnamen in der Datenbank wirklich heißen!
Das empfangende Skript (hier: liste.php) wertet dann die Eingaben aus:
Php Einleitung
$fshow = array("", "Vorname", "Nachname", "Personalnummer"); // Anzeigenamen d. Felder
if ($fnr = intval($_POST['fnr'])) {
$search = str_replace("'", "´", trim($_POST['search']));
switch ($fnr) { //---- DB-Feldname u. Operator bestimmen
case 1: $fnam = "Vorname"; $op = 1; break;
case 2: $fnam = "Nachname"; $op = 1; break;
case 3: $fnam = "PersNr"; $op = 2; break;
default: "Ungültige FeldNr"; exit; // Fehler
}
switch ($op) { //---- Bedingung formulieren
case 1: $srch = " LIKE '%". $search ."%'"; break; // Text-Muster
case 2: $srch = "=". ($search = intval($search)); break; // numerische Idendität
}
$query = "SELECT * FROM benutzer WHERE ". $fnam . $srch; // Query bauen
$total = mysql_num_rows($result = mysql_query($query)); // Anzahl Treffer
} else { echo "Falscher Aufruf"; exit; } // Fehler
Weiter unten, im BODY:
<?php //---- Resultat der Suche anzeigen
echo "Suchergebnis ('";
switch ($op) {
case 1: echo htmlentities($search), "' in "; break; // Text-Muster
case 2: echo $search, "' als "; break; // numerische Idendität
}
echo $fshow[$fnr], "): ", ($total? $total: "keine"), " Benutzer gefunden.";
if ($total) { ?>
<!---- hier Liste anzeigen, evtl. als Tabelle ---->
<?php } ?>
Im switch($fnr)-Block ermitteln wir neben dem DB-Feldnamen auch den Operator, weil in diesem Beispiel 2 Vergleichsarten möglich sind:
- LIKE '%...%' (Text: enthält) bei Vorname und Nachname
- = (ist gleich) bei PersNr
Weitere denkbare Varianten wären:
- LIKE '...%' (Text: beginnt mit)
- LIKE '%...' (Text: endet mit)
- RLIKE '...' (Text: regulären Ausdruck anwenden)
- SOUNDEX(<feldname>)='soundex(...)' (Text: Ähnlichkeitssuche)
- >, >=, <, <= (Zahlen: math. Vergleiche)
- (<feldname>), (!<feldname>), (<feldname> & <maske>) (Bool/Zahl/Bit: Wahrheitswert ermitteln)
Im switch($op)-Block wird dann die Bedingung je nach Operatorsyntax passend formatiert.
template |
|