PHP mysql_fetch_assoc bzw. array

vom 12.05.2011, 21:21 Uhr

Ich mache geschäftlich viel mit der Programmiersprache PHP und Datenbankverbindungen, also MySQL. Mein Problem ist das ich nie weiß, wann ich nach einer MySQL Abfrage das Ergebnis mit der PHP Funktion mysql_fetch_assoc oder mit der Funktion mysql_fetch_array erhalte. Ich weiß was ein Array ist. Ich dachte sobald ich mehrere Spalten und Zeilen abfrage, erhalte ich ein Array zurück, also benutze ich mysql_fetch_array. Nur blöder weiße gibt er mir dann immer einfach nur eine Resource ID aus. Bei mysql_fetch_assoc gibt er mir auch öfters eine Resource ID aus, jedoch meistens einfach nur "array".

Hier mal ein Beispiel zu meinem Script:
$query = mysql_query("SELECT * FROM a WHERE 1=1");
while($row = mysql_fetch_array($query)){ echo $row[1]; }
Kann mir jemand den Fehler sagen und am besten erklären wann ich was zu verwenden habe?

Benutzeravatar

» hennessy221 » Beiträge: 5132 » Talkpoints: -1,94 » Auszeichnung für 5000 Beiträge



Es gibt ja eigentlich drei Funktionen um eine einzelne Ergebnis-Zeile des SQL-Queries abrufen zu können. Diese sind mysql_fetch_assoc(), mysql_fetch_array() und mysql_fetch_row(). Den Unterschied zwischen den drei werde ich dir an einem kurzen Beispiel mal erklären.

Angenommen wir haben die folgende SQL-Tabelle und das darauf folgende Query beziehungsweise den PHP-Code:

Code: Alles auswählen
userid | name               | email
----------------------------------------
1          | Reaper            | irgendwas@irgendwo.com
2          | hennessy221 | keine@ahnu.ng


$db_conn = mysql_connect($hostname, $username, $password) or die ("(" . mysql_error() . ") " . mysql_error());
mysql_select_db($database) or die("(" . mysql_error() . ") " . mysql_error());
$sql_qry = "SELECT  * FROM tabelle WHERE userid=1";
$sql_res = mysql_query($sql_qry, $db_conn);
while($row = mysql_fetch_array($sql_res)) {
    ...
}


Daraus erstellen die drei Funktionen nun drei verschiedene Arrays.

mysql_fetch_row()
Code: Alles auswählen
Array
(
  [0] => 1
  [1] => Reaper
  [2] => irgendwas@irgendwo.com
)


mysql_fetch_assoc()
Code: Alles auswählen
Array
(
  [userid] => 1
  [name] => Reaper
  [email] => irgendwas@irgendwo.com
)


mysql_fetch_array()
Code: Alles auswählen
Array
(
  [0] => 1
  [userid] => 1
  [1] => Reaper
  [name] => Reaper
  [2] => irgendwas@irgendwo.com
  [email] => irgendwas@irgendwo.com
)


Nun kannst du natürlich leicht erkennen, dass mysql_fetch_row() immer einen indizierten Array liefert, dessen Inhalte immer beim Index 0 beginnen. Diese Funktion besitzt allerdings die Schwachstelle, dass sich Änderungen am Query oder an der SQL-Tabelle sofort auf die Indexwerte auswirken. Wo die Mailadresse nach dem originalen SQL-Query noch $row[2] war, ändert sich das beispielsweise zu $row[1], wenn man als Query "SELECT name, email FROM tabelle" verwendet. Derselbe Fall tritt ein, wenn man die Tabelle bearbeitet und vor der Spalte "email" ein weiteres Feld einfügt oder entfernt.

Einen assoziativen Array erhältst du mit mysql_fetch_assoc(), dabei werden die Spaltennamen der MySQL-Tabelle als Array-Indizes verwendet. $row["userid"] bleibt also IMMER gleich, solange man nichts an der Tabelle selbst verändert! Man sollte bei dieser Wahl aber auf jeden Fall darauf Acht geben, dass man keine Spaltennamen als Alias oder doppelte Aliases verwendet. Denn aus "SELECT name, email as name FROM tabelle" erhält man $row["name"] NUR EINMAL und als Inhalt wird in diesem Fall die EMail-Adresse zurückgegeben, generell immer der zuletzt zugewiesene Wert im Query. Bei einem so einfachen Query oder mit SELECT * ist das natürlich irrelevant, aber wenn du bei komplizierteren Queries mit Aliases arbeitest, ist das unbedingt zu beachten.

Hinter mysql_fetch_array() steckt mehr als nur eine Kombination der beiden anderen Alternativen. Man kann mit dieser Funktion unter der Verwendung von zwei Konstanten auch die Ergebnisse der anderen Funktionen erhalten: mysql_fetch_array($sql_res, MYSQL_NUM) beziehungsweise MYSQL_BOTH und MYSQL_ASSOC.


Schlussendlich sind die anderen beiden Funktionen eigentlich überflüssig, weil mit mysql_fetch_array() dank einem zweiten Parameter und den drei Konstanten dasselbe zu erreichen ist. Wofür man sich schließlich entscheidet ist aber egal, weil es auch keinen signifikanten Geschwindigkeitsunterschied gibt.

Ich würde dir aber auf jeden Fall raten, dass du mit assoziativen Arrays arbeitest, weil der Umgang damit wesentlich robuster ist (man muss nicht sofort das PHP-Script bearbeiten wenn man Änderungen an der Datenbank vornimmt). Dazu kommt auch noch, dass man $row["email"] im Code wesentlich besser verstehen kann als $row[2].

Benutzeravatar

» Reaper » Beiträge: 576 » Talkpoints: 1,11 » Auszeichnung für 500 Beiträge


Ähnliche Themen

Weitere interessante Themen

^