2010-05-10 15 views
5

La PDO de PHP permite que se ejecuten varias consultas a la vez, ya sea a través del método query() o como una declaración preparada. Ambos de los siguientes ejemplos de trabajo:¿Puede la PDO de PHP estar limitada a una sola consulta?

// Two SQL queries 
$query = "SELECT * FROM table; DROP table;" 

// Execute via query() 
$pdo->query($query); 

// Execute via prepared statement 
$stmt = $pdo->prepare($query); 
$stmt->execute(); 

¿Hay alguna manera de limitar DOP a una sola consulta a la vez, al igual que el mysql_query() es la función?

Respuesta

6

Esta es una respuesta más actualizada a esta pregunta.

La antigua forma de evitar la ejecución de consultas múltiples era deshabilitar preparaciones emuladas, sin embargo, esto solo se aplicaba al método PDO::prepare(). En las versiones más nuevas de PHP (> = 5.5.21 y> = 5.6.5), se ha introducido una nueva constante para deshabilitar esta ejecución de consulta múltiple en PDO::prepare() y PDO::query(). (Las constantes generalmente no se agregan en las versiones de parche, pero esto se hizo debido a la gravedad de un Drupal SQL injection attack provocado por esta capacidad).

La nueva constante es PDO::MYSQL_ATTR_MULTI_STATEMENTSy debe ser encuentra en la creación de objetos (como el cuarto argumento al constructor de PDO) - colocarlo en un objeto preexistente con PDO::setAttribute() no funcionará.

$pdo = new PDO('mysql:host=_;dbname=_', '', '', [PDO::MYSQL_ATTR_MULTI_STATEMENTS => false]); 
+0

No encontré nada sobre PDO :: MYSQL_ATTR_MULTI_STATEMENTS en la documentación de PHP. pero lo intenté y funciona; –

+0

No sabía que aún no había sido documento. Lo he agregado a [la página de constantes de MySQL] (http://php.net/manual/en/ref.pdo-mysql.php) - debería ser visible en un par de horas. – tpunt

6

Mmm, hay una manera de lograr esto mediante la desactivación de la emulación de comandos preparados en PDO a hacer que use la API MySQL nativo en lugar (multi-consulta no es compatible con comandos preparados en el servidor):

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

Sin embargo, uno de los inconvenientes de esta opción es que se pierde el caché de consultas.

+1

"A partir de 5.1.17, preparado estados utilizan el caché de consultas bajo ciertas condiciones" - http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html – VolkerK

+0

Sin embargo, no hay manera de evitarlo mediante el método query() –

+0

No es que yo sepa, a menos que use algún código personalizado para filtrar previamente la cadena de consulta. – nuqqsa