Einleitung: „Dein Logo funktioniert nicht, und die Datenbank weint“
\n\nWenn du jemals ein PHP-Skript geschrieben hast, das mit MySQL arbeitet, bist du bestimmt über diesen erschreckenden Satz gestolpert:
\nWarning: mysql_fetch_array() expects parameter 1 to be resource, boolean given.
Lass uns gleich klarstellen: Das ist nicht das Ende der Welt. Es ist nur ein Signal von PHP: „Hey, ich kann keine Daten aus dem Ding holen, das du mir gegeben hast!“.
\n\nIn diesem Tutorial schauen wir uns an, warum der Fehler mysql_fetch_array() expects parameter 1 to be resource auftritt, wie du ihn behebst – und vor allem: wie du ihn für immer vermeidest (Spoiler: Umstieg auf PDO oder MySQLi).
Dieser Artikel wurde speziell für pythonlib.ru geschrieben – ein Bildungsportal, auf dem wir dir beibringen, Code ohne Schmerzen zu schreiben. Los geht's!
\n\nWarum schreit PHP den Parameter an? (Ursachen)
\n\nUm die Ursache zu verstehen, erinnern wir uns daran, wie die alten mysql_*-Funktionen arbeiten (ja, die, die bereits in PHP 5.5 veraltet sind).
Ein typischer Anfänger-Code sieht so aus:
\n// Verbindung\n$link = mysql_connect('localhost', 'benutzer', 'passwort');\nmysql_select_db('test');\n\n// Abfrage (mit Fehler)\n$result = mysql_query(\"SELECT * FROM users WHERE id = '1\");\n\n// Versuch zu lesen\nwhile($row = mysql_fetch_array($result)) { // Fehler!\n echo $row['name'];\n}\n\nWas ist hier falsch? Alles! Aber das Wichtigste: mysql_query() hat false zurückgegeben, nicht resource. Warum?
- \n
- Syntaxfehler im SQL – das Anführungszeichen ist nicht geschlossen. \n
- Keine Verbindung zur Datenbank –
mysql_connect()hat false zurückgegeben. \n - Keine Datenbank ausgewählt –
mysql_select_db()hat nicht funktioniert. \n - Tabelle existiert nicht. \n
Wenn mysql_query() fehlschlägt, gibt es false (boolean) zurück, nicht resource. Du versuchst dann, false an mysql_fetch_array() zu übergeben, die aber resource erwartet. Konflikt! Daher der Fehler.
Welche Funktionen sind betroffen?
\n- \n
mysql_fetch_array()\n mysql_fetch_assoc()\n mysql_fetch_row()\n mysql_num_rows()\n mysql_data_seek()\n
Sie alle schreien dasselbe: „expects parameter 1 to be resource“.
\n\nSchritt-für-Schritt-Lösung (für alten Code)
\n\nWenn du ein Legacy-Projekt hast und PHP noch nicht aktualisieren kannst (obwohl ich es sehr empfehle), zeige ich dir, wie du den Fehler abfängst und behebst.
\n\nSchritt 1: Verbindung prüfen
\n$link = mysql_connect('localhost', 'benutzer', 'passwort');\nif (!$link) {\n die('Verbindungsfehler: ' . mysql_error());\n}\n\nSchritt 2: Datenbankauswahl prüfen
\nif (!mysql_select_db('meine_datenbank')) {\n die('Datenbank konnte nicht ausgewählt werden: ' . mysql_error());\n}\n\nSchritt 3: Abfrage mit Prüfung durchführen
\n$sql = \"SELECT * FROM users WHERE id = 1\";\n$result = mysql_query($sql);\n\nif (!$result) {\n die('Abfragefehler: ' . mysql_error());\n}\n\n// Jetzt kannst du sicher verwenden\nwhile($row = mysql_fetch_assoc($result)) {\n echo $row['name'];\n}\n\nSiehst du den Unterschied? Wir prüfen jeden Schritt. Wenn mysql_query() false zurückgibt – sterben wir mit einer Fehlermeldung, anstatt false weiterzugeben.
Warum funktioniert das immer noch? (Historischer Kontext)
\n\nAuf Stack Overflow hat diese Frage tausende Aufrufe. Kein Wunder: Viele Hosting-Anbieter laufen noch mit PHP 5.x, und unzählige Tutorials (sogar auf YouTube) lehren noch mit mysql_*.
Aber merke dir ein für alle Mal: Die mysql-Erweiterung ist veraltet und wurde aus PHP 7.0 entfernt. Wenn du neuen Code schreibst – verwende mysqli oder PDO.