Page 1 sur 1

[PHP 5] Problème de requête

Posté : 27 juil. 2007, 11:06
par Drewman
Bonsoir, j'ai un petit souci avec une requete toute bête qui ne doit me renvoyer qu'une ligne :

Voici mon objet :

Code : Tout sélectionner

<?php $login='root'; $pwd=''; $db='mysql:host=localhost; dbname=edocks'; try{ $PDO = new PDO($db, $login, $pwd); } catch (PDOException $e){ die("Erreur de connexion : ".$PDO->getMessage() ); } ?>


Et ma requete

Code : Tout sélectionner

$sql = "SELECT `poste_deb`, `poste_fin` FROM `dossiers` WHERE `designation` = '".$_SESSION['log'][2]."'"; $query = $PDO->query($sql); $resu = $query->fetchRow();


Enfin le message d'erreur
Fatal error: Call to a member function fetchRow() on a non-object in C:\Program Files\EasyPHP 2.0b1\www\edocks\include\send.php on line 20

- la table dossiers contient les champs suivants :

Code : Tout sélectionner

ID | ... | poste_deb | poste_fin | designation | --------------------------------------------------------------------- 24 | ... | 10 | 44 | LAP |


- ma variable de session $_SESSION['log'][2] contient "LAP"

Mon ancien code était constitué des commandes mysql classiques et fonctionnait parfaitement

Code : Tout sélectionner

$sql = "SELECT `poste_deb`, `poste_fin` FROM `dossiers` WHERE `designation` = '".$_SESSION['log'][2]."'"; $query = mysql_query($sql, $connexion); $resu = mysql_fetch_assoc($query);
Est-ce que quelqu'un aurait une idée ? Je m'arrache les cheveux là dessus depuis hier :([/code]

Posté : 27 juil. 2007, 11:50
par titerm
bah ton query ne retourne pas d'objet. Donc tu as proablement une erreur dans ta requete.

Déjà je trouve bizarre de metre les champs que tu selections entre quote (sur ton poste, on dirait meme des anti-quote). Je sais pas pour mysql mais pour oracle, c'est inutile, ca marche mais c'est inutile. Par contre, ca marche avec des quotes, pas des anti-quote.

Posté : 27 juil. 2007, 11:59
par Drewman
Il se trouve que j'ai essayé avec ou sans quotes, ça ne change rien. Et je trouverais quand même bizarre que la requête fonctionne avec mysql_query et pas avec $DBO->query()...

Je ne sais pas pourquoi j'ai pris l'habitude de les écrire comme ça, mais en tout cas, d'ordinaire mes requêtes fonctionnent. Et encore une fois j'ai essayé sans quotes, avec quotes, avec antiquotes etc... nada.

Posté : 27 juil. 2007, 12:05
par Jules Petibidon
hello,

mysql autorise les champs nommés comme des mots clé SQL, et les anti quotes sont là pour protéger ces champs et les différencier des mots clés usuels (je sais pas si c'est super clair ce que je dis là ;) )

dans le cas présent ils sont inutiles mais pas dérangeants.

PDO::errorCode() et PDO:errorInfo() te donnent quoi ?

Posté : 27 juil. 2007, 12:09
par callapa
salut,

tu es sûr de cette commande :

Code : Tout sélectionner

$query->fetchRow();
car les seules commandes PDO que je vois sont fetch et fetchAll.

Posté : 27 juil. 2007, 12:16
par Drewman
Voilà ce qu'il me retourne :

Code : 00000

Code driver : 2014

Message : Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Posté : 27 juil. 2007, 12:17
par Invité
salut,

tu es sûr de cette commande :

Code : Tout sélectionner

$query->fetchRow();
car les seules commandes PDO que je vois sont fetch et fetchAll.
Oui, mais j'ai aussi essayé avec fetch() et fetchAll(), même chose.

Posté : 27 juil. 2007, 13:06
par Jules Petibidon
bah le message parait clair, tu as une requete dont tu n'as pas récupéré les résultats. Comme il s'agit d'une requete non bufferisée, refaire un requete est interdit.

ajoute cette ligne apres ta connexion pour voir :
$PDO->setAttribute( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY );

Posté : 27 juil. 2007, 17:12
par Drewman
Effectivement j'ai reglé le problème en début d'après midi en ajoutant

$PDO->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

à mon fichier de connexion. C'est apparement spécifique à mysql donc ça retire pas mal de l'interêt de PDO mais c'était ça ou mettre des closeCursor(); partout.


Merci pour l'aide ! Sujet reglé.

Posté : 27 juil. 2007, 17:44
par Hubert Roksor
c'était ça ou mettre des closeCursor(); partout
Et euh... c'est quoi le problème avec closeCursor() ? Je connais mal PDO mais je viens de lire la description du manuel, et d'après ce que j'y ai lu, on n'est forcé d'utiliser cette méthode que si un résultat n'a pas été entièrement "consommé", donc quelque chose me dit que l'une de tes requêtes qui "ne doivent retourner qu'une ligne" en retourne en fait plusieurs, avec un gros potentiel de futurs bugs à la clé. Dans tous les cas, il n'y a jamais de bonne raison pour ne pas utiliser une fonction de nettoyage, donc je ne saurais trop te conseiller d'approfondir un peu tes recherches avant de considérer ce problème comme définitivement réglé.