2011-11-28 15 views
7

La comprensión de PDO que he tenido hasta ahora es que PDO usará declaraciones preparadas reales donde pueda, y las emulará donde no pueda. También entendí que, en lo que respecta a mysql, se usarían declaraciones realmente preparadas siempre que se estuviera comunicando con una versión de mysql que las respaldaba.PDO, Mysql y declaraciones preparadas nativas

De hecho, la página de manual de PHP para el controlador de MySQL PDO dice mucho. http://php.net/manual/en/ref.pdo-mysql.php

Sin embargo, en otra pregunta SO estaba ayudando en How to replace all occurencies of char with elements from array?, alguien hizo el comentario de que esto no es cierto, y que, de hecho, PDO emula las declaraciones preparadas al hablar con una base de datos MySQL.

No he tenido mucha suerte para encontrar evidencia para respaldar las afirmaciones hechas allí, pero me hizo descubrir que hay un atributo :: ATTR_EMULATE_PREPARES DOP que se puede configurar para cambiar la emulación declaración preparada.

¿cuál es la verdad del asunto? ¿Realmente PDO no usa declaraciones preparadas con mysql? De lo contrario, ¿se lo puede obligar a hacerlo y, de ser así, debería hacerlo? Siempre he supuesto que como mysql tiene declaraciones realmente preparadas, PDO las usaría, como se afirma en el manual. Es el manual inexacto?

EDITAR PARA AGREGAR: He leído algunos artículos recientemente que al menos dan una razón decente de por qué las consultas reales están deshabilitadas por defecto. Las secuencias de comandos PHP suelen ser de corta duración y solo se ejecutan durante el tiempo suficiente para generar una respuesta a una solicitud, después de lo cual se desasignan todos sus recursos. Para cualquier consulta que solo ejecute una vez por solicitud, en realidad tendría que ejecutar 2 comandos SQL (el comando prepare y el comando execute), por lo que para cualquier declaración preparada que solo se ejecute una vez probablemente obtendrá un rendimiento un poco peor que con la emulada declaración preparada. Para las consultas que deben ejecutarse en un bucle, las declaraciones preparadas reales probablemente tendrán un mejor rendimiento, pero estos casos son relativamente raros en el tipo de modelo de solicitud/respuesta para el cual PHP generalmente se utiliza.

Todavía creo que las declaraciones preparadas reales son preferibles, pero al menos tengo una explicación razonable de por qué PDO utiliza consultas emuladas de forma predeterminada.

Respuesta

5

¿Realmente PDO no utiliza declaraciones preparadas con mysql?

Sí, de manera predeterminada (al menos con la versión I probada) pero el modo nativo se puede activar manualmente.

Si no es así, se puede forzar a hacerlo

Empleando PDO::ATTR_EMULATE_PREPARES configuración, su nombre es bastante auto-explicativo.

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

debe hacer eso?

Esa es la pregunta más difícil de todas.
Bueno, yo diría que sí, deberías. Si elige PDO como su controlador de db, no tiene sentido usarlo en el modo de emulación.

+0

Gracias por la respuesta. Sin embargo, plantea la pregunta, si lo admite, ¿por qué está desactivado por defecto? – GordonM

+0

Es un problema de compatibilidad, creo. –

Cuestiones relacionadas