mysql_fetch_array() Fehler: Parameter 1 muss resource sein – Lösung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: „Dein Logo funktioniert nicht, und die Datenbank weint“

\n\n

Wenn 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.

\n\n

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\n

In 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).

\n\n

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\n

Warum schreit PHP den Parameter an? (Ursachen)

\n\n

Um die Ursache zu verstehen, erinnern wir uns daran, wie die alten mysql_*-Funktionen arbeiten (ja, die, die bereits in PHP 5.5 veraltet sind).

\n\n

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\n

Was ist hier falsch? Alles! Aber das Wichtigste: mysql_query() hat false zurückgegeben, nicht resource. Warum?

\n\n
    \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
\n\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.

\n\n

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
\n\n

Sie alle schreien dasselbe: „expects parameter 1 to be resource“.

\n\n

Schritt-für-Schritt-Lösung (für alten Code)

\n\n

Wenn 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\n

Schritt 1: Verbindung prüfen

\n
$link = mysql_connect('localhost', 'benutzer', 'passwort');\nif (!$link) {\n    die('Verbindungsfehler: ' . mysql_error());\n}
\n\n

Schritt 2: Datenbankauswahl prüfen

\n
if (!mysql_select_db('meine_datenbank')) {\n    die('Datenbank konnte nicht ausgewählt werden: ' . mysql_error());\n}
\n\n

Schritt 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\n

Siehst du den Unterschied? Wir prüfen jeden Schritt. Wenn mysql_query() false zurückgibt – sterben wir mit einer Fehlermeldung, anstatt false weiterzugeben.

\n\n

Warum funktioniert das immer noch? (Historischer Kontext)

\n\n

Auf 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_*.

\n\n

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.

Blogs

Buchempfehlungen