Mysql
 sql >> Datenbank >  >> RDS >> Mysql

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

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

mysql_*-Erweiterung :

HINWEIS Die mysql_-Funktionen sind veraltet und wurden in PHP-Version 7 entfernt.

Prüfen Sie $result bevor es an mysql_fetch_array übergeben wird . Sie werden feststellen, dass es false ist weil die Abfrage fehlgeschlagen ist. Siehe mysql_query Dokumentation für mögliche Rückgabewerte und Vorschläge zum Umgang damit.

$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
prozeduraler Stil :

$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 ) {
      ...

unter Verwendung einer vorbereiteten Anweisung:

$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 getan werden sollte (Fehlerbehandlung), nicht wie es zu tun ist. Produktionscode sollte nicht or die verwenden bei der Ausgabe von HTML, sonst wird es (zumindest) ungültiges HTML erzeugen. Außerdem sollten Datenbankfehlermeldungen nicht für Benutzer ohne Administratorrechte angezeigt werden, da es offenbart zu viele Informationen .