Page 1 sur 1

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

Posté : 04 juil. 2008, 22:28
par savageman
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.

Posté : 05 juil. 2008, 09:38
par katagoto
Si ça a été débug avec Zend, il ne détectera rien...

On peux voir ta requête préparé ?

Posté : 05 juil. 2008, 21:39
par Invité
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 ?).