PHP/Datensätze lesen
Aus Mikiwiki
Inhaltsverzeichnis |
Datensätze lesen
Die Musterdatenbank "php5test" enthält nach der ersten Installation 13 Datensätze. Eine Abfrage aller Datensätze der Tabelle "address" erfolgt mit folgendem PHP-Code:
|
$result = mysql_query("SELECT * FROM address", $connection); |
Als Ergebnis wird ein Zeiger auf eine Ergebnisliste (engl. result set) zurückgegeben. Dieser Zeiger kann genutzt werden, um auf einzelne Datensätze zuzugreifen pder andere Funktionen anzusteuern. Die Anzahl der Datensätze kann mit folgendem PHP-Code ermittelt werden:
|
$number = mysql_num_rows($result); |
Das folgende Skript "mysql_numrows.php" zeigt die Anwendung dieser beiden Funktionen.
|
<?php ## Name mysql_numrows.php include("open.inc.php"); $sql = "SELECT * FROM address"; $result = mysql_query($sql, $connection); if ($result) { $number = mysql_num_rows($result); echo "<p>Es wurden $number Datensätze gelesen.</p>\n"; echo "<p>Abfrage: <tt>$sql</tt></p>\n"; } else { echo "<p>" . mysql_error($connection) . "</p>\n"; } mysql_close($connection); ?> |
Das folgende Skript "mysql_fetcharray_1.php" zeigt, wie die Ergebnisliste mittels einer Schleife abgefragt und die Datensätze angezeigt werden können. Dabei überführt die Funktion "mysql_fetch_array" die Ergebnisliste in ein Array, wobei zwei Parameter angegeben werden:
- "$result" ist der Zeiger auf die Ergebnisliste.
- "MYSQL_ASSOC" ist eine Konstante, welche die Art des Arrays bestimmt.
Alternativ könnte auch die Funktion "mysql_fetch_assoc" verwendet werden. Die Funktion entspricht der Funktion "mysql_fetch_array" mit dem zusätzlichen Parameter "MYSQL_ASSOC".
Mit der Funktion "implode" wird das Array in eine Zeichenkette verwandelt, deren Trennzeichen gleich die Tabellenzellen bilden.
|
<?php ## Name mysql_fetcharray_1.php include("open.inc.php"); $sql = "SELECT * FROM address"; $result = mysql_query($sql, $connection); echo "<p>Abfrage: <tt>$sql</tt></p>\n"; if ($result) { $number = mysql_num_rows($result); echo "<p>Es wurden $number Datensätze gelesen.</p>\n"; echo "<table border=1>\n"; while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<tr>\n<td>"; echo implode("</td>\n<td>", $row); echo "</td>\n</tr>\n"; } echo "</table></p>\n"; } else { echo "<p>" . mysql_error($connection) . "</p>\n"; } mysql_close($connection); ?> |
Das folgende Skript "mysql_fetcharray_2.php" liest zusätzlich die Feldnamen aus und zeigt sie im Kopf der Tabelle an. Dabei greift die Schleife nicht direkt auf die Elemente zurück, sondern auf die Indizes, da es sich um ein assoziatives Array handelt. Dazu wird die Funktion "key" verwendet. Mit "next" wird jeweils der interne Zeiger des Arrays verschoben.
|
<?php ## Name mysql_fetcharray_2.php include("open.inc.php"); $sql = "SELECT * FROM address"; $result = mysql_query($sql, $connection); echo "<p>Abfrage: <tt>$sql</tt></p>\n"; if ($result) { $number = mysql_num_rows($result); echo "<p>Es wurden $number Datensätze gelesen.</p>\n"; echo "<p><table border=1>\n<tr>\n"; $row = mysql_fetch_array($result, MYSQL_ASSOC); ## Ausgabe des Tabellenkopfs while ($field = key($row)) { echo "<th>" . ucwords($field) . "</th>\n"; next($row); } echo "</tr>\n<tr>\n<td>"; echo implode("</td>\n<td>", $row); echo "</td>\n</tr>\n"; ## Ausgabe der Tabelleninhalte while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<tr>\n<td>"; echo implode("</td>\n<td>", $row); echo "</td>\n</tr>\n"; } echo "</table></p>\n"; } else { echo "<p>" . mysql_error($connection) . "</p>\n"; } mysql_close($connection); ?> |
Tabellen anzeigen
Die folgende Anwendung zeigt eine Tabelle aus einer Mysql-Datenbank an und erlaubt durch Anklicken von "+"- bzw. "-"-Zeichen in der Titelleiste das Sortieren der Spalte. Der Zugriff auf die Datenbank wird wiederum über das Skript "open.inc.php" realisiert.
|
<style> a { text-decoration:none} </style> <?php include("open.inc.php"); $db = "php5test"; @mysql_select_db ($db) or die ("Kann Datenbank nicht finden"); $sort = isset($_GET['sort']) ? $_GET['sort'] : ""; $dir = isset($_GET['dir']) ? $_GET['dir'] : "ASC"; if($sort == "") { ## Unsortierte Ausgabe $strQuery = "SELECT * FROM address"; } else { ## Sortierte Ausgabe $strQuery = "SELECT * FROM address ORDER BY $sort $dir"; } $result = mysql_query($strQuery, $connection); echo "<table border=\"1\">\n<tr>\n"; ## Abfrage der Feldnamen zum automatischen Erstellen der Kopfzeile while($field = mysql_fetch_field($result)) { ## Erzeugen der Links zum Sortieren echo <<<TABLE <th nowrap class="small"> <a href="{$_SERVER['PHP_SELF']}?sort={$field->name}&dir=ASC">+</a> $field->name <a href="{$_SERVER['PHP_SELF']}?sort={$field->name}&dir=DESC">-</a> </th>\n TABLE; } echo "</tr>\n"; ## Abrufen der Datensätze while($row = mysql_fetch_array($result)) { echo "<tr>\n"; ## Abruf und Anzeige aller Datensätze for($i = 0; $i < mysql_num_fields($result); $i++) { echo "<td class=small>$row[$i]</td>\n"; } echo "</tr>\n"; } echo "</table>\n"; ?> |
Eine SELECT-Liste aus Mysql erstellen
Das folgende Skript liest Werte aus einer Mysql-Tabelle und erzeugt damit ein "<select>"-Tag. Diese Aufgabe wird von der Funktion "buildselect" erledigt, der übrige Teil des Skripts dient der Demonstration. Die Funktion erzeugt die Liste auf der Grundlage eines Ergebnis-Handles einer Datenbankabfrage. Das eigentliche Formular mit Absendeschaltfläche ist im Beispiel nicht enthalten - solche Listen sind natürlich nur in Formularen sinnvoll einsetzbar.
|
<?php function buildselect($result, $field, $name, $multiple = "", $size = 1) { ## Übergabe der Tag-Eigenschaften, wobei die Parameter "$multiple" und ## "$size" optional sind. echo "<select $multiple name=\"$name\" size=$size>"; $i = 0; ## Abfrage der Inhalte while($row = mysql_fetch_assoc($result)) { ## Die Feldinhalte bilden sowohl den Inhalt ("value") als auch den ## Anzeigewert. echo "<option value=\"" . $row[$field] . "\">"; echo $row[$field]; echo "</option>\n"; } ## Zurücksetzen des Ergebnis-Handles zur Weiterverwendung. mysql_data_seek($result, 0); echo "</select>"; } include("open.inc.php"); $db = "php5test"; @mysql_select_db ($db) or die ("Kann Datenbank nicht finden"); $result = mysql_query("SELECT * FROM address", $connection); buildselect($result, "sname", "vorname"); buildselect($result, "fname", "nachname"); buildselect($result, "company", "firma", "", 4); ?> |
|
Erzeugen einer WHERE-Bedingung
Die folgende Funktion durchsucht eine Zeichenkette nach logischen Operatoren ("and", "or", "not") und erstellt daraus den WHERE-Teil einer SQL-Abfrage. Es darf auch nach Wortgruppen (z. B. "Sieben Brüder") gesucht werden. Damit lässt sich etwa eine Suchfunktion komfortabler gestalten.
|
<?php function b_parse($str, $field) { if ($str == "") { return ""; } ## Zerlegung von Wortgruppen $quoted = explode( "\\\"", $str); $begin = FALSE; $sql_out = ""; ## Schleife durchsucht die Zeichenkette nach alleinstehenden Wörtern for ($i = 0; $i < count($quoted); $i++) { ## Wortgruppen werden an den Anfang gestellt und übersprungen if ($i == 0 && !$quoted[$i]) { ## Anführungszeichen erzeugen, falls nicht vorhanden $begin = TRUE; $i++; } if ($begin) { $words[] = $quoted[$i]; } ## Alleinstehende Wörter werden durch Leerzeichen erkannt else { $phrase = explode( " ", $quoted[$i]); for ($n = 0; $n < count($phrase); $n++) { if ($phrase[$n]) { $words[] = $phrase[$n]; } } } $begin = !$begin; } ## Die nächste Schleife durchläuft alle Wörter einzeln for ($i = 0; $i < count($words); $i++) { if ($words[$i]) { ## Wird ein alleinstehendes. grossgeschriebenes Wort als logischer ## Operator erkannt, so erfolgt eine Sonderbehandlung. if ($words[$i] == "AND" || $words[$i] == "OR" || $words[$i] == "NOT") { ## Der Operator "NOT" wird in "AND NOT LIKE %suchwort%" umgewandelt, ## wobei "suchwort" das dem Operator folgende Wort ist. if ($words[$i] == "NOT") { $i++; if (strlen($sql_out) > 0) { $sql_out .= " AND "; } $sql_out .= $field . " NOT LIKE \"%" . $words[$i] . "%\""; } ## Ist der Operator nicht "NOT", so wird aus "and" "AND" und aus ## "or" "OR" gebildet und dem Ergebnis angehängt. elseif ($i > 0) { $sql_out .= " " . strtoupper($words[$i]) . " "; $boolean = True; } } ## Werden keine weiteren Operatoren gefunden, so wird eine "oder"- ## Verknüpfung angenommen und mit Hilfe von "LIKE" nach Wort- ## fragmenten gesucht. else { if ($sql_out && !$boolean) { $sql_out .= " OR "; } $sql_out .= $field . " LIKE \"%" . $words[$i] . "%\""; $boolean = FALSE; } } } return $sql_out; } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <table border=0> <tr> <td colspan=2> Geben Sie hier Suchwörter zum Testen ein. Verwenden Sie "AND", "OR" und "NOT" (jeweils grossgeschrieben) für Boolesche Ausdrücke. </td> </tr> <tr> <td><input type=text size=40 name=search value=""></td> <td><input type=submit value="Analyse starten"></td> </tr> </table> </form> <?php ## Zusammensetzen der SQL-Abfrage. if (isset($_POST['search'])) { echo "SELECT * FROM address WHERE <br />\n"; echo " " . b_parse($_POST['search'], "city") . "<br />\n"; echo " " . "OR" . "<br />\n"; echo " " . b_parse($_POST['search'], "name"); } ?> |
