2010-05-10 8 views
5

PHPs PDO ermöglicht die Ausführung mehrerer Abfragen gleichzeitig, entweder über die Methode query() oder als vorbereitete Anweisung. Die beiden folgenden Beispiele funktionieren:Kann PHP's PDO auf eine einzige Abfrage beschränkt werden?

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

Gibt es eine Möglichkeit PDO zu einer einzigen Abfrage zu einem Zeitpunkt, zu begrenzen, ähnlich wie die mysql_query() Funktion ist?

Antwort

6

Dies ist eine aktuellere Antwort auf diese Frage.

Die alte Methode, die Ausführung mehrerer Abfragen zu verhindern, bestand darin, emulierte Prepares zu deaktivieren. Dies galt jedoch nur für die Methode PDO::prepare(). In neueren Versionen von PHP (> = 5.5.21 und> = 5.6.5) wurde eine neue Konstante eingeführt, um diese Ausführung mehrerer Abfragen sowohl in PDO::prepare() als auch in PDO::query() zu deaktivieren. (Konstanten werden normalerweise nicht in Patch-Versionen hinzugefügt, aber dies wurde aufgrund des Schweregrads einer Drupal SQL injection attack, die durch diese Fähigkeit verursacht wird, durchgeführt).

Die neue Konstante ist PDO::MYSQL_ATTR_MULTI_STATEMENTS und muss auf Objekterstellung festgelegt werden (als vierte Argument für den PDO-Konstruktor) - auf ein bereits vorhandenes Objekt mit PDO::setAttribute() Einstellung wird nicht funktionieren.

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

Ich habe nichts über PDO :: MYSQL_ATTR_MULTI_STATEMENTS in der PHP-Dokumentation gefunden. aber ich habe es versucht und es funktioniert; –

+0

Mir war nicht bewusst, dass es noch kein Dokument war. Ich habe es auf der [Konstantenseite von MySQL] (http://php.net/manual/en/ref.pdo-mysql.php) hinzugefügt - es sollte in ein paar Stunden sichtbar sein. – tpunt

6

Mmm, ist es eine Möglichkeit, dies zu erreichen, durch die Emulation von vorbereiteten Anweisungen in PDO zu deaktivieren, um es den native MySQL-API zu verwenden, anstatt (Multi-Abfrage nicht in serverseitige vorbereiteten Anweisungen unterstützt wird):

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

Einer der Nachteile dieser Option ist jedoch, dass der Abfragecache verloren ist.

+1

„Beginnend mit 5.1.17 vorbereiteten Anweisungen die Abfrage-Cache unter bestimmten Bedingungen verwenden“ - http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html – VolkerK

+0

Es gibt jedoch keine Möglichkeit, dies mit der Methode query() zu verhindern. –

+0

Nicht, dass ich weiß, es sei denn, Sie verwenden einen benutzerdefinierten Code, um die Abfragezeichenfolge zuvor zu filtern. – nuqqsa