1002 Stimmen

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows usw... erwartet, dass Parameter 1 eine Ressource ist

Ich versuche, Daten aus einer MySQL-Tabelle auszuwählen, aber ich erhalte eine der folgenden Fehlermeldungen:

mysql_fetch_array() erwartet, dass Parameter 1 eine Ressource ist, die boolesch ist

Dies ist mein Code:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}

15 Stimmen

Sie können weitere nützliche eroor msg erhalten, indem Sie:: QUERY oder die(mysql_error());

124 Stimmen

Auch der obligatorische Hinweis: Ihr Code ist anfällig für SQL-Einschleusung . Sie sollten die Benutzereingaben validieren und/oder ausblenden. Werfen Sie einen Blick auf mysql_real_escape_string . Vertrauen Sie niemals auf Benutzerdaten.

7 Stimmen

Eigentlich wird der Code des OPs einen Syntaxfehler auf dem MySQL-Server verursachen, aber zumindest ist er pas anfällig für SQL Injection, da bei einfachen Anführungszeichen keine Variableninterpolation möglich ist.

680voto

Edward Dale Punkte 28689

Eine Anfrage kann aus verschiedenen Gründen fehlschlagen. In diesem Fall geben sowohl die mysql_*- als auch die mysqli-Erweiterung false aus ihren jeweiligen Abfragefunktionen/-methoden. Sie müssen auf diese Fehlerbedingung testen und sie entsprechend behandeln.

* mysql_ Erweiterung **:

ANMERKUNG Die mysql_-Funktionen sind veraltet und wurden in php Version 7 entfernt.

Siehe $result bevor Sie es an mysql_fetch_array . Sie werden feststellen, dass es false weil die Abfrage fehlgeschlagen ist. Siehe die [ mysql_query Dokumentation][1] zu möglichen Rückgabewerten und Vorschläge, wie man mit ihnen umgehen kann.

$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    trigger_error(mysql_error(), E_USER_ERROR);
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

9 Stimmen

Richtig, aber ein die() zu verwenden, wenn die Abfrage fehlschlägt, ist ein wenig zu viel.

30 Stimmen

Ich wollte eigentlich einen ganzen Mechanismus zur Fehlerbehandlung für den OP entwerfen, habe aber beschlossen, dass dies den Rahmen meiner Antwort sprengen würde.

0 Stimmen

@scompt.com Ja, das wird auch in mehreren anderen Antworten behandelt. Ich denke, ich wollte nur darauf hinweisen, dass es sich hier um die akzeptiert Antwort auf eine Frage mit großer Öffentlichkeitswirkung sollte (IMHO) neben den (ausgezeichneten) Ratschlägen, wie Fehler in Zukunft richtig erkannt werden können, auch die konkrete Frage beantworten (d.h. erklären warum in diesem Fall liegt ein Fehler vor).

164voto

John Conde Punkte 212467

Diese Fehlermeldung wird angezeigt, wenn Sie einen Fehler in Ihrer Abfrage haben, der sie zum Scheitern gebracht hat. Sie wird angezeigt, wenn Sie verwenden:

  • mysql_fetch_array / mysqli_fetch_array()
  • mysql_fetch_assoc() / mysqli_fetch_assoc()
  • mysql_num_rows() / mysqli_num_rows()

Hinweis : Dieser Fehler ist pas erscheinen, wenn keine Zeilen von Ihrer Abfrage betroffen sind. Nur eine Abfrage mit einer ungültigen Syntax erzeugt diesen Fehler.

