Frage mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows etc ... erwartet, dass Parameter 1 die Ressource ist


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

mysql_fetch_array () erwartet, dass Parameter 1 resource, boolean ist

oder

mysqli_fetch_array () erwartet Parameter 1 als mysqli_result, boolean gegeben

oder

Aufruf einer Memberfunktion fetch_array () für boolean / non-object

Das 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'];
}

Gleiches gilt für Code wie

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

und

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

und

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

und

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

und

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);

864
2018-06-04 10:18


Ursprung


Antworten:


Eine Abfrage kann aus verschiedenen Gründen fehlschlagen. In diesem Fall werden sowohl die mysql_ * - als auch die mysqli-Erweiterung zurückgegeben false aus ihren jeweiligen Abfragefunktionen / Methoden. Sie müssen diese Fehlerbedingung testen und entsprechend behandeln.

mysql_ * Erweiterung:

HINWEIS Das mysql_ functions sind veraltet und wurden in PHP-Version 7 entfernt.

Prüfen $result bevor Sie es weitergeben mysql_fetch_array. Du wirst feststellen, dass es so ist false weil die Abfrage fehlgeschlagen ist. Siehe die mysql_query Dokumentation für mögliche Rückgabewerte und Vorschläge für den Umgang mit ihnen.

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

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

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

mysqli-Erweiterung
Verfahrensstil:

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

oo-Stil:

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

eine vorbereitete Aussage verwenden:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

Diese Beispiele veranschaulichen nur Was sollte getan werden (Fehlerbehandlung), nicht wie es geht. Produktionscode sollte nicht verwendet werden or die Bei der Ausgabe von HTML wird ansonsten (zumindest) ungültiges HTML generiert. Außerdem sollten Datenbankfehlermeldungen nicht für Benutzer ohne Administratorrechte angezeigt werden offenbart zu viel Information.


614
2018-06-04 10:19



Diese Fehlermeldung wird angezeigt, wenn in Ihrer Abfrage ein Fehler aufgetreten ist, der zu einem Fehler geführt hat. Es wird sich manifestieren, wenn man:

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

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

Schritte zur Fehlerbehebung

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

  • Benutzen mysql_error(). mysql_error() meldet alle Fehler, die MySQL bei der Durchführung Ihrer Abfrage festgestellt hat.

    Beispielverwendung:

    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 dies sagen, was es ist.

  • Stellen Sie sicher, dass Ihre Angebote korrekt sind. Ein fehlendes Zitat um die Abfrage oder ein Wert kann dazu führen, dass eine Abfrage fehlschlägt.

  • Stellen Sie sicher, dass Sie Ihren Werten entkommen. Anführungszeichen in Ihrer Abfrage können dazu führen, dass eine Abfrage fehlschlägt (und Sie auch für SQL-Injektionen offen bleiben). Benutzen mysql_real_escape_string() um deiner Eingabe zu entkommen.

  • Stellen Sie sicher, dass Sie nicht mischen mysqli_* und mysql_* Funktionen. Sie sind nicht das Gleiche und können nicht zusammen verwendet werden. (Wenn du den einen oder anderen Stick mit wählen willst mysqli_*. Siehe unten für warum.)

Andere Tipps

mysql_* Funktionen sollten nicht für neuen Code verwendet werden. Sie werden nicht mehr gepflegt und die Gemeinde hat begonnen Verfallsprozess. Stattdessen sollten Sie etwas darüber erfahren vorbereitete Aussagen und benutze beides PDO oder MySQLi. Wenn Sie sich nicht entscheiden können, Dieser Artikel wird helfen zu wählen. Wenn Sie lernen möchten, hier ist gutes PDO-Tutorial.


159
2017-07-26 17:00



Der hier aufgetretene Fehler war auf die Verwendung von einfachen Anführungszeichen zurückzuführen ('). Sie können Ihre Anfrage so stellen:

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

Es benutzt mysql_real_escape_string zur Verhinderung der SQL-Injektion. Obwohl wir MySQLi oder PDO_MYSQL Erweiterung für aktualisierte Version von PHP (PHP 5.5.0 und höher) verwenden sollten, aber für ältere Versionen mysql_real_escape_string wird den Trick machen.


106
2018-06-04 10:24



Wie scompt.com erklärt, die Abfrage kann fehlschlagen. Verwenden Sie diesen Code, um den Fehler der Abfrage oder das korrekte 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, also die Variable $username wurde nicht analysiert. Aber du solltest es wirklich benutzen mysql_real_escape_string($username) SQL-Injektionen zu vermeiden.


59
2018-06-04 10:31



Setzen Sie Zitate herum $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, den LIKE Bedingung, wenn Sie keine Platzhalter verwenden: Wenn Sie eine genaue Übereinstimmung benötigen, verwenden Sie = Anstatt von LIKE.


53
2018-06-04 10:22



Bitte überprüfen Sie, ob die ausgewählte Datenbank nicht ausgewählt wurde, weil die Datenbank manchmal nicht ausgewählt wurde

Prüfen

mysql_select_db('database name ')or DIE('Database name is not available!');

vor der MySQL-Abfrage und dann zum nächsten Schritt gehen

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

f($result === FALSE) {
    die(mysql_error());

43
2018-04-25 05:14



Ihr Code sollte in etwa so aussehen

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

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

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

Wenn Sie damit fertig sind, erhalten Sie die Abfrage auf dem Bildschirm gedruckt. Versuchen Sie diese Abfrage auf Ihrem Server und sehen Sie, ob es die gewünschten Ergebnisse erzeugt. Meistens liegt der Fehler in der Abfrage. Der Rest des Codes ist korrekt.


40
2018-06-04 11:28



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

Sie definieren die Zeichenfolge in einfachen Anführungszeichen, und PHP analysiert keine durch einen einzelnen Anführungszeichen getrennten Zeichenfolgen. Um eine variable Interpolation zu erhalten, müssen Sie doppelte Anführungszeichen ODER Zeichenkettenverkettung (oder eine Kombination davon) verwenden. Sehen http://php.net/manual/en/language.types.string.php für mehr Informationen.

Außerdem sollten Sie überprüfen, ob mysql_query eine gültige Ergebnisressource zurückgegeben hat, andernfalls funktionieren fetch_ *, num_rows, etc nicht am Ergebnis, da dies kein Ergebnis ist! IE:

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

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php für mehr Informationen.


35
2018-01-08 03:48



Diese Abfrage sollte funktionieren:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Das Problem besteht aus einfachen Anführungszeichen, daher schlägt Ihre Abfrage fehl und gibt FALSE zurück, und Ihre WHILE-Schleife kann nicht ausgeführt werden. Mit% können Sie alle Ergebnisse abgleichen, die Ihre Zeichenfolge enthalten (z. B. SomeText- $ Benutzername-SomeText).

Dies ist einfach eine Antwort auf Ihre Frage, Sie sollten Sachen implementieren, die in den anderen Posts erwähnt werden: Fehlerbehandlung, verwenden Sie Escape Strings (Benutzer können alles in das Feld eingeben, und Sie MÜSSEN sicherstellen, dass es sich nicht um willkürlichen Code handelt) PDO stattdessen mysql_connect, das jetzt entzogen ist.


34
2018-04-23 09:34