IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Obtenir la requête SQL générée [ZF 1.10]


Sujet :

Zend_Db PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut Obtenir la requête SQL générée
    Bonjour,

    lors d'un insert j'ai une erreur de violation de contrainte, et je ne vois pas trop d'où ça vient, car quand je le fais manuellement dans PhpMyAdmin tout va bien...
    J'aimerais donc obtenir la requête générée par ZF.

    J'imagine qu'il faut faire un try catch, mais je ne vois pas comment catcher la requête générée..

    La méthode du modèle générant une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function addToto($tableA_name, $tableB_name, ...)
    	{
    	   $data = array(
    	   		'tableA_name'		=> $tableA_name,
    	   		'tableB_name'	        => $tableB_name,
                            ....
            );
             $req =$this->insert($data);
    Merci de m'aider

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    ton $this c'est quelle class ? Zend_Db_Table ? t'as une exception derrière ? si oui de quelle type ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut
    c'est Zend_Db_Table_Abstract.

    Oui, j'ai une exception, c'est bien le problème:

    Message: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
    Mais encore plus que de résoudre ce problème (qui doit être du à la génération de la table via mysqlworkbench), ce que j'aimerais, c'est pouvoir afficher systématiquement les requêtes en cas d'erreur.
    A vrai dire, je ne comprends même pas comment cela peut ne pas être le cas... C'est un truc de base que tout le monde doit vouloir non ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    et la classe de l'exception ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    et la classe de l'exception ?
    je n'ai généré qu'une classe d'exception via zf en ligne de commande :

    application/ErrorController.php

    class ErrorController extends Zend_Controller_Action

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    montre le stack complet

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut
    Merci de m'aider
    Mais il n'y a pas une manière simple d'afficher la requête générée ?

    Stack trace:

    #0 /var/www/ddl2/library/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
    #1 /var/www/ddl2/library/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array)
    #2 /var/www/ddl2/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ur...', Array) <----- ça c bien un début de requête non ? il doit y avoir moyen de l'attraper ?
    #3 /var/www/ddl2/library/Zend/Db/Adapter/Abstract.php(546): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ur...', Array)
    #4 /var/www/ddl2/library/Zend/Db/Table/Abstract.php(1052): Zend_Db_Adapter_Abstract->insert('url', Array)
    #5 /var/www/ddl2/application/models/DbTable/Url.php(20): Zend_Db_Table_Abstract->insert(Array)
    #6 /var/www/ddl2/application/controllers/IndexController.php(199): Application_Model_DbTable_Url->addUrl('rth', 'rth', 'rth', 'test', 'zef')
    #7 /var/www/ddl2/library/Zend/Controller/Action.php(513): IndexController->addurlAction()
    #8 /var/www/ddl2/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('addurlAction')
    #9 /var/www/ddl2/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
    #10 /var/www/ddl2/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
    #11 /var/www/ddl2/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
    #12 /var/www/ddl2/public/index.php(26): Zend_Application->run()
    #13 {main}

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    tu dois pouvoir récupérer le queryString, mais bon t'as sans doute un problème d'index, regarde plutôt dans tes logs sql

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    tu dois pouvoir récupérer le queryString, mais bon t'as sans doute un problème d'index, regarde plutôt dans tes logs sql
    Oui, comme je l'ai dit, le fichier sql généré par mysqlworkbench est certainement foireux, et ce n'est pas grave. Le problème sera simple à résoudre.

    Ce qui m'intéresse c'est surtout de savoir comment récupérer le queryString ? Il doit bien y avoir une manière simple de faire quelque chose d'aussi nécessaire et naturel dans le développement web non ? Perso je sèche là....

  10. #10
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bien sûr que cela existe.

    En profilant ton appli par exemple :

    http://framework.zend.com/manual/fr/....profiler.html

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut
    ok, merci beaucoup, je vais jeter un coup d'oeil à ça en détail.
    J'ai commencé à installer la zfdebug bar, mais il faut encore que je la branche sur la bd...

    Est-ce que cette barre est très utilisée (la dernière version date de mai 2009) ? Y-a-t-il d'autres solutions comparables qui ont plus de succès ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 59
    Par défaut
    Bon super. La ZFDebug bar est très pratique (elle rappelle un peu la bar de symfony), mais ne permet d'afficher les requêtes que quand elles se sont bien passées

    Par contre, grâce au lien snafu, j'ai réussis à afficher systématiquement la mauvaise requête dans la page d'erreur. Pour ceux que ça intéresse, dans la version 10.8 en travaillant avec du code auto-généré par la ligne de commande :

    Dans application.ini, ajouter en dessous de la def de votre base de donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resources.db.params.profiler = "true"
    Dans ErrorController.php ajouter une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function getLastQuery()
        {
            $lastQuery = Zend_Db_Table::getDefaultAdapter()->getProfiler()->getLastQueryProfile()->getQuery();
            $lastQueryParams = Zend_Db_Table::getDefaultAdapter()->getProfiler()->getLastQueryProfile()->getQueryParams();
            foreach($lastQueryParams as $param) {
                $lastQuery = substr_replace($lastQuery, "`" . $param . "`", strpos($lastQuery, '?'), 1);
            }
            return ($lastQuery == '') ? "---" : $lastQuery;
        }
    toujours dans le ErrorController.php, récupérer le résultat de la fonction pour le transmettre à la vue; donc tout à la fin de la méthode errorAction ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->view->requ	   = $this->getLastQuery();
    enfin dans la vue error.phtml afficher la requête en ajoutant à la fin du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <h1>La requête posant problème</h1>
    	<?php echo $this->requ;?>
    Voilà, merci à vous !

    PS: ça m'a permis de trouver mon problème : dans le contrôleur, je ne passais pas les arguments dans le bon ordre à la méthode du modèle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requêtes sql générées par BO XI 3.1
    Par fdenis31 dans le forum Débuter
    Réponses: 1
    Dernier message: 01/03/2012, 19h02
  2. [LinqToEntites] Comment voir les requêtes SQL générées?
    Par takinelinfo dans le forum Accès aux données
    Réponses: 11
    Dernier message: 30/05/2011, 16h28
  3. Logger les requêtes sql générées
    Par aloha dans le forum JPA
    Réponses: 2
    Dernier message: 03/12/2007, 15h13
  4. [SQL] Requête SQL : obtenir un total
    Par Riwalenn dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 26/09/2006, 10h19
  5. Réponses: 2
    Dernier message: 24/08/2006, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo