2010-11-30 5 views
0

Ich verwende seit vielen Jahren ADOdb als meine Datenbankabstraktion und Query Caching-Ebene. In letzter Zeit wechselte ich zu vorbereiteten Aussagen, hauptsächlich aus Gründen der Sicherheit, und wurde neugierig, wie sie implementiert werden (oder nicht).Wie überprüfe ich nach emulierten vorbereiteten Anweisungen in ADOdb?

Zitat aus der Dokumentation für die Prepare Methode: "Gibt ein Array mit der ursprünglichen SQL-Anweisung im ersten Array-Element; Die übrigen Elemente des Arrays sind treiberabhängig. Wenn ein Fehler auftritt oder Prepare() emuliert wird, geben wir die ursprüngliche $ sql-Zeichenfolge zurück.

Testen der Anweisung Variable mit:

$stmt = $db->Prepare("SELECT * FROM pages WHERE id = ?"); 
print_r($stmt); 

auf Verbindungen mit‚mysql‘geöffnet oder‚mysqli‘Parameter ist nur die ursprüngliche Abfrage-String zurückgegeben wird - also die vorbereitete Anweisung emuliert wird, denke ich. Eine Verbindung geöffnet mit ‚pdo_mysql‘ zurückkehrt (von print_r()):

Array (
    [0] => SELECT * FROM pages WHERE id = ? 
    [1] => PDOStatement Object ([queryString]=>SELECT * FROM pages WHERE id = ?) 
) 

Kann ich dies als ein definitiver Beweis einer wirklichen vorbereitete Anweisung? Wenn nicht, weiß jemand eine schnelle und schmutzige Möglichkeit, Server-Seite zu überprüfen (etwas, in dem Abfrageprotokoll oder vielleicht in MySQLProxy suchen)? Ich habe versucht, die Bibliothek Quelle zu lesen, bekam aber auf halbem Weg verloren ...

Antwort

0

Kann ich dies als ein definitiver Beweis einer echten vorbereitete Anweisung

Wie Dokumentationen sagt, wenn Sie versuchen, Anweisung zur Vorbereitung Bei Verwendung eines Treibers, der keine vorbereiteten Anweisungen unterstützt, wird nur die angegebene Abfrage zurückgegeben, andernfalls das Array mit der Abfrage als erstes Element. Um zu überprüfen, ob die vorbereitete Anweisung emuliert wird, überprüfen Sie einfach, ob $stmt Array ist. Ich nehme an, Sie würden nicht, indem ein Array herzustellen versuchen, so sollte diese sein genug:

$stmt = $db->Prepare("SELECT * FROM pages WHERE id = ?"); 
if(is_array($stmt)){ 
    //prepared 
} 
else{ 
    //emulated 
} 

Wenn Sie sind verwirrt, warum Mysqli Treiber SQL trotz mysqli driver supporting prepared statements gibt es in Zeile 662 von Treiber erklärt hat /adodb-mysqli.inc.php:

// Prepare() not supported because mysqli_stmt_execute does not return a recordset, but 
// returns as bound variables. 
+0

Nun ging ich auf einem Test binge das Abfrageprotokoll in MySQL einrichten und versucht, verschiedene Verbindungen: die ganze Angelegenheit ist chaotischer als ich dachte! ADOdb mit dem Treiber pdo_mysql gibt tatsächlich eine Anweisung PDO-> prepare() aus - es ist PDO itsef, das dann eine vorbereitete Anweisung emuliert! Es scheint, dass die einzige Möglichkeit, echte PS zu haben, native mysqli-Funktionen sind und auf SELECT * verzichten. – djn