quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2003/07/10 18:27:05

Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.

Tabellen in PHP auslesen

  1. Grundüberlegung
  2. Daten mit PHP aus MySQL auslesen
  3. Anzahl der Zeilen in der Resulttabelle

1. Grundüberlegung

Wir wissen dass wir mit mysql_query ein MySQL-Query senden können und das diese Funktion eine Resouce-ID zurückliefert. Mit dieser Resource-ID können wir dann arbeiten. Deswegen sollten wir diese Resource-ID auch in eine Variable speichern.

Wenn MySQL eine Resulttabelle erstellt, kann man sich vorstellen das MySQL dann ein Cursor für diese Resulttabelle erstellt. Diesen 'imaginären' Cursor setzt MySQL an den Anfang der Resulttabelle. Dies könnte man sie dann so vorstellen.

    +------------------+---------------------+
    | Titel            | Datum               |
    +------------------+---------------------+
--> | blabla           | 2002-12-16 21:13:44 |
    | Zweite News      | 2002-12-16 21:13:10 |
    | eingefügt        | 2002-12-16 21:13:00 |
    | Meine erste News | 2002-12-16 21:12:41 |
    +------------------+---------------------+
        

Dieser Pfeil soll jetzt diesen Cursor darstellen. In PHP haben wir dann die Möglichkeit die Werte dieser Zeile in ein Array zu laden. Der Arrayindex ist dann der Spaltenname und der Wert entspricht dann den Wert in dieser Spalte. Bei diesem Vorgang wird automatisch der Cursor eins weiter gesetzt.

    +------------------+---------------------+
    | Titel            | Datum               |
    +------------------+---------------------+  
    | blabla           | 2002-12-16 21:13:44 |
--> | Zweite News      | 2002-12-16 21:13:10 |
    | eingefügt        | 2002-12-16 21:13:00 |
    | Meine erste News | 2002-12-16 21:12:41 |
    +------------------+---------------------+
        

Dies geht dann immer so weiter. Wenn der Cursor beim letzen Eintrag steht und wieder die Daten ausgelesen werden, so steht der Cursor dann symbolisch außerhalb der Tabelle.

    +------------------+---------------------+
    | Titel            | Datum               |
    +------------------+---------------------+  
    | blabla           | 2002-12-16 21:13:44 |
    | Zweite News      | 2002-12-16 21:13:10 |
    | eingefügt        | 2002-12-16 21:13:00 |
    | Meine erste News | 2002-12-16 21:12:41 |
    +------------------+---------------------+
-->
        

Wenn wir dann versucht Daten auszulesen, erhalten wir kein Array sondern erhalten dann FALSE, also ideal für eine if-Abfrage.

2. Daten mit PHP aus MySQL auslesen

Die Funktion von der ich rede heißt mysql_fetch_assoc. Diese Funktion erwartet einen Parameter. Dieser Parameter ist die Resource-ID von mysql_query aus dessen MySQL-Query wir was auslesen wollen. Diese Funktion liefert ein Array zurück wo die Daten der aktuellen Zeile drinstehen, liefert FALSE zurück wenn der Cursor am Ende bzw. um genauer zu sein "unterhalb" der Tabelle ist oder diese Funktion erzeugt eine Fehlermeldung ala "supplied argument is not a valid MySQL result resource" weil man wieder das "OR die(mysql_error());" hinter mysql_query vergessen hat.

Die Abfrage mit mysql_fetch_assoc können wir am besten mit einer while-Schleife verwirklichen. Ein Beispielscript sieht dann so aus.

<?php
    error_reporting
(E_ALL);

    include
'inc/config.php';
    
// Konfigurationsdatei laden

    
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
    
mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());

    
$sql = "SELECT
                Titel,
                Datum
            FROM
                News
            ORDER BY
                Datum DESC;"
;
    
// Das am Anfang immer ein paar Leerzeichen stehen
    // ist für MySQL uninteressant.
    // Hier würde sich sogar die Heredoc schreibweise
    // eignen
    
    
$result = mysql_query($sql) OR die(mysql_error());
        
    echo
"News in der Datenbank:<br />\n";
    while(
$row = mysql_fetch_assoc($result)) {
        echo
$row['Datum']." &gt; ".$row['Titel']."<br />\n";
    }
?>

Das ist eigentlich schon alles. Die Funktion mysql_query führt den MySQL-Query aus. MySQL erstellt darauf hin intern einer Resulttabelle und setzt den 'Cursor' an den Anfang der Tabelle. Mit mysql_fetch_assoc holen wir dann jeden Eintrag raus. Gleichzeitig prüfen wir auch ob auch wirklich was ausgelesen wurde. Wenn er etwas auslesen konnte, so wird die while-Schleife durchlaufen. In der Schleife werden einfach nur die Daten ausgegeben. Wenn er nix auslesen konnte, weil der Cursor schon 'außerhalb' der Tabelle ist, so liefert mysql_fetch_assoc ja FALSE und die while-Schleife wird beendet.

3. Anzahl der Zeilen in der Resulttabelle

Manchmal möchte man wissen wieviele Zeilen in einem SELECT-Querys drinstehen. Dafür gibt es die Funktion mysql_num_rows. Dieser Funktion liefert die Anzahl der Zeilen in einem SELECT-Query zurück, von der man die Resource-ID übergeben muss. Diese Zahl ist immer gleich, egal wo der 'Cursor' der SELECT-Abfrage steht. Sowas wie...

while(mysql_num_rows($result))

...wird nicht gehen. In diesem Fall hätte man eine schöne Endlosschleife.

Mit dieser Funktion können wir prüfen ob überhaupt eine News in der Tabelle ist und entsprechend mit einer If-Abfrage darauf reagieren.

<?php
    error_reporting
(E_ALL);

    include
'inc/config.php';
    
// Konfigurationsdatei laden

    
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
    
mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());

    
$sql = "SELECT
                Titel,
                Datum
            FROM
                News
            ORDER BY
                Datum DESC;"
;

    
$result = mysql_query($sql) OR die(mysql_error());

    echo
"News in der Datenbank:<br />\n";
    if(
mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
        
while($row = mysql_fetch_assoc($result)) {
            echo
$row['Datum']." > ".$row['Titel']."<br />\n";
        }
    } else {
        echo
"Es sind keine News in der Datenbank vorhanden<br />\n";
    }
?>

In MySQL gibt es einen extra Befehl der sagt, wieviele Einträge in der SELECT-Abfrag vorhanden sind. Doch dieser Query ist erstmal nicht wichtig.

Fragen zum aktuellen Thema

  1. Wie lese ich die Daten aus der aktuellen Reihe aus?
Wie lese ich die Daten aus der aktuellen Reihe aus?

Mit der Funktion mysql_fetch_assoc kann man die Daten aus der aktuellen Reihe auslesen. Nach der Abarbeitung des Befehls wird dann der interne Cursor von der Resulttabelle um eins weiter nach unten Verschoben. Es ist nicht möglich, diesen Cursor wieder nach oben zu 'schieben'.

Nach oben