Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 1 - Daten abfragen

1. Die Abschnitte

2. Die Aufgabe

Wenn ihr jetzt die index.php aufruft und keine Fehlermeldung kommt, so habt ihr eine Verbindung zu eurer Datenbank. Kommen wir zu den Abfragen. Als erstes wollen wir uns eine Überblicksliste ausgeben lassen, also bei der Tabelle hersteller die Spalte zulieferer, bei kunde den doktor und bei produkt das produkt. Das Prinzip ist also immer das Selbe, nur die Abfrage ist anders. Als erstes definieren wir also unsere SQL-Abfrage abhängig vom übergebenen GET-Wert.

3. Die Bedingung

Aus Gründen der Sicherheit wollen wir uns aber nicht so einfach auf diesen Wert verlassen, da er spielend leicht von bösen Zeitgenossen verändert werden kann. Daher definieren wir dafür eine Bedingung. Tragt in der index.php unterhalb des require-Befehls das hier ein.


if ($_GET['tabelle'])
{
  switch ($_GET['tabelle'])
  {
    case 'hersteller'$table 'hersteller';
                       $field 'zulieferer';
                       break;
    case 'produkte'  $table 'produkt';
                       $field 'produkt';
                       break;
    case 'kunden'    $table 'kunde';
                       $field 'doktor';
                       break;
    default          : die ('Manipulationsversuch!');
  }
}

Erläuterung

if ($_GET['tabelle']) verhindert, dass uns direkt zu Beginn ein "Manipulationsversuch" um die Ohren gehauen wird, wenn noch kein GET-Parameter vorhanden ist. Beim Rest müsst ihr eigentlich nur auf zwei Dingen achten. Jeder case-Block muss mit einem break beendet werden. Und man sollte in so einem Fall immer einen Standardwert per default setzen, damit man bei Parameter-Manipulationen darauf reagieren kann. Ändert den Wert des GET-Parameters mal spaßeshalber zu tabelle=blubb.

Damit haben wir nun zwei Variablen, eine für die gewünschte Tabelle, eine für die entsprechende Spalte. Und daraus basteln wir uns eine Abfrage. Alle weiteren Anweisungen werden also unterhalb des switch-Blockes aber innerhalb der if-Bedingung geschrieben!

4. Die Abfrage


$query 'SELECT 
            id, '.
            $field.' AS list 
          FROM '.
            $table;

Den Wert von id benötigen wir später. Interessant ist eigentlich nur die Benutzung von AS. Da wir immer nur eine Spalte aus der jeweiligen Datenbank benötigen, definieren wir einen so genannten "Alias" für die Ausgabe der Inhalte. Das Prinzip werdet ihr verstehen, wenn wir die Daten auswerten.

Wahrscheinlich fragen sich einige unter euch, warum macht der das nicht einfacher und benutzt Anführungszeichen. Da braucht man diesen Punkt als Verknüpfungsoperator doch nicht. Nun dazu habe ich mich schon Eingangs unter Punkt 8 geäußert. Aber keine Angst, es wird noch schlimmer.

5. Anfrage senden und verarbeiten


$result mysql_query ($query) or die (mysql_error());
while ($row mysql_fetch_assoc ($result))
{
  $list[] = $row;
}

Erläuterung

Mit $result = mysql_query ($query) or die (mysql_error()); schicken wir die Anfrage an die Datenbank. Da die Anzahl der zu erwartenden Einträge nicht bekannt ist, brauchen wir eine while-Schleife, die uns häppchenweise jeden einzelnen Eintrag liefert. Dazu weisen wir der Variablen $row den assoziativen Wert des Ergebnisses zu, das heißt, dass $row ein assoziatives Array ist mit den Indizes id und list. Aus didaktischen Gründen schreiben wir das Ganze in ein Array namens $list.

Falls jemand hier nicht mitkommt, so setze er/sie doch bitte hinter der while-Schleife mal ein print_r($list). Da könnt ihr schon wunderbar das Ergebnis sehen.

Aber!

