Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/03/2011, 14h03   #1
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
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 :
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
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 14h22   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
ton $this c'est quelle class ? Zend_Db_Table ? t'as une exception derrière ? si oui de quelle type ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 14h49   #3
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
c'est Zend_Db_Table_Abstract.

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

Citation:
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 ?
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 14h52   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
et la classe de l'exception ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 14h55   #5
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
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
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 15h07   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
montre le stack complet
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 15h09   #7
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
Merci de m'aider
Mais il n'y a pas une manière simple d'afficher la requête générée ?

Citation:
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}
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 16h16   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 17h16   #9
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
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à....
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 17h48   #10
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Bien sûr que cela existe.

En profilant ton appli par exemple :

http://framework.zend.com/manual/fr/....profiler.html
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 14h18   #11
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
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 ?
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 15h18   #12
Futur Membre du Club
 
Inscription : mai 2008
Messages : 52
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 52
Points : 15
Points : 15
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 :
resources.db.params.profiler = "true"
Dans ErrorController.php ajouter une méthode :

Code :
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 :
 $this->view->requ	   = $this->getLastQuery();
enfin dans la vue error.phtml afficher la requête en ajoutant à la fin du fichier:

Code :
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
dedis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h57.


 
 
 
 
Partenaires

Hébergement Web