Schritte zur Fehlersuche

  • Stellen Sie sicher, dass Ihr Entwicklungsserver so konfiguriert ist, dass alle Fehler angezeigt werden. Sie können dies tun, indem Sie dies an den Anfang Ihrer Dateien oder in Ihre Konfigurationsdatei setzen: error_reporting(-1); . Wenn Sie Syntaxfehler haben, werden Sie darauf hingewiesen.

  • 使用方法 mysql_error() . mysql_error() meldet alle Fehler, auf die MySQL bei der Ausführung Ihrer Abfrage gestoßen ist.

    Beispielhafte Verwendung:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • Führen Sie Ihre Abfrage über die MySQL-Befehlszeile oder ein Tool wie phpMyAdmin . Wenn Sie einen Syntaxfehler in Ihrer Abfrage haben, wird Ihnen dieser angezeigt.

  • Vergewissern Sie sich, dass Ihre Zitate korrekt sind. Ein fehlendes Anführungszeichen um die Abfrage oder einen Wert kann dazu führen, dass eine Abfrage fehlschlägt.

  • Vergewissern Sie sich, dass Sie Ihre Werte escapen. Anführungszeichen in Ihrer Abfrage können dazu führen, dass eine Abfrage fehlschlägt (und Sie außerdem anfällig für SQL-Injections sind). Verwenden Sie mysql_real_escape_string() um Ihrer Eingabe zu entgehen.

  • Achten Sie darauf, dass Sie nicht die mysqli_* y mysql_* Funktionen. Sie sind nicht dasselbe und können nicht zusammen verwendet werden. (Wenn Sie sich für das eine oder das andere entscheiden, bleiben Sie bei mysqli_* . Siehe unten, warum.)

Andere Tipps

mysql_* Funktionen sollten nicht für neuen Code verwendet werden. Sie werden nicht mehr gepflegt und die Gemeinschaft hat begonnen, die Abnutzungsprozess . Stattdessen sollten Sie lernen über vorbereitete Erklärungen und verwenden Sie entweder PDO o MySQLi . Wenn Sie sich nicht entscheiden können, dieser Artikel wird bei der Auswahl helfen. Wenn Sie lernen möchten, hier ist gutes PDO-Tutorial .

1 Stimmen

Angesichts dieser Frage heute stackoverflow.com/q/43804651/1415724 und andere ähnliche Fragen in letzter Zeit; ich denke, es könnte sich lohnen, Ihre Antwort zu aktualisieren und etwas wie _"Dieser Fehler kann auch dadurch verursacht werden, dass die Abfrage nicht mit mysql_query() / mysqli_query($connection) usw."_ ; Gedanken? Da keine anderen Antworten in dieser Frage und Antwort dies erwähnen.

113voto

nik Punkte 3668

Der hier aufgetretene Fehler ist auf die Verwendung von einfachen Anführungszeichen ( ' ). Sie können Ihre Anfrage wie folgt formulieren:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Es verwendet mysql_real_escape_string zur Verhinderung von SQL-Injection. Obwohl wir MySQLi oder die PDO_MYSQL-Erweiterung für aktualisierte PHP-Versionen (PHP 5.5.0 und höher) verwenden sollten, aber für ältere Versionen mysql_real_escape_string reicht aus.

5 Stimmen

Warum sollte man Rauschen mit String-Verkettung hinzufügen, anstatt die Variable einfach in den Abfrage-String zu setzen?

1 Stimmen

@Matteo Riva Ja, aber ich dachte, dies ist ein wenig sauberer Weg, um Variablen von Strings zu trennen :)

58voto

2ndkauboy Punkte 9136

Como scompt.de erklärt kann die Abfrage fehlschlagen. Verwenden Sie diesen Code, um den Fehler der Abfrage oder das richtige Ergebnis zu erhalten:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

Siehe die Dokumentation für mysql_query() für weitere Informationen.

Der eigentliche Fehler waren die einfachen Anführungszeichen, so dass die Variable $username wurde nicht geparst. Aber Sie sollten wirklich verwenden mysql_real_escape_string($username) um SQL-Injections zu vermeiden.

51voto

Matteo Riva Punkte 24224

Setzen Sie Anführungszeichen um $username . String-Werte müssen, im Gegensatz zu numerischen Werten, in Anführungszeichen gesetzt werden.

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

Es macht auch keinen Sinn, die Option LIKE Bedingung, wenn Sie keine Wildcards verwenden: Wenn Sie eine exakte Übereinstimmung benötigen, verwenden Sie = anstelle von LIKE .

2 Stimmen

Und was, wenn $username ist: " '; DROP TABLES;" ? Das ist der Vorteil der Verwendung von vorbereiteten Anweisungen und gebundenen Werten, den der Fragesteller meiner Meinung nach gerne beibehalten würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X