2010-09-16 16 views
8

LEA LA PREGUNTA CUIDADOSAMENTE. No es una tontería habitual "¡mi código no funciona!" pregunta.La forma en que funciona la consulta parametrizada de PDO

Cuando ejecuto este código con la intención de error

try { 
    $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) "); 
    $sth->execute(array("I'm","d'Artagnan")); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

me sale este mensaje de error

Usted tiene un error en su sintaxis SQL ... cerca de 'INN (' I \ 'm', 'd \' Artagnan ')' en la línea 1

Pero durante años he pensado que la consulta y los datos se envían al servidor por separado y nunca interferir Por lo tanto, tengo algunas preguntas (aunque dudo que alguien haya recibido una respuesta ...)

  1. ¿De dónde saca una representación de cadena tan familiar - citada y escapada? ¿Se está haciendo especialmente para informar un error o es parte de una consulta real?
  2. ¿Cómo funciona en la realidad? ¿Sustituye a un marcador de posición con datos o no?
  3. ¿Hay alguna manera de obtener una consulta completa, no solo un poco, para la depuración?

actualización

mysqli lo hace como se esperaba: se emite un error dice near 'INN(?,?)'

+0

@DrColossos tiene la respuesta, @Cassy tiene la explicación. –

Respuesta

7

intento de añadir

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

;)

+0

¡Bingo! Estaba a punto de escribir otra actualización, exactamente sobre este tema, apuntando al segundo párrafo en esta página de manual http://php.net/manual/en/ref.pdo-mysql.php y preguntar si hay una forma de probar qué modo está activado Acabo de probar tu código y funcionó. no se ha escapado de la cadena en el mensaje de error –

+0

, en realidad ha resuelto mi otra pregunta también :) –

7

No estoy seguro acerca de todos los detalles, pero voy a tratar de responder.

  1. La cotización ocurre en el lado de la base de datos. La base de datos escapa y desinfecta todos los valores (ver viñeta 2) que recibe para que se interprete correctamente. En el momento en que se produce el error, la base de datos (en este caso MySQL) imprime la consulta que intentó ejecutar. Esto no sería tan útil si solo mostrara la parte preparada.

  2. No, no es así. En el momento de la preparación, la consulta se compila en el servidor. Cuando una consulta se ejecuta con valores, solo se transmiten los valores. Esto es más o menos lo mismo que llamar PREPARE y EXECUTE en la base de datos directamente.

  3. Esto depende de la base de datos que esté utilizando. MySQL, por ejemplo, puede registrar todas las consultas en un archivo de registro (verifique la configuración de my.cnf para eso). Pero también puedes usar debugDumpParams() en el lado PHP.

Espero que haya sido un poco útil.

+0

Gracias por la respuesta sensata. No puedo atar 1 y 2 juntos. ¿Significa que al final es lo mismo que citar/escapar, pero acaba de hacer en el lado del servidor? –

+1

+1 para responder a la (s) pregunta (s) real (es) y no enfocarse en la cosa IN/INN ..ya que la primera oración explica que el error de sintaxis es * intencional * – Jake

+0

@Col. Metralla: para la base de datos 1 y 2 son dos comandos distintos. El primero "registra" una consulta (metafóricamente como una función si lo desea), la segunda le pasa parámetros. En este enfoque, la base de datos sabe exactamente qué parte de la consulta puede/debe/debe citar. No podría hacer esto en una consulta combinada. –

Cuestiones relacionadas