sentencias preparadas ejemplos consultas consulta php pdo parameterized-query

preparadas - select pdo php



La forma en que funciona la consulta parametrizada PDO (2)

POR FAVOR, LEA LA PREGUNTA CUIDADOSAMENTE. No es una tontería habitual "¡mi código no funciona!" pregunta.

Cuando ejecuto este código con el error previsto

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

Recibo este mensaje de error

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

Pero durante años pensé que la consulta y los datos se envían al servidor por separado y nunca interfieren. 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 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, con fines de depuración?

Actualizar

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


No estoy seguro de todos los detalles, pero intentaré responder.

  1. La cita 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ás usando. 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 PHP.

Espero que esto haya sido útil.


intente agregar

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

;)