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

Resuelto iamjonesy asked hace 54 años • 31 respuestas

Estoy intentando seleccionar datos de una tabla MySQL, pero aparece uno de los siguientes mensajes de error:

mysql_fetch_array() espera que el parámetro 1 sea un recurso, dado que es booleano

Este es mi código:

$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'];
}
iamjonesy avatar Jan 01 '70 08:01 iamjonesy
Aceptado

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

extensión mysql_ :

NOTA Las funciones mysql_ están en desuso y se han eliminado en la versión 7 de PHP.

Compruébalo $resultantes de pasarlo a mysql_fetch_array. Descubrirá que se falsedebe a que la consulta falló. Consulte la mysql_querydocumentación [ ][1] para conocer posibles valores de retorno y sugerencias sobre cómo tratarlos.

$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'];
}
Edward Dale avatar Jun 04 '2010 10:06 Edward Dale

Este mensaje de error se muestra cuando tiene un error en su consulta que provocó que fallara. Se manifestará al usar:

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

Nota : este error no aparece si su consulta no afecta ninguna fila. Sólo una consulta con una sintaxis no válida generará este error.

Pasos para solucionar problemas

  • Asegúrese de tener su servidor de desarrollo configurado para mostrar todos los errores. Puede hacer esto colocando esto en la parte superior de sus archivos o en su archivo de configuración: error_reporting(-1);. Si tiene algún error de sintaxis, esto se lo indicará.

  • Usar mysql_error(). mysql_error()informará cualquier error que MySQL haya encontrado al realizar su consulta.

Uso de muestra:

    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();
    }
  • Ejecute su consulta desde la línea de comando MySQL o una herramienta como phpMyAdmin . Si tiene un error de sintaxis en su consulta, esto le indicará de qué se trata.

  • Asegúrese de que sus cotizaciones sean correctas. Una cita faltante alrededor de la consulta o de un valor puede hacer que una consulta falle.

  • Asegúrate de escapar de tus valores. Las comillas en su consulta pueden hacer que una consulta falle (y también dejarlo expuesto a inyecciones de SQL). Úselo mysql_real_escape_string()para escapar de su entrada.

  • Asegúrese de no mezclar mysqli_*funciones mysql_*. No son lo mismo y no se pueden usar juntos. (Si va a elegir uno u otro, quédese con mysqli_*. Vea a continuación el motivo).

Otros consejos

mysql_*Las funciones no deben usarse para código nuevo. Ya no reciben mantenimiento y la comunidad ha comenzado el proceso de desaprobación . En su lugar, debería aprender acerca de las declaraciones preparadas y utilizar PDO o MySQLi . Si no puedes decidirte, este artículo te ayudará a elegir. Si quieres aprender, aquí tienes un buen tutorial de PDO .

John Conde avatar Jul 26 '2012 17:07 John Conde

El error ocurrido aquí se debió al uso de comillas simples ( '). Puedes poner tu consulta así:

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

Se utiliza mysql_real_escape_stringpara la prevención de la inyección SQL. Aunque deberíamos usar la extensión MySQLi o PDO_MYSQL para la versión actualizada de PHP (PHP 5.5.0 y posterior), pero para versiones anteriores mysql_real_escape_stringserá suficiente.

nik avatar Jun 04 '2010 10:06 nik

Como explicó scompt.com , la consulta podría fallar. Utilice este código para obtener el error de la consulta o el resultado correcto:

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

Consulte la documentación paramysql_query() obtener más información.

El error real fueron las comillas simples para que la variable $usernameno se analizara. Pero realmente deberías usarlo mysql_real_escape_string($username)para evitar inyecciones de SQL.

2ndkauboy avatar Jun 04 '2010 10:06 2ndkauboy