PHP/Datensätze lesen

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

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);
?>

<html> <select name="vorname" size=1> <option value="Joerg">Joerg</option> <option value="Alexander">Alexander</option> <option value="Christian">Christian</option> <option value="Peter">Peter</option> <option value="Georg">Georg</option> <option value="Georg">Georg</option> <option value="Peter">Peter</option> <option value="Sissi">Sissi</option> <option value="Dan">Dan</option> <option value="Frank">Frank</option> <option value="Bernd">Bernd</option> <option value="Klaus">Klaus</option> <option value="Frank">Frank</option> <option value="Herbert">Herbert</option> </select> <select name="nachname" size=1> <option value="Krause">Krause</option> <option value="Hopstein">Hopstein</option> <option value="Dannegger">Dannegger</option> <option value="Schatton">Schatton</option> <option value="Borgmann">Borgmann</option> <option value="Jakob">Jakob</option> <option value="Fernau">Fernau</option> <option value="Gaub">Gaub</option> <option value="Kallola">Kallola</option> <option value="Eisenmenger">Eisenmenger</option> <option value="Meissner">Meissner</option> <option value="Meene">Meene</option> <option value="Neumeier">Neumeier</option> <option value="Nebel">Nebel</option> </select> <select name="firma" size=4> <option value=""></option> <option value="Conga Communications">Conga Communications</option> <option value="Living-Systems">Living-Systems</option> <option value="Euro Event">Euro Event</option> <option value="Euro Event">Euro Event</option> <option value="Compuserve">Compuserve</option> <option value="e-com AG">e-com AG</option> <option value="e-com AG">e-com AG</option> <option value="e-com AG">e-com AG</option> <option value="CIB">CIB</option> <option value="Openshop Holding AG">Openshop Holding AG</option> <option value="Living-Systems">Living-Systems</option> <option value="Ziff Davis Verlag">Ziff Davis Verlag</option> <option value=""></option> </select> </html>

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");
}
?>