PHP : PDO et ses misères...
Par Seza le samedi 23 février 2008, 12:35 - Programmation - Lien permanent
Petite note rapide :
PDO pour la nième fois m'à fait des misères ce matin. Je devrais préciser PDO + driver Mysql car je ne saurait dire lequel des deux est coupable dans l'histoire.
Si PDO est récent et donc sa manipulation nouvelle. Certes c'est normal que l'on se retrouve confronter à des erreurs " de débutant ". Mais ce matin j'ai passé une heure à cherché le pourquoi ça marche pas.
Il y a peu j'avais été confronter à une requête sql qui ne retournait rien. Après avoir cherché dans la doc PHP. l'instruction PdoStatement->closeCursor() s'avérait être la solution. Autant pour moi c'était clairement indiquer dans la doc.
Aujourd'hui le même BUG se présente. Un select qui ne retourne rien et bien entendu il est éxécuté après une suite de select. Si je le place en tête de liste, il fonctionne mais les suivants ne fonctionnent plus. Ce coup-ci je n'ai pas fait l'idiot et j'avait bien mis des closeCursor() après chaque requête (même celle qui lise la liste complète de résultat).
Alors que faire dans ce cas ? Après plus d'une heure j'ai trouver une solution. faire un unset(pdoStatement) derrière le closeCursor() et comme par magie tout est revenu dans l'ordre.
J'apprécie travailler avec PDO globalement même si certaine fonctionnalité sont abstente oou d'autre parraisse fonctionner étrangement voir certainre qui diverge complètement de la doc. Je doit avoir que je commence un peu à fatiguer de ce genre de mauvaise surprise.
Pourquoi je rale ? Parceque pendant que je cherchait une solution à ce bug j'ai remis en cause réellement l'utilisation de PDO dans mon application. et après avoir trouver la solution j'ai repris tout mon code (quelques dizaine de millier de lignes) afin de rajouter des unset() après chaque requête. J'ai maintenant la crainte qu'un nouveau bug PDO m'oblige à revoir mon architecture ou changer de driver.
Résultat ma confiance en PDO diminue d'un cran et c'est bien dommage.
Commentaires
Actuellement je galère à trouver comment insérer NULL dans un champ lorsque qu'une chaine est vide. Je ne te cache pas que j'ai testé les différentes méthodes pour les requêtes préparées ainsi que diverses constantes prédéfinies par PDO. Rien à faire. Il insère une chaine vide à chaque fois.
Même google ne fait que recenser les cas de personnes dans la même situation que moi.
J'attends de voir comment ça évolue.
Tiens allons bon ! Je n'aurais jamais pensée avoir des problèmes avec NULL.
Je ne te prends pas pour un débile mais n'essaies-tu pas de rentrer NULL dans un champ spécifié comme NOT NULL au moment de la création de la table.
De mon côté je fais pas mal de SELECT ou j'ai des valeur NULL et jusqu'à maintenant IS NOT NULL ou IS NULL fonctionnent bien.
Bon courage !
Moi qui voulait utiliser PDO pour un gros projet me voilà bien averti !!
( et un peu dépité ... )
Bonjour,
Je suis étudiant de licence pro informatique actuellement en stage en entreprise. Je réalise un site de gestion de leur parc informatique.
Je suis confronté à ce qui semblerait être un gros bug pdo...
Il m'est impossible d'exécuter deux procédures stockées dans mon code. La première fonctionne, mais la suivante me met un message d'erreur (qu'il s'agisse d'un select ou d'un insert, update, delete c'est le même message d'ailleurs...). Aucune requête ne peut alors être exécutée après l'appel à une procédure stockée.
Voici le message :
SQLSTATEHY000: General error: 2014 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.
Dans ce message d'erreur, il est suggéré de modifier un attribut, mais cela ne fonctionne pas non plus. J'ai essayé les unset et closeCursor()... rien à faire. J'ai trouvé des infos sur ce bug sur le net, mais rien qui me permette de le corriger...
Max,
Personnellement la méthode qui à toujours fonctionner chez moi consistait à utiliser la méthode closeCursor() sur le statement puis de l'attribuer à null, ce qui est identique à un unset mais visiblement le unset est parfois défaillant alors null ne m'a jamais posé de soucis.
Ceci dit les requêtes bufferisés ne devrait pas te posé de problème si tu as bien mis l'attribut comme tu le dis, es-tu sûr de te manière de faire. (je préfère encore une fois passer l'attribut comme paramètre de connexion au moteur mysql plutot que sur un statement).
Troisième possibilité utilise la méthode fetchAll() qui devrait libérer la ressource systématiquement bien que ça ne soit pas forcément agréable à utiliser.
PS : je me suis permis de modifier ton email (xanadoo.fr n'existe pas ;)