Mysql
 sql >> Base de données >  >> RDS >> Mysql

Obtenir une chaîne de requête SQL brute à partir d'instructions préparées par PDO

Je suppose que vous voulez dire que vous voulez la requête SQL finale, avec des valeurs de paramètre interpolées. Je comprends que cela serait utile pour le débogage, mais ce n'est pas ainsi que fonctionnent les instructions préparées. Les paramètres ne sont pas combinés avec une instruction préparée côté client, donc PDO ne devrait jamais avoir accès à la chaîne de requête combinée avec ses paramètres.

L'instruction SQL est envoyée au serveur de base de données lorsque vous préparez() et les paramètres sont envoyés séparément lorsque vous exécutez(). Le journal des requêtes générales de MySQL affiche le SQL final avec des valeurs interpolées après l'exécution (). Vous trouverez ci-dessous un extrait de mon journal de requête général. J'ai exécuté les requêtes depuis la CLI mysql, pas depuis PDO, mais le principe est le même.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

Vous pouvez également obtenir ce que vous voulez si vous définissez l'attribut PDO PDO::ATTR_EMULATE_PREPARES. Dans ce mode, PDO interpole les paramètres dans la requête SQL et envoie la requête entière lorsque vous exécutez(). Ce n'est pas une véritable requête préparée. Vous contournerez les avantages des requêtes préparées en interpolant des variables dans la chaîne SQL avant execute().

Re commentaire de @afilina :

Non, la requête SQL textuelle n'est pas combiné avec les paramètres lors de l'exécution. Il n'y a donc rien que PDO puisse vous montrer.

En interne, si vous utilisez PDO::ATTR_EMULATE_PREPARES, PDO fait une copie de la requête SQL et y interpole les valeurs des paramètres avant de faire la préparation et l'exécution. Mais PDO n'expose pas cette requête SQL modifiée.

L'objet PDOStatement a une propriété $queryString, mais celle-ci n'est définie que dans le constructeur du PDOStatement et n'est pas mise à jour lorsque la requête est réécrite avec des paramètres.

Ce serait une demande de fonctionnalité raisonnable pour PDO de leur demander d'exposer la requête réécrite. Mais même cela ne vous donnerait pas la requête "complète" à moins que vous n'utilisiez PDO::ATTR_EMULATE_PREPARES.

C'est pourquoi je montre la solution de contournement ci-dessus consistant à utiliser le journal des requêtes générales du serveur MySQL, car dans ce cas, même une requête préparée avec des paramètres fictifs est réécrite sur le serveur, avec des valeurs de paramètres renseignées dans la chaîne de requête. Mais cela n'est fait que pendant la journalisation, pas pendant l'exécution de la requête.