¿Cómo debo escribir PHP $ _POST vars en una function mysql_query?

Al acceder a mi database, el usuario completa un formulario y en la página de destino los valores publicados se utilizan en la consulta MySQL resultante.

$query = mysql_query("SELECT pass FROM database WHERE user='$_POST[user]'"); 

Sin embargo, por alguna razón u otra, a MySQL no le gusta que use una variable $ _POST en el command, y solo funciona si defino (por ejemplo) $user = $_POST['user']; , y luego pon $ usuario directamente en el command SQL.

Por otro lado, puedo usar los valores $ _POST en las instrucciones INSERT donde no se requieren nombres de columna específicos:

 $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', '$_POST[user]'"); 

Si bash una instrucción INSERT donde los attributes están definidos (por ejemplo, user='foo' ), entonces aparece el mismo problema.

¿Qué estoy haciendo mal en mi consulta SQL que hace que el command se equivoque al ejecutarlo, pero funciona con el método específico de formatear un command INSERTAR?

Con suerte, no es "mala suerte, parece que tienes que asignar todos tus valores publicados". Je.

¡Primero, ten cuidado con las inyecciones de SQL !

Ahora, para responder a su pregunta, intente hacer esto en su lugar:

 $query = mysql_query("SELECT `pass` FROM `database` WHERE `user` LIKE '" . mysql_escape_string($_POST['user']) . "';"); 

Estabas haciendo un par de cosas mal:

  • utilizando el operador = lugar del operador LIKE
  • no adjuntando el valor en la consulta SQL con '
  • no adjuntando el índice de usuario en la matriz $_POST con '

PD: ¡Deberías usar mysql_real_escape_string() lugar de mysql_escape_string() !

Simplemente está insertando una variable en una cadena, por lo que no debería importar en qué command lo esté poniendo.

Hay algunos problemas para señalar.

Primero, es posible que desee usar el formatting {} para variables de matriz. No utiliza comillas alnetworkingedor de los nombres de teclas de arrray en este formatting.

 $query = mysql_query("SELECT pass FROM database WHERE user='{$_POST[user]}'") 

Dos, nunca querría hacer una consulta como esa porque está abierto a los agujeros de inyección sql. Considere, ¿qué pasaría si $ _POST ['user'] fuera "vaca", drop table database; – "?

Debe ejecutar mysql_real_escape_string en la input POST antes de ponerlo en su consulta, o verificar usando PHP PDO con declaraciones preparadas.

Una forma de formatear la cadena que proporciona un poco de estructura es usar sprintf.

 $query=mysql_query(sprintf("SELECT pass FROM database WHERE user='%s'",mysql_real_escape_string($_POST['user']))); 
  1. Use PDO : proporciona una API mucho mejor para comunicarse con DB.
  2. Si está utilizando las funciones mysql_*() , siempre recuerde filtrar ( mysql_real_escape_string () ) cualquier información que provenga de una fuente no confiable (como el usuario)
  3. Presta más atención a cómo se ve tu código. Simplemente compare los siguientes listdos:

     $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ")"); $query = sprinf('INSERT INTO database VALUES ("foo", "bar", "%s", "%s", "%s")', mysql_real_escape(...), ...); 

    ¿Debo explicar cuál es mejor para leer, modificar o comprender?

¿Por qué no comprobar y ver lo que mysql_error () tiene que decir al respecto? Si su consulta no es válida, mysql_error () devolverá una buena cantidad de text que le indicará exactamente qué fue lo que salió mal.

En cuanto a que MySQL no le gusta el POST var, si lo inserta directamente para algunas ejecuciones, pero no para otras, entonces debe asegurarse de que está utilizando datos y configuraciones consistentes para cada testing. Si se realizan algunas testings con un GET, sus variables POST estarán vacías. Si usa diferentes nombres de usuario para cada testing, vea si lo que es consistente entre los que fallan.

Y como se mencionó anteriormente, lea acerca de la inyección de SQL y cómo su consulta solo está pidiendo ser subvertida por un usuario malintencionado.

Tratar

 $query = mysql_query("SELECT pass FROM database WHERE user=" . mysql_real_escape_string($_POST['user'])); 

y

 $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ")"); 

Siempre es una buena idea desinfectar todo lo recibido a través de $ _GET o $ _POST