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


Estoy tratando de seleccionar datos de una tabla MySQL, pero recibo uno de los siguientes mensajes de error:

mysql_fetch_array () espera que el parámetro 1 sea resource, boolean

o

mysqli_fetch_array () espera que el parámetro 1 sea mysqli_result, boolean dado

o

Llamada a una función miembro fetch_array () en booleano / no objeto

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

Lo mismo se aplica a código como

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

y

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

y

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

y

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

y

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);

864
2018-06-04 10:18


origen


Respuestas:


Una consulta puede fallar por varios motivos, en cuyo caso tanto la extensión mysql_ * como la extensión mysqli volverá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 los las funciones de mysql_ están en desuso y han sido eliminados en php versión 7.

Comprobar $result antes de pasarlo a mysql_fetch_array. Descubrirás que es false porque la consulta falló Ver el mysql_query documentación de posibles valores de devolución y sugerencias sobre cómo tratar con ellos.

$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 de procedimiento:

$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-estilo:

$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 debe usar or die al generar HTML, de lo contrario generará (al menos) HTML no válido. Además, los mensajes de error de la base de datos no se deben mostrar a los usuarios que no son administradores, ya que revela demasiada información.


614
2018-06-04 10:19



Este mensaje de error se muestra cuando tiene un error en su consulta que provocó su error. 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 no aparece si ninguna fila se ve afectada por su consulta. Solo una consulta con una sintaxis invá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 los señalará.

  • Utilizar mysql_error(). mysql_error() informará cualquier error que encuentre MySQL mientras realiza 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 comandos de MySQL o una herramienta como phpMyAdmin. Si tiene un error de sintaxis en su consulta, esto le indicará qué es.

  • Asegúrate de que tus citas sean correctas. Una cita faltante alrededor de la consulta o un valor puede hacer que falle una consulta.

  • Asegúrate de estar escapando de tus valores. Las comillas en su consulta pueden hacer que falle una consulta (y también lo dejan abierto a las inyecciones de SQL). Utilizar mysql_real_escape_string() para escapar de tu entrada.

  • Asegúrate de no estar mezclando mysqli_* y mysql_* funciones. No son lo mismo y no se pueden usar juntos. (Si va a elegir uno o el otro palo con mysqli_*. Vea a continuación por qué.)

Otros consejos

mysql_* las funciones no deben usarse para el nuevo código. Ya no se mantienen y la comunidad ha comenzado el proceso de desaprobación. En cambio, debes aprender sobre declaraciones preparadas y use cualquiera DOP o MySQLi. Si no puedes decidir, Este artículo ayudará a elegir. Si te interesa aprender, aquí está buen tutorial de PDO.


159
2017-07-26 17:00



El error ocurrió aquí debido al uso de comillas simples (') Puedes poner tu consulta así:

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

Está usando mysql_real_escape_string para la prevención de 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 hará el truco


106
2018-06-04 10:24



Como scompt.com explicado, la consulta puede fallar Use 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; 
}

Ver el documentación para mysql_query() para mayor información.

El error real fueron las comillas simples para que la variable $username no fue analizado Pero realmente deberías usar mysql_real_escape_string($username) para evitar inyecciones de SQL.


59
2018-06-04 10:31



Ponga comillas alrededor $username. Los valores de cadena, a diferencia de los valores numéricos, deben estar entre comillas.

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

Además, no tiene sentido usar el LIKE condición si no está usando comodines: si necesita un uso de coincidencia exacta = en lugar de LIKE.


53
2018-06-04 10:22



Por favor, verifique una vez que la base de datos seleccionada no esté porque algunas veces la base de datos no está seleccionada

Comprobar

mysql_select_db('database name ')or DIE('Database name is not available!');

antes de la consulta MySQL y luego ve al siguiente paso

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

f($result === FALSE) {
    die(mysql_error());

43
2018-04-25 05:14



Tu código debería ser algo como esto

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Una vez hecho esto, obtendrías la consulta impresa en la pantalla. Pruebe esta consulta en su servidor y vea si produce los resultados deseados. La mayoría de las veces el error está en la consulta. El resto del código es correcto.


40
2018-06-04 11:28