resource - php warning mysql_fetch_array() expects parameter 1
mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc… espera que el parámetro 1 sea un recurso (30)
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 un recurso, dado booleano
o
mysqli_fetch_array () espera que el parámetro 1 sea mysqli_result, dado un valor booleano
o
Llame a una función miembro fetch_array () en boolean / non-object
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(...);
Asegúrese de que no está cerrando la base de datos utilizando db_close () antes de ejecutar su consulta:
Si está utilizando varias consultas en una secuencia de comandos, incluso si está incluyendo otras páginas que contienen consultas o conexión de base de datos, es posible que en cualquier lugar use db_close () que cierre su conexión de base de datos, así que asegúrese de No cometiendo este error en tus guiones.
Cada vez que obtenga el ...
"Advertencia: mysqli_fetch_object () espera que el parámetro 1 sea mysqli_result, dado un valor booleano"
... es probable porque hay un problema con su consulta. La prepare()
o la query()
pueden devolver FALSE
(un valor booleano), pero este mensaje de error genérico no te deja mucho en el camino de las pistas. ¿Cómo descubres qué es lo que está mal con tu consulta? Usted pregunta
En primer lugar, asegúrese de que el informe de errores esté activado y sea visible: agregue estas dos líneas en la parte superior de su (s) archivo (s) justo después de abrir la etiqueta <?php
:
error_reporting(E_ALL);
ini_set(''display_errors'', 1);
Si su informe de errores se ha establecido en php.ini, no tendrá que preocuparse por esto. Solo asegúrese de manejar los errores con gracia y nunca revele la verdadera causa de los problemas a sus usuarios. Revelar la verdadera causa al público puede ser una invitación grabada con oro para aquellos que desean dañar sus sitios y servidores. Si no desea enviar errores al navegador, siempre puede supervisar los registros de errores de su servidor web. Las ubicaciones de los registros variarán de un servidor a otro, por ejemplo, en Ubuntu, el registro de errores normalmente se encuentra en /var/log/apache2/error.log
. Si está examinando los registros de errores en un entorno Linux, puede usar tail -f /path/to/log
en una ventana de consola para ver los errores que se producen en tiempo real ... o cuando los crea.
Una vez que esté al tanto de los informes de errores estándar, agregue la verificación de errores en su conexión de base de datos y las consultas le brindarán muchos más detalles sobre los problemas que están ocurriendo. Eche un vistazo a este ejemplo donde el nombre de la columna es incorrecto. Primero, el código que devuelve el mensaje de error fatal genérico:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param(''s'', $definition);
$query->execute();
El error es genérico y no es muy útil para resolver lo que está sucediendo.
Con un par de líneas de código más, puede obtener información muy detallada que puede utilizar para resolver el problema de inmediato . Verifique la declaración de prepare()
para ver si es cierta y, si es buena, puede proceder a la vinculación y ejecución.
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param(''s'', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . '' '' . $mysqli->error;
echo $error; // 1054 Unknown column ''foo'' in ''field list''
}
Si algo está mal, puede escupir un mensaje de error que lo lleve directamente al problema. En este caso, no hay ninguna columna foo
en la tabla, resolver el problema es trivial.
Si lo desea, puede incluir esta comprobación en una función o clase y extenderla manejando los errores como se mencionó anteriormente.
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 de mysql_query()
para obtener más información.
El error real fueron las comillas simples para que la variable $username
no se analizara. Pero realmente debería usar mysql_real_escape_string($username)
para evitar inyecciones de SQL.
Compruebe su conexión primero.
Luego, si desea obtener el valor exacto de la base de datos, debe escribir:
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");
O si desea obtener el tipo de valor LIKE
, debe escribir:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE ''%$username%''");
El error ocurrido aquí fue 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á utilizando mysql_real_escape_string
para prevenir la inyección de SQL. Aunque deberíamos usar la extensión MySQLi o PDO_MYSQL para una versión actualizada de PHP (PHP 5.5.0 y posterior), pero para versiones anteriores mysql_real_escape_string
hará el truco.
Esta consulta debería funcionar:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE ''%$username%''");
while($row = mysql_fetch_array($result))
{
echo $row[''FirstName''];
}
El problema son las comillas simples, por lo que su consulta falla y devuelve FALSO y su ciclo WHILE no puede ejecutarse. El uso de% le permite hacer coincidir cualquier resultado que contenga su cadena (como SomeText- $ username-SomeText).
Esto es simplemente una respuesta a su pregunta, debe implementar las cosas mencionadas en las otras publicaciones: manejo de errores, usar cadenas de escape (los usuarios pueden escribir cualquier cosa en el campo y DEBE asegurarse de que no sea un código arbitrario), use PDO lugar de mysql_connect que ahora está depricado.
Este mensaje de error se muestra cuando tiene un error en su consulta que hizo que fallara. Se manifestará cuando se use:
-
mysql_fetch_array
/mysqli_fetch_array()
-
mysql_fetch_assoc()
/mysqli_fetch_assoc()
-
mysql_num_rows()
/mysqli_num_rows()
Nota : este error no aparece si la consulta no afecta a ninguna fila. Solo 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, se lo señalaremos.Utilice
mysql_error()
.mysql_error()
informará cualquier error que haya encontrado MySQL al realizar su consulta.Uso de la 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úrese de que sus citas son correctas. Una cita que falta alrededor de la consulta o un valor puede hacer que una consulta falle.
Asegúrate de que estás escapando de tus valores. Las citas en su consulta pueden hacer que una consulta falle (y también lo deja abierto a inyecciones de SQL). Usa mysql_real_escape_string para escapar de tu entrada.
Asegúrese de que no está mezclando las
mysqli_*
ymysql_*
. No son lo mismo y no pueden usarse juntos. (Si va a elegir uno u otro,mysqli_*
conmysqli_*
. Consulte a continuación el motivo).
Otros consejos
mysql_*
funciones mysql_*
no deben usarse para el nuevo código. Ya no se mantienen y la comunidad ha comenzado el proceso de desaprobación . En su lugar, debería aprender sobre declaraciones preparadas y usar PDO o MySQLi . Si no puedes decidir, este artículo te ayudará a elegir. Si te interesa aprender, aquí hay un buen tutorial de DOP .
Incluir una variable de cadena de conexión antes de la consulta de MySQL. Por ejemplo, $connt
en este código:
$results = mysql_query($connt, "SELECT * FROM users");
Intente esto, debe ser un trabajo, de lo contrario debe imprimir el error para especificar su problema
$username = $_POST[''username''];
$password = $_POST[''password''];
$sql = "SELECT * from Users WHERE UserName LIKE ''$username''";
$result = mysql_query($sql,$con);
while($row = mysql_fetch_array($result))
{
echo $row[''FirstName''];
}
No use la función mysql_ * aberrada (depricada en php 5.5 se eliminará en php 7). y puedes hacer esto con mysqli o pdo
Aquí está la consulta de selección completa
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
// code here
}
} else {
echo "0 results";
}
$conn->close();
?>
Pon comillas alrededor de $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 la condición LIKE
si no usa comodines: si necesita una coincidencia exacta use =
lugar de LIKE
.
Por favor, compruebe una vez que la base de datos seleccionada no es porque algunas veces no se selecciona
Comprobar
mysql_select_db(''database name '')or DIE(''Database name is not available!'');
antes de la consulta de MySQL y luego ir al siguiente paso
$result = mysql_query(''SELECT * FROM Users WHERE UserName LIKE $username'');
f($result === FALSE) {
die(mysql_error());
Por lo general, se produce un error cuando falla la conectividad de su base de datos, así que asegúrese de conectar su base de datos o de incluir el archivo de la base de datos.
include_once(db_connetc.php'');
O
// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());
//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());
$employee_query = "SELECT * FROM employee WHERE `id` =''".$_POST[''id'']."'';
$employee_data = mysql_query($employee_query);
if (mysql_num_rows($employee_data) > 0) {
while ($row = mysql_fetch_array($employee_data)){
echo $row[''emp_name''];
} // end of while loop
} // end of if
- La mejor práctica es ejecutar la consulta en sqlyog y luego copiarla en el código de su página.
- Siempre almacene su consulta en una variable y luego haga eco de esa variable. Luego pase a
mysql_query($query_variable);
.
Primero, verifique su conexión a la base de datos. ¿Está conectado con éxito o no?
Si está hecho, después de eso he escrito este código y funciona bien:
if (isset($_GET[''q1mrks'']) && isset($_GET[''marks'']) && isset($_GET[''qt1''])) {
$Q1mrks = $_GET[''q1mrks''];
$marks = $_GET[''marks''];
$qt1 = $_GET[''qt1''];
$qtype_qry = mysql_query("
SELECT *
FROM s_questiontypes
WHERE quetype_id = ''$qt1''
");
$row = mysql_fetch_assoc($qtype_qry);
$qcode = $row[''quetype_code''];
$sq_qry = "
SELECT *
FROM s_question
WHERE quetype_code = ''$qcode''
ORDER BY RAND() LIMIT $Q1mrks
";
$sq_qry = mysql_query("
SELECT *
FROM s_question
WHERE quetype_code = ''$qcode''
LIMIT $Q1mrks
");
while ($qrow = mysql_fetch_array($sq_qry)) {
$qm = $qrow[''marks''] . "<br />";
$total += $qm . "<br />";
}
echo $total . "/" . $marks;
}
Prueba el siguiente código. Puede funcionar bien.
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysql_query("SELECT * FROM Users WHERE UserName =''$username''");
while($row = mysql_fetch_array($result))
{
echo $row[''FirstName''];
}
Prueba este código funciona bien
asignar la variable de publicación a la variable
$username = $_POST[''uname''];
$password = $_POST[''pass''];
$result = mysql_query(''SELECT * FROM userData WHERE UserName LIKE $username'');
if(!empty($result)){
while($row = mysql_fetch_array($result)){
echo $row[''FirstName''];
}
}
Prueba esto
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysqli_query(''SELECT * FROM Users WHERE UserName LIKE $username'');
if($result){
while($row = mysqli_fetch_array($result))
{
echo $row[''FirstName''];
}
}
Puede haber dos razones:
¿Ha abierto la conexión a la base de datos antes de llamar a la función mysql_query? No veo eso en tu código. Use mysql_connect antes de hacer la consulta. Ver
php.net/manual/en/function.mysql-connect.php
La variable $ username se usa dentro de una cadena de comillas simples, por lo que su valor no se evaluará dentro de la consulta. La consulta definitivamente fallará.
En tercer lugar, la estructura de consulta es propensa a la inyección de SQL . Puede usar declaraciones preparadas para evitar esta amenaza de seguridad.
Puedes probar este código. Lo encontré antes cuando me encontré con un problema similar al tuyo.
if (isset($_GET[''q1mrks'']) && isset($_GET[''marks'']) && isset($_GET[''qt1''])) {
$Q1mrks = $_GET[''q1mrks''];
$marks = $_GET[''marks''];
$qt1 = $_GET[''qt1''];
$qtype_qry = mysql_query("
SELECT *
FROM s_questiontypes
WHERE quetype_id = ''$qt1''
");
$row = mysql_fetch_assoc($qtype_qry);
$qcode = $row[''quetype_code''];
$sq_qry = "
SELECT *
FROM s_question
WHERE quetype_code = ''$qcode''
ORDER BY RAND() LIMIT $Q1mrks
";
$sq_qry = mysql_query("
SELECT *
FROM s_question
WHERE quetype_code = ''$qcode''
LIMIT $Q1mrks
");
while ($qrow = mysql_fetch_array($sq_qry)) {
$qm = $qrow[''marks''] . "<br />";
$total += $qm . "<br />";
}
echo $total . "/" . $marks;
}
Si no aparece ningún error de MySQL durante la comprobación, asegúrese de haber creado correctamente la tabla de la base de datos. Esto me paso a mi Busque cualquier comas o comillas no deseadas.
Si probó todo aquí y no funciona, es posible que desee verificar la compilación de la base de datos MySQL. El mío se fijó en una colación sueca. Luego lo cambié a utf8_general_ci
y todo se utf8_general_ci
en marcha.
Espero que esto ayude a alguien.
También puede comprobar si el $result
está fallando así, antes de ejecutar la matriz de recuperación
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysql_query(''SELECT * FROM Users WHERE UserName LIKE $username'');
if(!$result)
{
echo "error executing query: "+mysql_error();
}else{
while($row = mysql_fetch_array($result))
{
echo $row[''FirstName''];
}
}
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.
Una consulta puede fallar por varios motivos, en cuyo caso tanto mysql_ * como la extensión mysqli devolverán false
desde sus respectivas funciones / métodos de consulta. Necesita probar esa condición de error y manejarlo en consecuencia.
NOTA Las funciones mysql_ están en desuso y se eliminaron en la versión 7 de php.
Verifique $result
antes de pasarlo a mysql_fetch_array
. Encontrarás que es false
porque la consulta falló. Consulte la documentación de mysql_query
para conocer los 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) {
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 ) {
...
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 ) {
...
utilizando 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 lo que se debe hacer (manejo de errores), no cómo hacerlo. El código de producción no debe usarse or die
cuando se imprime HTML, de lo contrario (al menos) 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 revelan demasiada información .
Ve a tu config.php
. Yo tuve el mismo problema. Verifique el nombre de usuario y la contraseña, y también sql select es el mismo nombre que la configuración.
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";
while( $data = mysql_fetch_array($query))
{
echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");
}
En lugar de utilizar una consulta WHERE, puede utilizar esta consulta ORDER BY. Es mucho mejor que esto para el uso de una consulta.
He hecho esta consulta y no estoy recibiendo ningún error como parámetro o booleano.
$result = mysql_query(''SELECT * FROM Users WHERE UserName LIKE $username'');
Usted define la cadena usando comillas simples y PHP no analiza cadenas delimitadas por comillas simples. Para obtener la interpolación de variables, deberá usar comillas dobles O concatenación de cadenas (o una combinación de ellas). Consulte http://php.net/manual/en/language.types.string.php para obtener más información.
También debe verificar que mysql_query devolvió un recurso de resultado válido, de lo contrario fetch_ *, num_rows, etc. no funcionarán en el resultado ya que no es un resultado. ES DECIR:
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysql_query(''SELECT * FROM Users WHERE UserName LIKE $username'');
if( $result === FALSE ) {
trigger_error(''Query failed returning error: ''. mysql_error(),E_USER_ERROR);
} else {
while( $row = mysql_fetch_array($result) ) {
echo $row[''username''];
}
}
http://us.php.net/manual/en/function.mysql-query.php para obtener más información.
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE ''%$username%''") or die(mysql_error());
while($row = mysql_fetch_array($result))
{
echo $row[''FirstName''];
}
En ocasiones, se suprime la consulta como @mysql_query(your query);
<?php
$username = $_POST[''username''];
$password = $_POST[''password''];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE ''".mysql_real_escape_string($username)."''")or die(mysql_error());
while($row=mysql_fetch_array($result))
{
echo $row[''FirstName''];
}
?>
<?php
$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''];
}
?>
Y si hay un usuario con un nombre de usuario único, puede usar "=" para eso. No hay necesidad de gustar.
Su consulta será:
mysql_query("SELECT * FROM Users WHERE UserName =''".$username."''");