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
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