Peter Schulze: PHP und MySQL - umgang mit dem Array

Hallo,

eine weitere Anfängerfrage:

PHP und MySQL Verbindung und einfach Abfrage sieht ja z.B. so aus:

<?php
  $abfrage = "SELECT * FROM test";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis))
    {
    echo $row["name"];
    }
?>

Mir ist so halbwegs klar, dass $ergebniss den Rückgabewert der MySQL-DB beinhaltet und $row anscheinend immer nur ein Teil von $ergebniss. Aber was ist ein Array von den beiden?
Ich würde es mir so erklären:

$ergebniss =

1. Zeile, Spalte "Name" = "Peter", Spalte "Nachname" = "Schulze"
2. Zeile, Spalte "Name" = "Hans", Spalte "Nachname" = "Stein"

und $row wäre dann jeweils nur eine Zeile. D.h. $ergebniss wäre ein 2 diminsionales Array (z.B. $ergebniss[0, "Name"])und $row ein 1 diminsionales Array (z.B. $row["Name"]). RICHTIG SOWEIT?!?

Wie kann ich jetzt in erfahrung bringen wie viele Zeilen das Array $ergebniss hat? Versucht hab ich schon:

echo count($ergebnis); //gibt 1 zurück
echo array_count_values($ergebnis); //Gibt Fehlermeldung 'The argument should be an array' zurück - ist doch aber nen Arrray - oder?

und das selbe für $row:

$row = mysql_fetch_array($ergebnis); //damit $row belegt wird und die Werte aus $ergebniss beziehen kann
echo count($ergebnis); //gibt "14" aus - sind aber 5 Zeilen mit jeweils 6 Spalten - überall sind einträge...
echo array_count_values($ergebnis); //Gibt "Array" aus - will mich ärgern - oder?

1. Frage: Was ist $ergebniss - ist das ein Array oder eine Variable?
2. Frage: was ist $row - das ist doch immer nur die aktuelle Zeile, oder? Damit doch aber auch nen Array, oder doch nur Variable?
3. Frage: Welche Funktion wäre die richtige um die Anzahl der zu erwartenden Einträge anzuzeigen?

Ich danke Euch für Eure Hife schon mal im vorraus. Mein Problem ist, dass ich Anfänger im PHP bin und deshalb teilweise nicht mal weiß wonach ich suchen soll. Wenn einer ne gute Seite kennt - bitte immer her damit.

  1. Hello,

    PHP und MySQL Verbindung und einfach Abfrage sieht ja z.B. so aus:

    <?php
      $abfrage = "SELECT * FROM test";
      $ergebnis = mysql_query($abfrage);

    while($row = mysql_fetch_object($ergebnis))
        {

    #>     echo $row["name"];

    Nö!

    Entweder Objekt oder Array, aber bitte nicht mischen

    echo $row->name;

    }
    ?>

    oder

    $ergebnis = mysql_query($abfrage,$conn);

    if ($ergebnis)
       {
         while($row = mysql_fetch_assoc($ergebnis))
         {
           echo $row["name"];
         }
       }
       else
       {
         ## Fehlerbehandlung
       }

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. echo $begrüßung;

    $abfrage = "SELECT * FROM test";
      $ergebnis = mysql_query($abfrage);

    An dieser Stelle fehlt eine Prüfung. Wenn MySQL einen Fehler meldet, dann meldet es den still an PHP und die Funktion mysql_query() gibt false statt einer Ressourcenkennung zurück, was aber kein gültiges Argument für die mysql_fetch_*()-Funktionen ist und dann zu Folgefehlern führt.

    while($row = mysql_fetch_object($ergebnis))
    Mir ist so halbwegs klar, dass $ergebniss den Rückgabewert der MySQL-DB beinhaltet und $row anscheinend immer nur ein Teil von $ergebniss. Aber was ist ein Array von den beiden?

    $ergebnis enthält eine Ressourcenkennung. Das ist ein Verweis auf die PHP-interne Datenhaltung, in der die bei einer Query anfallenden Verwaltungsdaten abgelegt sind. Üblicherweise meldet eine Datenbank nur, dass sie mit der Abfrage fertig ist. Das Abholen der einzelnen Zeilen der Ergebnismenge geschieht zu Fuss mittels einer der Fetch-Funktionen, und zwar pro Fetch ein Zeile.

    mysql_query() erledigt zwar im Hintergrund das eigentliche Fetchen vom Datenbankserver und puffert das Ergebnis zwischen, trotzdem musst du als Anwender die Fetch-Funktionen aufrufen, um die einzelnen Zeilen zu erhalten. Als Vorteil des automatischen Hintergrund-Fetchens kann PHP dem Anwender Funktionen wie mysql_num_rows() zur Verfügung stellen, mit der die Anzahl der Zeilen der Ergebnismenge abgefragt werden kann.

    Braucht man nur diese Anzahl, siehst du, dass es ziemlich uneffektiv ist, wenn PHP die Datensätze erst antreten lässt. Stattdessen sollte man gleich den Server mit der Zählung via COUNT(*) beauftragen.

    1. Frage: was ist $row - das ist doch immer nur die aktuelle Zeile, oder? Damit doch aber auch nen Array, oder doch nur Variable?

    Ein Array ist auch nur eine Variable[1], wenn auch eine Spezialform davon. Was genau sich in einer Variable befindet, erfährst du mit der Funktion var_dump(). (Bei nicht-skalaren Variablen, wie es Arrays und Objekte sind, empfiehlt es sich, der besseren Übersicht halber der Ausgabe ein <pre> voranzustellen.)

    Ich danke Euch für Eure Hife schon mal im vorraus. Mein Problem ist, dass ich Anfänger im PHP bin und deshalb teilweise nicht mal weiß wonach ich suchen soll. Wenn einer ne gute Seite kennt - bitte immer her damit.

    Das PHP-Handbuch bietet zu den Funktionen neben einer Beschreibung meist auch Anwendungsbeispiele und Verweise zu anderen Funktionen an. Auch die Userkommentare der Online-Ausgabe sind immer wieder einen Blick wert, wenn auch gelegentlich einen kritischen. Ebenfalls ist es hilfreich, sich die Übersicht der Funktionen im aktuellen Anwendungsbereich (hier also die MySQL-Funktionen) anzusehen. So findet man nicht nur die gesuchte Funktion, sondern sieht nebenbei auch noch, was es außerdem noch gibt, und erinnert sich vielleicht beim nächsten Problem daran.

    [1] Diese Aussage ist zwar nicht ganz exakt, aber ich formuliere sie an obiger Stelle mal trotzdem so. Exakterweise muss ein Wert - ob skalar oder nicht - ja nicht zwingend in einer Variable abgelegt sein.

    echo "$verabschiedung $name";