Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

booleens dans PDO / pgsql

6 réponses
Avatar
fgirault
Bonjour,

il me semble tristement que la gestion des booléens de postgresql est
calamiteuse avec php.

sur un php 5.1.2 (ubuntu breezy), la méthode bindParam() (pour
affecter les paramètres à une instruction préparée) ne sait pas
transformer mon booléen php (false) en représentation correcte pour
postgresql.

en effet, il met la chaine vide quand il rencontre (false). et là le
moteur du sgbd n'est pas content du tout :

SQLSTATE[22P02]: Invalid text representation: 7 ERREUR: Syntaxe en
entrée invalide pour le type booléen : «»

aillant pas mal fouillé sur net, je n'ai pas trouvé de réponse
satisfaisante, et je n'ai pas envie d'une rustine pour ça car PDO est
"sensé" être une api unifié (hé oui je l'utilise car j'ai besoin de
supporter plusieurs sgbd de manière la plus transparente possible).

si vous avez des pistes .... merci !

François

6 réponses

Avatar
Olivier Miakinen

il me semble tristement que la gestion des booléens de postgresql est
calamiteuse avec php.


Tout d'abord, est-ce bien une question pour PHP ? S'il s'agit d'un
problème de gestions de booléens PHP, c'est sans doute ici que ça se
passe. Mais si postgresql (que je ne connais pas) définit un nouveau
type, vu par PHP comme une ressource, alors tu aurais peut-être intérêt
à poser ta question sur <news:fr.comp.applications.sgbd> plutôt qu'ici.

Tu as aussi :
<http://www.freenix.fr/unix/linux/HOWTO/PostgreSQL-HOWTO.html>
et :
<http://www.fr.postgresql.org/users-lounge/> (en anglais)


sur un php 5.1.2 (ubuntu breezy), la méthode bindParam() (pour
affecter les paramètres à une instruction préparée) ne sait pas
transformer mon booléen php (false) en représentation correcte pour
postgresql.


Je ne trouve pas la méthode bindParam() dans la doc PHP :
<http://fr.php.net/manual-lookup.php?pattern=bindParam>.
Tu utilises un package externe ?

[...]

aillant pas mal fouillé sur net, [...]


Fais gaffe de ne pas mettre trop d'ail quand même. Ça devient vite
indigeste après.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
ftc
sur un php 5.1.2 (ubuntu breezy), la méthode bindParam() (pour
affecter les paramètres à une instruction préparée) ne sait pas
transformer mon booléen php (false) en représentation correcte pour
postgresql.

en effet, il met la chaine vide quand il rencontre (false). et là le
moteur du sgbd n'est pas content du tout :


Et si tu essaies avec 'false' plutôt que false.

aillant pas mal fouillé sur net, je n'ai pas trouvé de réponse
satisfaisante, et je n'ai pas envie d'une rustine pour ça car PDO est
"sensé" être une api unifié (hé oui je l'utilise car j'ai besoin de
supporter plusieurs sgbd de manière la plus transparente possible).


Attention, PDO est une API unifiée et pas une couche d'abstraction. Il
est intimement lié au driver du SGBD.

"PDO ne fournit pas une abstraction de base de données : il ne réécrit
pas le SQL, n'émule pas des fonctionnalités manquantes. Vous devriez
utiliser une interface d'abstraction complète si vous avez besoin de cela."

Avatar
loufoque

sur un php 5.1.2 (ubuntu breezy), la méthode bindParam() (pour
affecter les paramètres à une instruction préparée) ne sait pas
transformer mon booléen php (false) en représentation correcte pour
postgresql.


Tu utilises bien PDO::PARAM_BOOL pour le paramètre "type" ?

Avatar
loufoque

Tout d'abord, est-ce bien une question pour PHP ?


Oui, étant donné qu'il met en évidence un bug de PDO. La question de
notre ami étant de vérifier qu'il s'agit bien d'un bug.


Je ne trouve pas la méthode bindParam() dans la doc PHP :


Le sujet est PDO.
Il doit donc s'agir d'une méthode d'une des classes du module PDO.

On regarde sur la doc et on trouve vite fait :
http://fr.php.net/manual/fr/function.pdostatement-bindparam.php

Avatar
fgirault
Effectivement, l'utilisation des réprésentation type chaine comme 't'
ou 'f', 'true' / 'false', donne le résultat.

Mais mes données d'insertion ne viennent pas de l'utilisateur, mais
d'une autre base où j'extrait mes données avec ...pdo qui me renvoit
bien un booléen (is_bool renvoit bien true).

<bloat>la solution la plus intégrable pour moi va donc être une
fonction de filtrage des paramètres dans laquelle les booléens
seront substitués par leur représentation correcte avant utilisation.
avec un test en plus et une variable de conf global. pfff. </bloat>

quel conseil sur une api d'abstraction consistante et aussi performante
?
Avatar
fgirault


il me semble tristement que la gestion des booléens de postgresql est
calamiteuse avec php.


Tout d'abord, est-ce bien une question pour PHP ? S'il s'agit d'un
problème de gestions de booléens PHP, c'est sans doute ici que ça se
passe. Mais si postgresql (que je ne connais pas) définit un nouveau
type, vu par PHP comme une ressource, alors tu aurais peut-être intérêt
à poser ta question sur <news:fr.comp.applications.sgbd> plutôt qu'ici.

Tu as aussi :
<http://www.freenix.fr/unix/linux/HOWTO/PostgreSQL-HOWTO.html>
et :
<http://www.fr.postgresql.org/users-lounge/> (en anglais)



euh, je pense me faire reconduire de ces groupes, car ma question
concerne l'api PDO de PHP, et plus particulièrement l'implémentation
du mapping de type lors du passage de paramètre.


sur un php 5.1.2 (ubuntu breezy), la méthode bindParam() (pour
affecter les paramètres à une instruction préparée) ne sait pas
transformer mon booléen php (false) en représentation correcte pour
postgresql.


Je ne trouve pas la méthode bindParam() dans la doc PHP :
<http://fr.php.net/manual-lookup.php?pattern=bindParam>.
Tu utilises un package externe ?



PDO est natif dans php depuis la 5.1 : http://fr2.php.net/pdo

quand à la méthode en question :

http://fr2.php.net/manual/fr/function.pdostatement-bindparam.php

[...]

aillant pas mal fouillé sur net, [...]


Fais gaffe de ne pas mettre trop d'ail quand même. Ça devient vite
indigeste après.


ah ah, ce que je trouve indigeste, c'est de me retrouver bloqué par ce
genre de problème.

--
FG