[PHP 5] Problème de requête

Drewman
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 11:06

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]

Mammouth du PHP | 505 Messages

27 juil. 2007, 11:50

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.

Drewman
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 11:59

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.

Eléphant du PHP | 259 Messages

27 juil. 2007, 12:05

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 ?

Eléphanteau du PHP | 39 Messages

27 juil. 2007, 12:09

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.

Drewman
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 12:16

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.

Invité
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 12:17

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.

Eléphant du PHP | 259 Messages

27 juil. 2007, 13:06

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 );

Drewman
Invité n'ayant pas de compte PHPfrance

27 juil. 2007, 17:12

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

27 juil. 2007, 17:44

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