Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... attend que le paramètre 1 soit une ressource

Une requête peut échouer pour diverses raisons, auquel cas mysql_* et l'extension mysqli renverront false à partir de leurs fonctions/méthodes de requête respectives. Vous devez tester cette condition d'erreur et la gérer en conséquence.

extension mysql_* :

REMARQUE Les fonctions mysql_ sont obsolètes et ont été supprimés dans la version 7 de php.

Vérifier $result avant de le passer à mysql_fetch_array . Vous constaterez que c'est false car la requête a échoué. Voir le mysql_query documentation sur les valeurs de retour possibles et suggestions sur la façon de les gérer.

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

extension mysqli
style procédural :

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

style oo :

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

en utilisant une instruction préparée :

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

Ces exemples ne font qu'illustrer ce que doit être fait (gestion des erreurs), pas comment le faire. Le code de production ne doit pas utiliser or die lors de la sortie HTML, sinon il générera (à tout le moins) du code HTML invalide. De plus, les messages d'erreur de base de données ne doivent pas être affichés pour les utilisateurs non administrateurs, car ils divulgue trop d'informations .