PHP/MySQL - Praxistutorial 1 - Daten abfragen
1. Die Abschnitte
- Überblick
- Die Datenbank
- Grundsätzliches
- Daten abfragen
- Daten eingeben
- Daten ändern
- Daten löschen
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