Warum wird denn hinter mysql_fetch_assoc ($result) kein or die (mysql_error()) gesetzt? Ganz einfach. Weil es keinen gibt. Denn den Query setzen wir mit mysql_query ab. Und das or die (mysql_error()) greift bei einem Syntaxfehler bereits hier. Wenn es trotzdem keine Ergebnisse gibt, so hat das andere Ursachen. Aber das kennt ihr ja schon von hier.

6. Ergebnis ausgeben

Da die Ausgabe bei allen Tabellen identisch ist, schreiben wir uns eine Funktion in der inc/functions.inc.php namens showList, die das übernimmt. Als erstes tragt ihr in der index.php unter der while-Schleife Folgendes ein.


include ('inc/functions.inc.php');
$code '<div class="ausgabe">
          <h1>'.ucfirst($_GET['tabelle']).'</h1>';
$code .= showList ($list);
$code .= '</div>';
echo $code;

Erläuterung

Diesmal binden wir mit include die PHP-Datei mit unserer Ausgabefunktion ein. Anschließend bauen wir eine so genannte Zeichenkettenverknüpfung ein, die nackten HTML-Code enthält plus der Ausgabe unserer Daten. Die rufen wir mit $code .= showList ($list); auf und übergeben dabei den Parameter $list (also das Ergebnis unserer Datenbankanfrage) und echo gibt am Ende das Resultat im Browser aus. Ach ja, das ucfirst($_GET['tabelle']) übernimmt den GET-Wert aus der Navigation und schreibt den ersten Buchstaben groß, also eine pisselige Überschrift.

Die Schreibweise $code .= bedeutet einfach gesagt, nimm den Inhalt der Variable $code und füge den folgenden Inhalt hinten dran. Ist kein schönes Deutsch, aber so kann ich mir sicher sein, dass mich mehr von euch verstehen.

7. Die Funktion showList

Als nächstes muss die Funktion (inc/functions.inc.php) definiert werden. Das geschieht so:


function showList ($list)
{

}

Innerhalb der geschweiften Klammern benötigen wir nur folgenden Code:


for ($i 0$i count ($list); $i++)
{
  $ausgabe .= '<p>'.$list[$i]['list'].'</p>';
}
return $ausgabe;

Erläuterung

Hach, das ist ja pisselig! Stimmt, mit diesen wenigen Zeilen bekommt ihr die komplette Ausgabe der gewünschten Daten. Die Schleife ist ganz einfach zu erklären. Mit while ($row = mysql_fetch_assoc ($result)) in der index.php haben wir ein mehrdimensionales Array erzeugt. Jeder Datensatz (also id und list -> siehe $query) wird dabei automatisch durchnummeriert, und zwar beginnend bei 0 -> $i = 0.

$i < count ($list) bestimmt die Bedingung der Schleife. Also solange $i kleiner ist als die Größe (count) des Arrays, wird die Schleife weiter bearbeitet. Dadurch, dass das erste Element eines numerischen Arrays immer den Wert 0 hat, gilt, dass die Größe eines Arrays immer um den Wert 1 höher ist, als der letzte numerische Index. $i++ erhöht ganz einfach immer diese Variable um 1 und ist nur eine verkürzte Schreibweise von $i = $i + 1;.

$ausgabe .= '<p>'.$list[$i]['list'].'</p>'; ist auch sehr einfach zu erklären. $list besteht aus einer bestimmten Menge von Einträgen, die zu einer Zeichenkette verknüpft werden. Und diesen String geben wir mit return zurück. Das heißt, sie steht ab sofort zur Verfügung und zwar hier: $code .= showList ($list);.

Hinweis

Die Ausgabe mit print_r ($list) ergibt zum Beispiel bei den Herstellern folgendes Ergebnis.


[0] => Array
(
  [id] => 1
  [list] => Hilti
)
[1] => Array
(
  [id] => 2
  [list] => Hoch Tief
)
[2] => Array
(
  [id] => 3
  [list] => Eisen-Karl
)
[3] => Array
(
  [id] => 4
  [list] => Stahl AG
)

$list[$i] greift auf das Element mit dem numerischen Index $i zu, also 0 bis 3. Der zusätzliche Index ['list'] gibt den Wert des assoziativen Arrays 'list' aus.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt