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


960

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

15
puede obtener más útil eroor msg usando :: QUERY o die (mysql_error ());
nik

123
También la nota obligatoria: su código es propenso a la inyección de SQL . Debe validar y / o escapar de la entrada del usuario. Echa un vistazo a mysql_real_escape_string. Nunca confíes en los datos del usuario.
Felix Kling

77
En realidad, el código de la OP provocará un error de sintaxis en el servidor MySQL, pero al menos es no vulnerables a la inyección de SQL porque comillas simples no tiene la interpolación de variables.
szgal

44
@FelixKling Me doy cuenta de que esto es muy antiguo y probablemente el más preciso posible en ese momento, pero su comentario ahora es peligrosamente incorrecto de una manera: mysql_real_escape_stringno 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.
Financia la demanda de Mónica el

2
Gah Ampliar esta pregunta para incluir MySQLi y PDO fue una mala idea. Cada uno tiene sus propios mensajes de error y sintaxis ligeramente diferentes, y bien podrían haber tenido sus propias preguntas. La combinación de todo en una pregunta gigante de tres partes solo hace que esto sea menos buscable en Google y obliga a las personas que llegan aquí a buscar contenido irrelevante para llegar a lo que quieren. También ha invalidado una gran cantidad de las respuestas a continuación, y hace que esta pregunta sea "demasiado amplia" según los estándares que normalmente aplicamos. Es un desastre, en mi opinión, pero ya es demasiado tarde para arreglarlo.
Mark Amery

Respuestas:


667

Una consulta puede fallar por varias razones, en cuyo caso tanto la extensión mysql_ * como la extensión 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 php versión 7.

Verifique $resultantes de pasarlo a mysql_fetch_array. Encontrará que es falseporque la consulta falló. Consulte la mysql_querydocumentación para ver 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'];
}


estilo de procedimiento de extensión mysqli :

$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 ) {
        ...

estilo oo :

$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 lo que se debe hacer (manejo de errores), no cómo hacerlo. El código de producción no debe usarse or dieal 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 .


99
Correcto, pero usar un dado () si la consulta falla es un poco demasiado.
2ndkauboy

28
Iba a diseñar un mecanismo completo de manejo de errores para el OP, pero decidí que podría estar más allá del alcance de mi respuesta.
Edward Dale

@ scompt.com Sí, también está cubierto en varias otras respuestas. Supongo que solo estaba señalando que, dado que esta es la respuesta aceptada en una pregunta de alta visibilidad, además del consejo (excelente) sobre cómo detectar correctamente los errores en el futuro, debería (IMHO) realmente responder la pregunta específica (es decir explica por qué hay un error en este caso).
Sepster

2
En lugar de if($result === FALSE)que pueda usar if(! $result).
Corrígeme

1
mysql_query (): la extensión mysql está en desuso y se eliminará en el futuro: use mysqli
Greg

165

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:

    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 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). Utilizarmysql_real_escape_string() para escapar de su aporte.

  • Asegúrese de no estar mezclando mysqli_*y mysql_*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 .


1
Ante esta pregunta hoy stackoverflow.com/q/43804651/1415724 y otras similares últimamente; Creo que puede valer la pena actualizar su respuesta para que contenga algo como "Ese error también puede ser causado por no ejecutar la consulta con mysql_query()/ mysqli_query($connection)etc." ; pensamientos? Como no hay otras respuestas en estas preguntas y respuestas, se menciona esto.
Funk Forty Niner

111

El error ocurrido aquí se debió al uso de comillas simples ( '). Puede hacer su consulta de esta manera:

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

Se utiliza mysql_real_escape_stringpara 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 anteriores mysql_real_escape_stringserá suficiente.


55
¿Por qué agregar ruido con concatenación de cadenas en lugar de simplemente poner la variable en la cadena de consulta?
Matteo Riva

1
@ Matteo Riva Sí, pero pensé que esta es una forma más limpia de separar las variables de la cadena. :)
Nik

60

Como explicó scompt.com , la consulta podría 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; 
}

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 usar mysql_real_escape_string($username)para evitar las inyecciones SQL.


52

Pon 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 la LIKEcondición si no está usando comodines: si necesita una coincidencia exacta, use en =lugar de LIKE.


