Foros del Web » Programando para Internet » PHP »

PDO::quote error

Estas en el tema de PDO::quote error en el foro de PHP en Foros del Web. Hola, he empezado con PDO y al insertar un valor para que no realizen inyecciones SQL en la sentencia utilizo $connection->quote($_POST['user'] pero me da el ...
  #1 (permalink)  
Antiguo 21/08/2013, 06:09
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
PDO::quote error

Hola, he empezado con PDO y al insertar un valor para que no realizen inyecciones SQL en la sentencia utilizo $connection->quote($_POST['user'] pero me da el siguiente error:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Mensaje enviado desde el input'', 'password')' at line 1' in C:\xampp\htdocs\index.php:5 Stack trace: #0 C:\xampp\htdocs\index.php(5): PDO->exec('INSERT INTO use...') #1 {main} thrown in C:\xampp\htdocs\index.php on line 5

Código PHP:
Ver original
  1. <?php
  2. if(isset($_POST['submit'])){
  3.     $connection = new PDO("mysql:host=localhost;dbname=PDO","root","");
  4.     $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.     $result = $connection->exec("INSERT INTO user(id,username,password) VALUES ('', '".$connection->quote($_POST['user'])."', 'password')");
  6. }
  7. ?>
  8. <form action="" method="post">
  9.     <input name="user">
  10.     <input name="submit" type="submit">
  11. </form>

He buscado en google pero no encontre nada
  #2 (permalink)  
Antiguo 21/08/2013, 06:17
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: PDO::quote error

La función QUOTE, como sabes es para que el string aparezca con COMILLAS

$palabra = 'HOLA';
print $palabra; // HOLA
print $conn->quote($palabra); // 'HOLA'

puede que por ahí pase el tema, ya que estás intentado traer una variable con comillas que no están escapadas, o sea traes algo como:

INSERT INTO user(id,username,password) VALUES ('', ' 'PEDRO' ', 'password')"...

y eso genera un error de sintaxis y de seguridad, en todo caso, si quieres insertar en tu base de datos con comillas usa otro tipo de filtro fuera de la consulta SQL...
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #3 (permalink)  
Antiguo 21/08/2013, 06:20
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: PDO::quote error

Yo esque en MySQLi utilizaba mysqli_real_escape_string para filtrar las variables pero me digieron que en PDO se utilizaba quote. ¿Sabes cual se utiliza?
  #4 (permalink)  
Antiguo 21/08/2013, 06:48
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: PDO::quote error

No suelo utilizar mucho el PDO para generar código de cero, ya me vienen generados, o bien me valgo de algunos Frameworks que lo generan, pero alguna vez leí algo acerca de PREPARED STATMENTS de PDO... fijate en el manual a ver que encuentras según tu necesidad y vemos si se puede solucionar..

http://php.net/manual/en/pdo.prepared-statements.php

Si te fijas en la introducción hay algo que dice:

"The parameters to prepared statements don't need to be quoted; the driver automatically handles this. If an application exclusively uses prepared statements, the developer can be sure that no SQL injection will occur (however, if other portions of the query are being built up with unescaped input, SQL injection is still possible)."

Por ende creo que mirando un poco la función PREPARE puedes lograr tu objetivo.
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #5 (permalink)  
Antiguo 21/08/2013, 07:21
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: PDO::quote error

Código PHP:
<?php
if(isset($_POST['submit'])){
    
$connection = new PDO("mysql:host=localhost;dbname=PDO","root","");
    
$connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    
$stmt $connection->prepare("INSERT INTO user (username, password) VALUES (:name, :value)");
    
$stmt->bindParam(':name'$name);
    
$stmt->bindParam(':value'$value);

    
// insert one row
    
$name $_POST['user'];
    
$value 1;
    
$stmt->execute();
}
?>
<form action="" method="post">
    <input name="user">
    <input name="submit" type="submit">
</form>
Al guardar ' no me sale error en la sentencia, sino que se me guarda en al base de dato como '

Pero si hago una sentencia si filtrar si me sale error.

Seguire buscando
  #6 (permalink)  
Antiguo 21/08/2013, 07:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO::quote error

Pero si estás cometiendo un tremendo error.

¿Si sabes que los programas se ejecutan de arriba hacia abajo?

Bueno, pues lo que sucede es que las variables que utilizas con bindParam() las defines después de utilizarlas y eso jamás va a funcionar.

Es bien fácil corregir eso: primero defines las variables, y luego las usas.

Código PHP:
Ver original
  1. // MAL
  2. foo($bar);
  3. $bar = 'baz';
  4.  
  5. // BIEN
  6. $bar = 'baz';
  7. foo($bar);

Repito: primero defines las variables, y luego las usas.

¿Se entiende?

Y eso es básico en el mundo de la programación, ya ni se diga de cualquier lenguaje de programación.

Si sigues cometiendo errores tan básicos no vas a llegar muy lejos, primero deberías estudiar algo de teoría general acerca de programar, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 21/08/2013, 07:41
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: PDO::quote error

Pero si funcionar si funciona, lo que pasa que al introducir un ' se guarda tal cual y no como \'


Tambien probe

Código PHP:
<?php
if(isset($_POST['submit'])){
    
$connection = new PDO("mysql:host=localhost;dbname=PDO","root","pepepepe3");
    
$connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    
$query $connection->prepare("INSERT INTO user (username) VALUES (:user)");
    
$query->execute(array(':user' => $_POST['user'])); 
    echo 
$query->execute(array(':user' => $_POST['user']));
}
?>
<form action="" method="post">
    <input name="user">
    <input name="submit" type="submit">
</form>
Me guarda los datos ingresados pero parece que no filtra el ' -> \'
  #8 (permalink)  
Antiguo 21/08/2013, 07:48
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO::quote error

Cita:
Iniciado por XD2XD2 Ver Mensaje
Pero si funcionar si funciona, lo que pasa que al introducir un ' se guarda tal cual y no como \'
Estás confundido, sí debe guardarte el apóstrofo como tal fue introducido, que esperes ver un \' en la BD es un error de concepto y ese es tu principal problema: careces de conceptos fundamentales.

En el fondo la consulta es algo así:
Cita:
VALUES('\'')
Y ahí sí viene escapado, porque precisamente PDO hace el trabajo de escapar dichos caracteres para insertarlos correctamente en le BD.

No esperes ver \' en la BD si escribiste ' porque eso jamás va a pasar.

Estudia algo básico sobre base de datos, te hace falta.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 21/08/2013, 07:53
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: PDO::quote error

Gracias, entonces la consulta seria:

INSERT INTO user (username) VALUES ('\'')");

Para que no se producen inyecciones SQL pero después en la base de dato se introduce como '

¿Cierto no? Muchísimas gracias
  #10 (permalink)  
Antiguo 21/08/2013, 08:00
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: PDO::quote error

A mi me an funcionado de dos maneras:

Código PHP:
$query $connection->prepare("INSERT INTO user (username) VALUES (:user)");
$query->execute(array(':user' => $_POST['user'])); 
Código PHP:
$connection->exec("INSERT INTO user(username) VALUES ( ".$connection->quote('PDO '.$_POST['user']).")"); 
¿Tu cual sueles utilizar? Yo esque lo que he visto siempre a sido la 1 opcion, pero en php dice: PDO::quote() entrecomilla el string de entrada (si fuera necesario) y escapa los caracteres especiales contenidos en dicho string, usando un estilo de entrecomillado apropiado para el controlador subyacente.

Si se usa esta función para construir sentencias SQL, se recomienda encarecidamente usar PDO::prepare() para preparar sentencias SQL con los parámetros vinculados en vez de usar PDO::quote() para interpolar entradas del usuario en una consulta SQ


Entonces en mi opinion la mejor forma es la primera.
  #11 (permalink)  
Antiguo 21/08/2013, 08:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO::quote error

La primer forma siempre será la mas elegante, y además como bien citas al manual siempre hace uso de quote().

Es decir, la segunda forma es mas "a mano" y la primera es auto-mágica.

Así que efectivamente ambas producen lo mismo.

Aunque esto está mal:
Código PHP:
Ver original
  1. // MAL
  2. quote('PDO '.$_POST['user'])
  3.  
  4. // BIEN
  5. quote($_POST['user'])
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 21/08/2013, 08:21
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: PDO::quote error

Si, esque hice uno con PDO y otor con MySQLi entonces para saber cual se guardaba pues puse eso.

En el manual de php dice que si quiero filtrar las variable utilize prepare();

exec(); para saber el numero de campos afectados.
prepare(); Si se ejecuta mas de 1 vez la sentencia
query(); Si se ejecuta 1 vez la sentencia

Pero en el manual de php digo claramente que si vas a filtrar variable es mejor utilizar prepare();, pero que pasa si quiero filtrar la variable y solo se ejecuta 1 vez. Yo seguiria utilizando prepare(); ¿O estoy equivocado?

Etiquetas: mysql, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:55.