Pregunta

LEA la pregunta detenidamente. No es habitual tonto "mi código no funciona !!!" cuestión.

Al ejecutar este código con 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();
}

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 pensé durante años que consulta y los datos que se envían al servidor separado y nunca interfieren. Por lo tanto tengo algunas preguntas (aunque dudo que alguien tiene una respuesta ...)

  1. ¿De dónde obtiene una representación de cadena tan familiar - citó y se escapó? ¿Se está hecha especialmente para informar de un error o es una parte de la consulta real?
  2. ¿Cómo funciona en realidad? Qué se sustituya por un marcador de posición con los datos o no?
  3. ¿Hay una manera de conseguir consulta completa, no sólo poco de ella, para fines de depuración?

Actualizar

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

¿Fue útil?

Solución

trate de añadir

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

;)

Otros consejos

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

  1. La cita ocurre en el lado de la base de datos. La base de datos se escapa y desinfecta todos los valores (véase el punto 2) que recibe de modo que consiga interpretado correctamente. El momento en que se genera el error, la base de datos (en este caso MySQL) imprime la consulta se trató de correr. Esto no sería tan útil si sólo mostró la parte preparada.

  2. No, no lo hace. A la hora de preparar la consulta se compila en el lado del servidor. Cuando se ejecuta una consulta con los valores, sólo los valores se transmiten. Esto es más o menos lo mismo que llamar a preparar y ejecutar 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 a un archivo de registro (my.cnf comprobar los ajustes para eso). Pero también se puede utilizar debugDumpParams () en el lado PHP.

Espero que esto era un poco de ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top