Dadou Posté 10 Août 2009 Posté 10 Août 2009 Je m\\\'arrache les cheveux depuis un moment : Je fais une première requête avec PDO $sQuery = \\\" SELECT * FROM `forms` WHERE `iId` = `iId` $sCondition $sOrderBy $sLimit\\\"; $oResult = $GLOBALS[\\\'oDatabase\\\']->prepare($sQuery); $oResult->execute($aParams); $aTab = array(); while( $oRow = $oResult->fetchAll(PDO::FETCH_OBJ) ) { $oObject = new Form( $oRow->iId, $oRow->sName, $oRow->sMail, $oRow->sLanguage, $oRow->iPrincipal, array() ); $oFields = Field::GetField(\\\'List\\\', array(\\\'iForm\\\'=>$oRow->iId), array(\\\'sOrderBy\\\'=>\\\'iOrder\\\')); $oObject->set_oFields($oFields); } la ligne $oFields = Field::GetField(\\\'List\\\', array(\\\'iForm\\\'=>$oRow->iId), array(\\\'sOrderBy\\\'=>\\\'iOrder\\\')); génère une deuxieme requete imbriquée : $sQueryField = \\\" SELECT * FROM `forms_fields` WHERE `iId` = `iId` $sCondition $sOrderBy $sLimit\\\"; $oResultField = $GLOBALS[\\\'oDatabase\\\']->prepare($sQueryField); $oResultField->execute($aParams); Cela fonctionne tres bien sur mon poste en Ubuntu a la maison, mais pas du tout sur le serveur de prod, et il me met le message suivant Call to a member function execute() on a non-object Grr
jcaron Posté 10 Août 2009 Posté 10 Août 2009 Ca voudrait dire que le Prepare s'est mal fini, mais normalement ça devrait te générer une Exception dans ce cas, non? Vérifie la gueule de ta requête ($sQueryField) avant de faire le prepare, il est possible que les données que tu as en prod fassent qu'elle n'ait pas de sens, genre un WHERE en trop ou un AND qui manque ou un truc du genre... Au passage le "where iId=iId" c'est quand même pas top utile, ce n'est probablement pas ce que tu voulais dire... Jacques.
Dadou Posté 11 Août 2009 Auteur Posté 11 Août 2009 Ca voudrait dire que le Prepare s'est mal fini, mais normalement ça devrait te générer une Exception dans ce cas, non? Effectivement le Prepare me renvois False, mais aucune exception de générée Vérifie la gueule de ta requête ($sQueryField) avant de faire le prepare, il est possible que les données que tu as en prod fassent qu'elle n'ait pas de sens, genre un WHERE en trop ou un AND qui manque ou un truc du genre... Elle correspond bien à ce que j'attend : SELECT * FROM `forms_fields` WHERE `iId` = `iId` AND `iForm` = :iForm ORDER BY `iOrder` Quand je fais dans phpmyadmin la requete suivante : SELECT * FROM `forms_fields` WHERE `iId` = `iId` AND `iForm` = 1 ORDER BY `iOrder` J'ai bien les résultats Si je fais la requête toute seule, elle fonctionne parfaitement, c'est un problème d'imbrication, pourquoi la deuxième requête ne fonctionne pas, y a t'il un réglage spécifique sur le serveur qui peut bloquer, je n'ai pas ce problème sur mon environnement de dev. PDO commence serieusement à m'agacer, plus ça va, moins je trouve ce truc stable, tu développes un truc, en étant le plus rigoureux possible, tu passes le script sur une autre machine, et la plus rien ne marche, ça commence à être très lourd... Au passage le "where iId=iId" c'est quand même pas top utile, ce n'est probablement pas ce que tu voulais dire... Si si, il me sert à être sûr d'avoir une condition dans la fonction de génération de la requête
captain_torche Posté 11 Août 2009 Posté 11 Août 2009 Si si, il me sert à être sûr d'avoir une condition dans la fonction de génération de la requête Tu pourrais mettre tout simplement "WHERE 1"
jcaron Posté 11 Août 2009 Posté 11 Août 2009 Je n'utilise jamais php et encore moins PDO, donc là je sèche un peu (chez moi c'est perl et DBI, et là aucun souci). C'est le même type de bdd (y compris version), le même driver, la même version de php, tout ça? Pour la condition, ce serait probablement plus simple avec un tableau de conditions et un petit implode(" AND ",$tab_conditions). Jacques.
Dadou Posté 11 Août 2009 Auteur Posté 11 Août 2009 Je n'avais pas pensé au where 1 ou a la fontion implode, je regarderais ça une fois que j'aurais trouver ou cela merdouille. Je vais vérifier ce soir les versions de php, de la librairie PDO et de mysql. Si ce n'est qu'un problème de versio. Peut être qu'un upgrade coorigera ca
Kioob Posté 11 Août 2009 Posté 11 Août 2009 Hello, je suis pour ma part un grand fan de PDO (sur le fond en tous cas, un peu moins sur la forme). Bref, pour pouvoir faire des requêtes imbriquées (c'est le mal ), il faut indiquer à PHP de stocker le résultat en mémoire avant de rendre la main (même comportement que mysql_query() quoi ; et on comprends mieux pourquoi c'est le mal ). $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); Pour ce qui est des exceptions, il me semble que par défaut PDO est en mode "warning" (à vérifier). Et donc préciser lors de l'instanciation : PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION. PS : et justement il me semble que le réglage par défaut de PDO::MYSQL_ATTR_USE_BUFFERED_QUERY a changé au fil des versions (merci les devs PHP...)
Dadou Posté 11 Août 2009 Auteur Posté 11 Août 2009 C'était bien ça, mais suite à ta remarque j'ai donc utilisé comme conseillé dans la doc fetchall, et découpé en deux les étapes. Nickel, c'est plus propre comme cela
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant