mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... espera que el parámetro 1 sea un recurso
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'];
}
Una consulta puede fallar por varias razones, en cuyo caso tanto la extensión mysql_* como mysqli regresará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 funciones mysql_ están en desuso y se han eliminado en la versión 7 de PHP.
Compruébalo $result
antes de pasarlo a mysql_fetch_array
. Descubrirá que se false
debe a que la consulta falló. Consulte la mysql_query
documentació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'];
}
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_*
funcionesmysql_*
. No son lo mismo y no se pueden usar juntos. (Si va a elegir uno u otro, quédese conmysqli_*
. 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 .
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_string
para 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_string
será suficiente.
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 $username
no se analizara. Pero realmente deberías usarlo mysql_real_escape_string($username)
para evitar inyecciones de SQL.