2
¿Y si $ username es: "'; DROP TABLES;" ? Esa es la ventaja de usar declaraciones preparadas y valores vinculados, que creo que al autor de la pregunta le gustaría conservar.
HoldOffHunger

42

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

Cheque

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

antes de la consulta MySQL y luego vaya al siguiente paso

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

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

40

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í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.


3
No utilices este código. Está abierto a ataques de inyección SQL.
Brad

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

$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 más información.


2
No use este código, incluso si agrega comillas. Está abierto a ataques de inyección SQL.
Brad

33

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 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.


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

A veces suprime la consulta como @mysql_query(your query);


3
No utilices este código. Está abierto a ataques de inyección SQL.
Brad

27

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_ciy todo simplemente hizo clic.


25
$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 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.


Recuerde usar 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.
Brad

25

Pruebe esto, debe ser 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'];
}

8
1) Abierto a la inyección SQL, 2) no incluye el manejo de errores que está causando el error en el caso de OP.
Fallecimiento

+1. @deceze Sí, está abierto de par en par. Pero no más para que el OP o el código del respondedor aceptado ;-) Y no es la falta de manejo de errores en el código del OP que causa el error ... es el error , y esta respuesta al menos intenta resolver eso (poniendo solo comillas alrededor de la cadena literal en la LIKEexpresión).
Sepster

1
+1 Agregue un espacio entre LIKE y '$ username', el resto parece estar bien, excepto la inyección de SQL. Por qué no usar = en lugar de LIKE, el nombre de usuario del operador debe coincidir exactamente
asim-ishaq

21

Puede haber dos razones:

  1. ¿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. Verphp.net/manual/en/function.mysql-connect.php

  2. 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.


20

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

44
Este código está sujeto a la inyección de SQL y no debe usarse.
Brad

15

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.


15

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

<?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();
?>

Su publicación no trata los problemas abordados por la pregunta, que son una consulta no válida y un informe de error insuficiente. Esta publicación está fuera de tema.
Paul Spiegel

14
<?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."'");

3
Este código está abierto a la inyección SQL y no debe usarse.
Brad

@AnujGarg Este código toma datos directos y los concatena en la consulta. Alguien podría escribir su propio SQL en los datos de la publicación usernamey se ejecutará.
Brad

Entonces, ¿qué usar para evitar que el código de la inyección SQL?
Anuj Garg

14

Incluya una variable de cadena de conexión antes de la consulta MySQL. Por ejemplo, $connten este código:

$results = mysql_query($connt, "SELECT * FROM users");

1
Esto no aborda los problemas en la pregunta. También está mal y generaría otro error.
Paul Spiegel

12

Cada vez que obtienes el ...

"Advertencia: mysqli_fetch_object () espera que el parámetro 1 sea mysqli_result, dado booleano"

