sql >> Base de Datos >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... espera que el parámetro 1 sea un recurso

Una consulta puede fallar por varios motivos, en cuyo caso tanto la extensión mysql_* como mysqli devolverán false de sus respectivas funciones/métodos de consulta. Debe probar esa condición de error y manejarla en consecuencia.

extensión mysql_* :

NOTA Las las funciones mysql_ están en desuso y han sido eliminados en la versión 7 de php.

Comprobar $result antes de pasarlo a mysql_fetch_array . Verás que es false porque la consulta falló. Consulte el mysql_query documentación para posibles valores de retorno y sugerencias sobre cómo manejarlos.

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

extensión mysqli
estilo procesal :

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

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

usando una declaración preparada:

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

Estos ejemplos solo ilustran qué debe hacerse (manejo de errores), no cómo hacerlo. El código de producción no debería usar or die al generar HTML, de lo contrario (como mínimo) generará HTML no válido. Además, los mensajes de error de la base de datos no deben mostrarse a usuarios que no sean administradores, ya que divulga demasiada información .