Aller au contenu

PDO et requetes multiples


Sujets conseillés

Posté

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

Posté

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.

Posté
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

Posté

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.

Posté

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

Posté

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 :P), 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 :D).

$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...)

Posté

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...