Nous utilisons Doctrine, un ORM PHP. Je crée une requête comme celle-ci:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
puis dans la fonction, j'ajoute diverses clauses where et des choses comme il convient, comme ceci
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Plus tard, avant de execute()
lancer cet objet de requête, je veux imprimer le SQL brut afin de l'examiner, et faire ceci:
$q->getSQLQuery();
Cependant, cela n'imprime que l'instruction préparée, pas la requête complète. Je veux voir ce qu'il envoie à MySQL, mais à la place, il imprime une instruction préparée, y compris celle ?
de. Existe-t-il un moyen de voir la requête «complète»?
Réponses:
Doctrine n'envoie pas une "vraie requête SQL" au serveur de base de données: elle utilise en fait des instructions préparées, ce qui signifie:
$query->getSql()
)$query->getParameters()
)Cela signifie qu'il n'y a jamais de "vraie" requête SQL du côté PHP - donc, Doctrine ne peut pas l'afficher.
la source
$query->getParameters();
ne renverra PAS les paramètres dans le bon ordre, car ils devraient apparaître dans l'instruction de requête préparéeUn exemple de travail:
la source
Vous pouvez vérifier la requête exécutée par votre application si vous enregistrez toutes les requêtes dans mysql:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
il y aura plus de requêtes non seulement celle que vous recherchez, mais vous pouvez la grep.
mais
->getSql();
fonctionne généralementÉditer:
pour voir toutes les requêtes mysql que j'utilise
et ajoutez ces 2 lignes:
et redémarrez mysql
la source
J'ai créé un enregistreur Doctrine2 qui fait exactement cela. Il «hydrate» la requête sql paramétrée avec les valeurs en utilisant les propres convertisseurs de type de données de Doctrine 2.
Exemple d'utilisation :; La paix de code suivante fera écho sur la sortie standard de toutes les phrases SQL INSERT, UPDATE, DELETE générées avec $ em Entity Manager,
la source
getSqlQuery()
affiche techniquement toute la commande SQL, mais c'est beaucoup plus utile lorsque vous pouvez également voir les paramètres.Pour rendre ce modèle plus réutilisable, il existe une belle approche décrite dans les commentaires de Raw SQL de Doctrine Query Object .
la source
$q
. Cela ne semble pas être la requête ni le générateur de requêtes.$q
dans ce cas, il s'agit d'une requête Doctrine 1. Vous utilisez peut-être Doctrine 2, auquel cas vous voudrez quelque chose comme$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Espérons que cela aide!Il n'y a pas d'autre vraie requête, c'est ainsi que fonctionnent les instructions préparées. Les valeurs sont liées dans le serveur de base de données, pas dans la couche application.
Voir ma réponse à cette question: En PHP avec PDO, comment vérifier la requête paramétrée SQL finale?
(Répété ici pour plus de commodité :)
la source
Ma solution:
Exemple d'utilisation:
la source
Vous pouvez facilement accéder aux paramètres SQL en utilisant l'approche suivante.
Donc, si vous avez imprimé le
$param_values
et$col_names
, vous pouvez obtenir les valeurs des paramètres en passant par le sql et les noms de colonne respectifs.Remarque: si
$param
renvoie un tableau, vous devez réitérer, car les paramètres à l'intérieur sontIN (:?)
généralement sous forme de tableau imbriqué.En attendant, si vous avez trouvé une autre approche, merci de bien vouloir partager avec nous :)
Je vous remercie!
la source
Solution plus claire:
la source
la source
Vous pouvez utiliser :
Si vous utilisez MySQL, vous pouvez utiliser Workbench pour afficher les instructions SQL en cours d'exécution. Vous pouvez également utiliser afficher la requête en cours à partir de mysql en utilisant ce qui suit:
la source
Peut-être que cela peut être utile pour quelqu'un:
la source
TL; DR
dans vos fichiers twig, utilisez les filtres twig helpers de Doctrine:
Explication:
Les autres réponses mentionnant que l'instruction Prepared sont en fait de "vraies requêtes" sont correctes, mais elles ne répondent pas aux attentes évidentes du demandeur ... Chaque développeur veut afficher une "requête exécutable" pour le débogage (ou l'afficher à l'utilisateur) .
J'ai donc regardé la source du profileur Symfony pour voir comment ils le faisaient. La partie Doctrine est de la responsabilité de Doctrine, ils ont donc créé un ensemble de doctrine à intégrer à Symfony. En regardant le
doctrine-bundle/Resources/views/Collector/db.html.twig
fichier, vous découvrirez comment ils le font (cela peut changer d'une version à l'autre). Fait intéressant, ils ont créé des filtres de brindilles que nous pouvons réutiliser (voir ci-dessus).Pour que tout fonctionne, nous devons activer la journalisation pour notre requête. Il existe plusieurs façons de le faire et j'utilise ici DebugStack qui permet de journaliser les requêtes sans les imprimer. Cela garantit également que cela fonctionnera en mode production si c'est ce dont vous avez besoin ...
Si vous avez besoin d'un formatage supplémentaire, vous verrez qu'ils incluent du CSS dans une balise de style, alors "volez-le" simplement ^^:
J'espère que cela aidera ;-)
la source
J'ai écrit un simple enregistreur, qui peut enregistrer une requête avec des paramètres insérés. Installation:
Usage:
la source
la source
Fonction @dsamblas modifiée pour fonctionner lorsque les paramètres sont des chaînes de date comme celle-ci '2019-01-01' et lorsqu'un tableau est passé en utilisant IN comme
. Alors faites tout ce que dsamblas a écrit, mais remplacez startQuery par celui-ci ou voyez les différences et ajoutez mon code. (au cas où il aurait modifié quelque chose dans sa fonction et que ma version n'aurait pas de modifications).
Je n'ai pas beaucoup testé.
la source
J'ai fait des recherches sur ce sujet, car je voulais déboguer une requête SQL générée et l'exécuter dans l'éditeur SQL. Comme on le voit dans toutes les réponses, c'est un sujet très technique.
Quand je suppose que la question initiale est basée sur dev-env, une réponse très simple manque pour le moment. Vous pouvez simplement utiliser la compilation dans le profileur Symfony. Cliquez simplement sur l'onglet Doctrine, faites défiler jusqu'à la requête que vous souhaitez inspecter. Cliquez ensuite sur "afficher la requête exécutable" et vous pourrez coller votre requête directement dans votre éditeur SQL
Plus d'approche de base de l'interface utilisateur mais très rapide et sans surcharge de code de débogage.
la source
la source
Pour imprimer une requête SQL dans Doctrine, utilisez:
la source