[PDO] Requête préparée marche et requête pas préparée marche... :/

Eléphant du PHP | 185 Messages

04 juil. 2008, 22:28

Bonjour à vous.

On vient de procéder à la réinstallation d'un site sur un nouveau serveur (en fait le même, mais réinstallé à partir de 0, donc c'est comme si c'était un nouveau).

Lors du retour au site, il s'est produit une chose bizarre : tout fonctionnait, sauf 2 trucs. On a donc cherché, cherché et on a fini par trouver !

On utilise exclusivement des requêtes préparées avec PDO sur tout le site ! Et en fait, à 2 moments, PDOStatement->fetch() ne renvoit rien alors que la requête exécutée sous PHPMyAdmin fonctionne...
... et que la même requête renvoit aussi quelque chose si on le la prépare pas ! Comprendre : en utilisant PDO->query() au lieu de PDO->prepare() (+bindParam()). Les paramètres ont été passé au debug et sont bien valides...

Quelqu'un a déjà vécu quelque chose de similaire ou aurait une idée de direction dans laquelle chercher ?

D'avance merci à vous.

Savageman.

Mammouth du PHP | 1668 Messages

05 juil. 2008, 09:38

Si ça a été débug avec Zend, il ne détectera rien...

On peux voir ta requête préparé ?
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Invité
Invité n'ayant pas de compte PHPfrance

05 juil. 2008, 21:39

J'ai débuggué avec var_dump() pour voir si les variables contenaient les bonnes valeurs ! :)

Code : Tout sélectionner

$dbh = PDO2::GetInstance(); //Corbeille if(!empty($_GET['trash']) AND verifier('corbeille_sujets', $_GET['f'])) { $trash = 1; } else { $trash = 0; } $stmt = $dbh->prepare(" SELECT forum_id, forum_nom, forum_description, categorie_nom, forum_categorie_id, (SELECT COUNT(*) AS nombre_sujets FROM zcov2_forum_sujets WHERE sujet_forum_id = :f AND sujet_corbeille = :trash) AS nombre_de_sujets FROM zcov2_forum_forums LEFT JOIN zcov2_forum_categories ON zcov2_forum_forums.forum_categorie_id = zcov2_forum_categories.categorie_id LEFT JOIN zcov2_forum_sujets ON zcov2_forum_forums.forum_id = zcov2_forum_sujets.sujet_forum_id WHERE forum_id = :f GROUP BY forum_id "); $stmt->bindParam(':f', $_GET['f']); $stmt->bindParam(':trash', $trash); if ($stmt->execute()) { $resultat = $stmt->fetch(PDO::FETCH_ASSOC); // suite

Code : Tout sélectionner

// Début pareil ! $stmt = $dbh->query(" SELECT forum_id, forum_nom, forum_description, categorie_nom, forum_categorie_id, (SELECT COUNT(*) AS nombre_sujets FROM zcov2_forum_sujets WHERE sujet_forum_id = {$_GET['f']} AND sujet_corbeille = $trash) AS nombre_de_sujets FROM zcov2_forum_forums LEFT JOIN zcov2_forum_categories ON zcov2_forum_forums.forum_categorie_id = zcov2_forum_categories.categorie_id LEFT JOIN zcov2_forum_sujets ON zcov2_forum_forums.forum_id = zcov2_forum_sujets.sujet_forum_id WHERE forum_id = {$_GET['f']} GROUP BY forum_id "); if ($stmt) { $resultat = $stmt->fetch(PDO::FETCH_ASSOC);
En fait dans le premier cas $resultat vaut false... (alors que execute() a renvoyé true).
Dans le deuxième cas, $resultat contient la bonne valeur...
Ne vous inquiétez pas pour $_GET['f'] il a été validé avec ctype_digit() ! :)

D'autres erreurs sont également apparues, telles que
"Warning, calling bindParam() on a non-object on line 27" (je vous le fait de tête hein...).
la ligne 27, c'est

Code : Tout sélectionner

$stmt->bindParam(':id', $id);
J'ai direct fait un var_dump($stmt), et il me renvoit :
object PDOStatement { "queryStr" => "la requête..." }
(de tête aussi, mais l'idée est là ! ).
Bizarre, c'est possible que la nouvelle version de PDO ne soit pas totalement compatible ? (sachant que tout le reste du site fonctionne normalement et que ya aussi un bon paquet de requêtes préparées ailleurs ?).