2010-05-10 13 views
5

Il PDO di PHP consente di eseguire più query contemporaneamente, tramite il metodo query() o come istruzione preparata. Entrambi gli esempi seguenti lavoro:Il PDO di PHP può essere limitato a una singola query?

// 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(); 

Esiste un modo per limitare DOP a una singola query in un momento, molto simile alla mysql_query() è?

risposta

6

Questa è una risposta più aggiornata a questa domanda.

Il vecchio modo di impedire l'esecuzione di più query era disabilitare i preparati emulati, tuttavia questo era applicabile solo al metodo PDO::prepare(). Nelle versioni più recenti di PHP (> = 5.5.21 e> = 5.6.5), è stata introdotta una nuova costante per disabilitare l'esecuzione di più query in entrambi PDO::prepare() e PDO::query(). (Le costanti non vengono in genere aggiunte nelle versioni di patch, ma ciò è stato fatto a causa della gravità di uno Drupal SQL injection attack determinato da questa funzionalità).

La nuova costante è PDO::MYSQL_ATTR_MULTI_STATEMENTS e deve essere impostato sulla creazione oggetto (come quarto argomento al costruttore DOP) - porla su un oggetto preesistente con PDO::setAttribute() non funzionerà.

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

Non ho trovato nulla su PDO :: MYSQL_ATTR_MULTI_STATEMENTS nella documentazione di PHP. ma l'ho provato e funziona; –

+0

Non sapevo che non fosse ancora stato documentato. L'ho aggiunto alla [pagina delle costanti di MySQL] (http://php.net/manual/en/ref.pdo-mysql.php) - dovrebbe essere visibile in un paio d'ore. – tpunt

6

Mmm, c'è un modo per ottenere questo disabilitando l'emulazione di istruzioni preparate in PDO per renderlo utilizzare l'API mysql nativo invece (multi-interrogazione non è supportata in istruzioni preparate lato server):

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

Tuttavia, uno degli svantaggi di questa opzione è che la cache della query viene persa.

+1

"A partire dalla 5.1.17, preparato dichiarazioni utilizzare la cache delle query a determinate condizioni" - http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html – VolkerK

+0

Non c'è modo di prevenirlo tramite il metodo query()? –

+0

Non lo so, a meno che non si utilizzi un codice personalizzato per filtrare in precedenza la stringa della query. – nuqqsa