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
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'];
}
mysql_real_escape_string
. Nunca confíes en los datos del usuario.mysql_real_escape_string
no es el principio y el fin de la protección de inyección SQL; Todavía es vulnerable a una serie de ataques. (No, nunca dijo que era perfecto, pero dio a entender que era la única solución requerida) La mejor solución ahora es PDO, que yo sepa.Respuestas:
Una consulta puede fallar por varias razones, en cuyo caso tanto la extensión mysql_ * como la extensión 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_ * :
Verifique
$result
antes de pasarlo amysql_fetch_array
. Encontrará que esfalse
porque la consulta falló. Consulte lamysql_query
documentación para ver posibles valores de retorno y sugerencias sobre cómo tratarlos.estilo de procedimiento de extensión mysqli :
estilo oo :
usando una declaración preparada:
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
al generar HTML, de lo contrario, generará (como mínimo) 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 revela demasiada información .fuente
if($result === FALSE)
que pueda usarif(! $result)
.Este mensaje de error se muestra cuando tiene un error en su consulta que hizo que fallara. Se manifestará cuando 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 su consulta no afecta a ninguna fila. Solo una consulta con una sintaxis no válida generará este error.
Pasos de solución de problemas
Asegúrese de tener su servidor de desarrollo configurado para mostrar todos los errores. Usted puede hacer esto mediante la colocación de esta en la parte superior de sus archivos o en el fichero de configuración:
error_reporting(-1);
. Si tiene algún error de sintaxis, se lo indicará.Utilizar
mysql_error()
.mysql_error()
informará cualquier error que encuentre MySQL al realizar su consulta.Uso de la muestra:
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 dirá cuál es.
Asegúrese de que sus citas sean correctas. Una cita faltante alrededor de la consulta o un valor puede hacer que una consulta falle.
Asegúrese de escapar de sus valores. Las citas en su consulta pueden hacer que falle una consulta (y también dejarlo abierto a inyecciones SQL). Utilizar
mysql_real_escape_string()
para escapar de su aporte.Asegúrese de no estar mezclando
mysqli_*
ymysql_*
funciones. No son lo mismo y no se pueden usar juntos. (Si vas a elegir uno u otro, quédate conmysqli_*
. Mira a continuación por qué).Otros consejos
mysql_*
Las funciones no deben utilizarse para el nuevo código. Ya no se mantienen y la comunidad ha comenzado el proceso de desaprobación . En su lugar, debe aprender sobre las declaraciones preparadas y usar PDO o MySQLi . Si no puede decidir, este artículo le ayudará a elegir. Si te interesa aprender, aquí hay un buen tutorial de PDO .fuente
mysql_query()
/mysqli_query($connection)
etc." ; pensamientos? Como no hay otras respuestas en estas preguntas y respuestas, se menciona esto.El error ocurrido aquí se debió al uso de comillas simples (
'
). Puede hacer su consulta de esta manera:Se utiliza
mysql_real_escape_string
para prevenir la inyección de SQL. Aunque deberíamos usar la extensión MySQLi o PDO_MYSQL para la versión mejorada de PHP (PHP 5.5.0 y posterior), pero para las versiones anterioresmysql_real_escape_string
será suficiente.fuente
Como explicó scompt.com , la consulta podría fallar. Use este código para obtener el error de la consulta o el resultado correcto:
Consulte la documentación para
mysql_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 usarmysql_real_escape_string($username)
para evitar las inyecciones SQL.fuente
Pon comillas alrededor
$username
. Los valores de cadena, a diferencia de los valores numéricos, deben estar entre comillas.Además, no tiene sentido usar la
LIKE
condición si no está usando comodines: si necesita una coincidencia exacta, use en=
lugar deLIKE
.fuente
Por favor, compruebe una vez que la base de datos seleccionada no es porque algunas veces la base de datos no está seleccionada
Cheque
antes de la consulta MySQL y luego vaya al siguiente paso
fuente
Tu código debería ser algo como esto
Una vez hecho esto, obtendría 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.
fuente
Usted define la cadena usando comillas simples y PHP no analiza cadenas delimitadas por comillas simples. Para obtener interpolación variable, necesitará 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 haya devuelto un recurso de resultado válido, de lo contrario fetch_ *, num_rows, etc. no funcionará en el resultado ya que no es un resultado! ES DECIR:
http://us.php.net/manual/en/function.mysql-query.php para más información.
fuente
Esta consulta debería funcionar:
El problema son las comillas simples, por lo tanto su consulta falla y devuelve FALSE y su ciclo WHILE no puede ejecutarse. El uso de% le permite hacer coincidir los resultados que contienen su cadena (como SomeText- $ username-SomeText).
Esta 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 en su lugar mysql_connect que ahora está depricada.
fuente
A veces suprime la consulta como
@mysql_query(your query);
fuente
Si ha intentado todo aquí y no funciona, es posible que desee verificar la clasificación de su base de datos MySQL. La mía se estableció en una colación sueca. Luego lo cambié
utf8_general_ci
y todo simplemente hizo clic.fuente
En lugar de usar una consulta WHERE, puede usar esta consulta ORDER BY. Es mucho mejor que esto para el uso de una consulta.
He realizado esta consulta y no obtengo errores como parámetro o booleano.
fuente
htmlspecialchars()
cuando use datos arbitrarios en el contexto de HTML. De lo contrario, corre el riesgo de crear HTML válido cuando se utilizan caracteres reservados en los datos.Pruebe esto, debe ser trabajo, de lo contrario, debe imprimir el error para especificar su problema
fuente
LIKE
expresión).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.
fuente
Prueba el siguiente código. Puede funcionar bien.
fuente
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.fuente
No use la función mysql_ * depricated (depricated 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
fuente
Y si hay un usuario con un nombre de usuario único, puede usar "=" para eso. No hay necesidad de gustar.
Su consulta será:
fuente
username
y se ejecutará.Incluya una variable de cadena de conexión antes de la consulta MySQL. Por ejemplo,
$connt
en este código:fuente
Cada vez que obtienes el ...
... es probable porque hay un problema con su consulta. El
prepare()
oquery()
podría regresarFALSE
(un booleano), pero este mensaje de falla genérico no te deja mucho en el camino de las pistas. ¿Cómo saber qué hay de malo en su consulta? Usted pregunta !En primer lugar, asegúrese de que los informes de errores estén activados y sean visibles: agregue estas dos líneas en la parte superior de sus archivos justo después de su
<?php
etiqueta de apertura :Si su informe de errores se ha configurado 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 en oro para aquellos que quieran dañar sus sitios y servidores. Si no desea enviar errores al navegador, siempre puede monitorear los registros de errores de su servidor web. Las ubicaciones de registro variarán de un servidor a otro, por ejemplo, en Ubuntu, el registro de errores generalmente se encuentra en
/var/log/apache2/error.log
. Si está examinando registros de errores en un entorno Linux, puede usarlostail -f /path/to/log
en una ventana de consola para ver los errores a medida que ocurren en tiempo real ... o como los hace.Una vez que esté al tanto de los informes de error estándar, la adición de la comprobación de errores en la conexión de su base de datos y las consultas le brindarán muchos más detalles sobre los problemas que ocurren. 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:
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 que la
prepare()
declaración sea veraz y, si es buena, puede proceder a la vinculación y ejecución.Si algo está mal, puede escupir un mensaje de error que lo llevará directamente al problema. En este caso, no hay
foo
columna 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 con gracia como se mencionó anteriormente.
fuente
echo $error;
en un post?fuente
Prueba esto
fuente
Primero, verifique su conexión a la base de datos. ¿Está conectado con éxito o no?
Si está hecho, luego de eso he escrito este código, y funciona bien:
fuente
Si está utilizando múltiples consultas en un script, incluso si incluye otras páginas que contienen consultas o conexión a la base de datos, entonces es posible que en cualquier lugar use db_close () que cerraría la conexión de la base de datos, así que asegúrese de que No cometer este error en sus guiones.
fuente
Si no aparece ningún error de MySQL durante la comprobación, asegúrese de haber creado correctamente su tabla de base de datos. Esto me paso a mi. Busque comas o citas no deseadas.
fuente
Verifique su conexión primero.
Luego, si desea obtener el valor exacto de la base de datos, debe escribir:
O si desea obtener el
LIKE
tipo de valor, debe escribir:fuente
También puede verificar si
$result
está fallando así, antes de ejecutar la matriz de búsquedafuente
Por lo general, se produce un error cuando falla la conectividad de la base de datos, así que asegúrese de conectar su base de datos o de incluir el archivo de la base de datos.
O
mysql_query($query_variable);
.fuente
Tradicionalmente, PHP ha sido tolerante a las malas prácticas y fallas en el código, lo que hace que la depuración sea bastante difícil. El problema en este caso específico es que tanto mysqli como PDO por defecto no le avisan, cuando falla una consulta y simplemente regresan
FALSE
. (No hablaré sobre la extensión de mysql depricada . El soporte para las declaraciones preparadas es motivo suficiente para cambiar a PDO o mysqli ). Pero puede cambiar el comportamiento predeterminado de PHP para lanzar siempre excepciones cuando falla una consulta.Para PDO : uso
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Esto le mostrará lo siguiente:
Como puede ver, le dice exactamente qué está mal en la consulta y dónde solucionarlo en su código.
Sin
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
ti obtendrásPara mysqli : uso
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Conseguirás
Sin
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
ti solo obtienesPor supuesto, puede verificar manualmente los errores de MySQL. Pero me volvería loco si tuviera que hacer eso cada vez que cometiera un error tipográfico, o peor, cada vez que quiera consultar la base de datos.
fuente
Prueba este código, funciona bien
asignar la variable de publicación a la variable
fuente