... es probable porque hay un problema con su consulta. El prepare()o query()podría regresar FALSE(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 <?phpetiqueta de apertura :

error_reporting(E_ALL);
ini_set('display_errors', 1);

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 usarlos tail -f /path/to/logen 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:

$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 que la prepare()declaración sea veraz 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; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

Si algo está mal, puede escupir un mensaje de error que lo llevará directamente al problema. En este caso, no hay foocolumna 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.


2
¿Cómo puede escribir "Solo asegúrese de manejar los errores con gracia y nunca revele la verdadera causa de ningún problema a sus usuarios". y echo $error;en un post?
Paul Spiegel

Gracias por el aviso a @PaulSpiegel. Ha pasado un tiempo desde que escribí o volví a visitar la respuesta y me perdí que había dejado el eco allí.
Jay Blanchard

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

11

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

44
@panjehra mysql_ * se depica ahora y se eliminará de php 7. Use mysqli_ * en su lugar
Manoj Kumar

9

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:

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

2
No utilices este código. Está abierto a ataques de inyección SQL.
Brad

9

Asegúrese de no cerrar la base de datos utilizando db_close () antes de ejecutar su consulta

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.


7

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.


6

Verifique 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 LIKEtipo de valor, debe escribir:

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

3
Este código está abierto a la inyección SQL y no debe usarse.
Brad

5

También puede verificar si $resultestá fallando así, antes de ejecutar la matriz de búsqueda

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

3
No utilices este código. Está abierto a ataques de inyección SQL.
Brad

Pero si el código funciona, creo que debería editar el código e ingresar los filtros necesarios en lugar de castigar el código.
usuario28864

El uso simple de filtros no arreglará lo que está mal con este código. La mejor solución es usar consultas preparadas / parametrizadas con PDO o similar. No veo ningún punto en solucionarlo, ya que la respuesta correcta ya se ha publicado aquí. Idealmente, esta respuesta se eliminará. Sin embargo, puede corregir su respuesta y felizmente la votaré si es correcta.
Brad

Bueno, si crees que no vale la pena considerar la respuesta, puedes seguir adelante y leerla. Sin embargo, pensé que el objetivo de esta comunidad es compartir y aportar conocimiento. Si tiene algo que compartir en lugar de mostrar y desanimar a la gente.
usuario28864

2
Tienes razón, el objetivo de esta comunidad es compartir el conocimiento. Es por eso que agregué una explicación con mi voto negativo, y expliqué por qué su sugerencia de filtro no era suficiente. Prefiero alertarle, junto con cualquier otra persona que encuentre su respuesta, que el código anterior es inseguro. Es mejor que todos aprendan los métodos correctos en lugar de perpetuar el código incorrecto. Y no puedo eliminar tu respuesta, ni yo tampoco. Eso depende de ti, si eliges hacerlo.
Brad

3

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.

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 repita esa variable. Entonces pasa a mysql_query($query_variable);.

2
1) No sabe si he votado o no por una respuesta aquí, arriba o abajo. 2) Como expliqué en mi primer comentario; su respuesta no hace referencia al problema ( booleano pasado a mysql_fetch_array ) y tiene errores de sintaxis
Phil

2
Tiene comillas incorrectas en ambos ejemplos de código. El resaltado de sintaxis aplicado a su segundo bloque de código es un regalo obvio de que algo anda mal
Phil

44
Este código está sujeto a la inyección de SQL y no debe usarse. @EngrZardari si está utilizando este código en sus sistemas de producción, indudablemente ha sido pirateado y debe remediar la situación comprando utilizando consultas preparadas / parametrizadas con PDO o similar. Hay bots que tienen pruebas automatizadas para tales vulnerabilidades.
Brad

1
@EngrZardari Acerca de su "no hay ningún error, he pegado aquí el código que estoy usando actualmente". comentar arriba. Faltaba una cita en la consulta que corrigí. Eso habría arrojado un error de análisis (PHP).
Funk Forty Niner el

2

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);

error_reporting(E_ALL);

$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$result = $pdo->query('select emal from users');
$data = $result->fetchAll();

Esto le mostrará lo siguiente:

Error grave: excepción no detectada 'PDOException' con el mensaje 'SQLSTATE [42S22]: columna no encontrada: 1054 columna desconocida' emal 'en' lista de campos '' en E: \ htdocs \ test \ mysql_errors \ pdo.php en la línea 8

PDOException: SQLSTATE [42S22]: Columna no encontrada: 1054 Columna desconocida 'emal' en 'lista de campos' en E: \ htdocs \ test \ mysql_errors \ pdo.php en la línea 8

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ás

Error fatal: Llamar a una función miembro fetchAll () en boolean en E: \ htdocs \ test \ mysql_errors \ pdo.php en la línea 9

Para mysqli : usomysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

error_reporting(E_ALL);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');

$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();

Conseguirás

Error grave: excepción no detectada 'mysqli_sql_exception' con el mensaje 'Columna desconocida' emal 'en' lista de campos '' en E: \ htdocs \ test \ mysql_errors \ mysqli.php en la línea 8

mysqli_sql_exception: columna desconocida 'emal' en 'lista de campos' en E: \ htdocs \ test \ mysql_errors \ mysqli.php en la línea 8

Sin mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);ti solo obtienes

Error fatal: Llame a una función miembro fetch_all () en boolean en E: \ htdocs \ test \ mysql_errors \ mysqli.php en la línea 10

Por 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.


1

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

3
Este código está sujeto a ataques de inyección SQL y no debe usarse.
Brad
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.