Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Insertion/update de boolean


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Insertion/update de boolean
    Bonjour,
    J'utilise PHP 7.2 et PostGreSQL 10.1. J'ai déjà lu qu'il y a quelques galères de gestion des booleans avec postGre.
    J'en ai un que je n'arrive pas à résoudre : il n'y a pas de problème a insérer/updater une colonne avec une valeur true mais ça plante si j'ai false.

    Un exemple simple : passer un user de l'état d'admin à non admin :
    La requête est paramétrée avec le SQL
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    update user set admin=$1 where "userId" = $2
    et le tableau de valeurs
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    array(2) { [0]=> bool(false) [1]=> string(1) "9" }

    Ca me fait cette erreur
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Warning:  pg_query_params(): Query failed: ERREUR:  syntaxe en entrée invalide pour le type boolean : «  » in ...


    J'ai tenté de le faire en passant mes paramètres par pg_convert() avant.
    Le tableau de paramètres qui me revient est
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    array(2) { [0]=> string(3) "'f'" [1]=> string(1) "9" }

    Et l'erreur qui est générée est
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Warning:  pg_query_params(): Query failed: ERREUR:  syntaxe en entrée invalide pour le type boolean : « 'f' » in ...


    Donc soit je laisse pg_query_params() gérer lui-même la sécurisation des données (est-ce suffisant ?) et il me transforme un false en ' ' (double espace). Soit je sécurise les données par le mécanisme proposé pg_convert() et là le false se transforme en 'f' (avec simple quote) qui visiblement n'est pas le f attendu.

    Je précise que si la valeur du booléen est true il n'y a pas de soucis.
    Une petite idée pour me tirer de là ?

  2. #2
    Modératrice

    Juste pour être sûre : la colonne en base est bien un type Boolean ?
    Une vieille note de la doc semble dire que les booléens sont moyennement bien supportés par pg_query_params (http://php.net/manual/fr/function.pg...ams.php#115063) Essaye peut-être de convertir manuellement tes booléens.

    EDIT : en fouillant dans la doc PHP, j'ai trouvé ceci :
    Une valeur booléenne TRUE est convertie en la chaîne "1". Une valeur booléenne FALSE est convertie en "" (une chaîne vide). Ceci permet les conversions vers et depuis une chaîne et un booléen.
    http://php.net/manual/fr/language.ty...string.casting

    Donc il semblerait que ton booléen soit automatiquement converti en chaine à l'entrée de pg_query_params. True fonctionne parce que "1" est une valeur valide pour un booléen, mais false devient une chaine vide, ce qui n'est pas supporté.
    Tu peux tricher en castant ton booléen en entier, car true deviendra 1 et false deviendra false. Mais c'est tordu comme truc

    (Sinon, il y a PDO )
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre régulier
    exact.
    J'ai tourné autour du pot... et pas de pot ! Plutôt que de se galérer à gérer des transformations de string en boolean dans un sens puis dans l'autre, autant se galérer un petit peu pour passer à PDO !
    Les trucs tordus ce ne sont jamais des solutions viables pour des applications sérieuses
    merci de m'avoir relancé sur PDO, je suis le conseil...