2010-11-30 34 views
0

J'ai utilisé ADOdb pendant de nombreuses années comme couche d'abstraction et de mise en cache de requêtes. Dernièrement, je suis passé à des instructions préparées, surtout pour des raisons de sécurité, et je suis devenu curieux de savoir comment elles sont (ou ne sont pas) implémentées.Comment puis-je vérifier les instructions préparées émulées dans ADOdb?

Citation de la documentation de la méthode Prepare: "Retourne un tableau contenant l'instruction SQL d'origine dans le premier élément du tableau; les éléments restants du tableau dépendent du pilote. S'il y a une erreur, ou que nous émulions Prepare(), nous retournons la chaîne $ sql d'origine. »

Test de la variable de requête avec:

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

Sur les connexions ouvertes avec le paramètre « mysql » ou « mysqli » seule la chaîne de requête d'origine est renvoyée - ce qui signifie la déclaration préparée est émulé, je suppose. Une connexion ouverte avec des retours « pdo_mysql » (de print_r()):

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

Puis-je prendre cela comme une preuve définitive d'une véritable déclaration préparée? Si ce n'est pas le cas, est-ce que quelqu'un sait d'une manière rapide et sale de vérifier côté serveur (quelque chose à rechercher dans le journal de requête, ou peut-être dans MySQLProxy)? J'ai essayé de lire la source de la bibliothèque, mais à mi-chemin ... me suis perdu

Répondre

0

Puis-je prendre cela comme une preuve définitive d'une véritable déclaration préparée

Comme dit documentation, si vous essayez de préparer la déclaration en utilisant un pilote qui ne supporte pas les instructions préparées, seule la requête donnée est renvoyée, sinon le tableau avec la requête en tant que premier élément. Donc, pour vérifier si l'instruction préparée va être émulée, vérifiez si $stmt est array. Je suppose que vous ne seriez pas essayer de préparer en passant un tableau, si celui-ci devrait être suffisant:

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

Si vous êtes confus pourquoi mysqli pilote retourne SQL malgré mysqli driver supporting prepared statements, il est expliqué dans la ligne 662 de conducteurs /adodb-mysqli.inc.php:

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

Eh bien, je suis allé sur une mise en frénésie de tests le journal des requêtes dans MySQL et d'essayer différentes connexions: toute l'affaire est messier que je pensais! ADOdb avec le pilote pdo_mysql émet en effet une instruction PDO-> prepare() - c'est un PDO itsef qui émule alors une instruction préparée! Il semble que la seule façon d'avoir du vrai PS est d'utiliser les fonctions natives de mysqli et de renoncer à SELECT *. – djn