IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

SQLSTATE[22P02] syntaxe en entrée invalide pour le type booléen : « » [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut SQLSTATE[22P02] syntaxe en entrée invalide pour le type booléen : « »
    Bonjour,

    Dans le cadre d'un requête préparée pour postgreSQL, je n'arrive pas à éviter cette erreur, même en envoyant une valeur NULL et PDO::PARAM_NULL lors du bindValue...
    D'après mes tests, le NULL passe pour integer mais pas pour boolean, et je ne vois pas de solution.

    Voici la fonction en question qui insert une ligne d'un fichier CSV dans une table d'importation créée automatiquement (et dont le type PDO::PARAM_BOOL, INT, STR, détecté par une première lecture des données, est stocké dans $columns_type_int sous forme numérique) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    private function insert_line($statement, $line, $columns_type_int) {
        // normalisation des données de la ligne
        foreach ($line as $key => &$value) {
            if (ltrim($value) === '')
                $value = NULL;
            else switch ($columns_type_int[$key]) {
                case PDO::PARAM_INT :
                    $value = (int)$value;
                    break;
                case PDO::PARAM_BOOL :
                    switch (strtoupper($value)) {
                        // valeurs interprétées comme TRUE
                        case '1':    case 'TRUE';
                        case 'YES':  case 'OUI':  case 'Y' :  case 'O' :
                        case 'POS' :
                        case 'H' :   case 'HOMME' :
                            $value = TRUE; break;
                        // valeurs interprétées comme FALSE
                        case '0':    case 'FALSE';
                        case 'NO':   case 'NON':  case 'N' :  case 'NEG' :
                        case 'F' :
                        case 'FEMME' :
                            $value = FALSE; break;
                        // valeurs interprétées comme NULL
                        default :
                            $value = NULL; break;
                    }
                    break;
            }
        } unset ($key,$value);
        // Bind et exécution de la requete préparée
        foreach ($line as $key => $value) {
            $param_type = is_null($value) ? PDO::PARAM_NULL : $columns_type_int[$key];
            $statement->bindValue($key+1, $value, $param_type);
        } unset ($key,$value);
        $statement->execute($line);
    }

    Pour mieux visualiser les choses, voici le var_dump() d'un contenu de $line une fois normalisée (ce qui est mouliné au moment du bindValue() ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    array (size=105)
      0 => string 'ABC' (length=3)
      1 => int 12345
      2 => null
      3 => int 19
      4 => null
      5 => boolean true
      6 => string '14/11/2007 00:00:00' (length=19)
      7 => string 'blabla' (length=31)
      8 => boolean true
      9 => int 10410
      10 => string 'blabla' (length=14)
      11 => boolean false
      12 => boolean false
      13 => boolean false
      14 => boolean true
      15 => boolean false
      16 => boolean false
      17 => boolean false
      18 => boolean false
      19 => boolean false
      20 => boolean false
      21 => boolean false
      22 => boolean false
      23 => boolean false
      24 => null
      25 => boolean true
      26 => string '21/11/2007 00:00:00' (length=19)
      27 => boolean true
      28 => boolean true
      29 => boolean true
      30 => boolean true
      31 => boolean false
      32 => boolean true
      33 => string 'NEG' (length=3)
      34 => null
      35 => boolean false
      36 => null
      37 => boolean false
      38 => null
      39 => boolean false
      40 => null
      41 => boolean false
      42 => null
      43 => boolean false
      44 => string 'NEG' (length=3)
      45 => string '21/11/2007 00:00:00' (length=19)
      46 => boolean true
      47 => boolean true
      48 => boolean true
      49 => boolean false
      50 => boolean true
      51 => boolean false
      52 => boolean true
      53 => boolean false
      54 => boolean false
      55 => boolean true
      56 => boolean false
      57 => boolean true
      58 => null
      59 => boolean false
      60 => boolean false
      61 => null
      62 => boolean false
      63 => boolean true
      64 => boolean false
      65 => null
      66 => boolean false
      67 => null
      68 => boolean false
      69 => null
      70 => boolean false
      71 => boolean false
      72 => null
      73 => null
      74 => boolean false
      75 => null
      76 => boolean false
      77 => boolean false
      78 => boolean false
      79 => boolean false
      80 => boolean false
      81 => null
      82 => null
      83 => null
      84 => null
      85 => boolean false
      86 => boolean false
      87 => null
      88 => null
      89 => int 441
      90 => boolean true
      91 => boolean false
      92 => boolean false
      93 => null
      94 => null
      95 => null
      96 => null
      97 => null
      98 => null
      99 => boolean false
      100 => null
      101 => boolean false
      102 => null
      103 => boolean false
      104 => boolean false

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne suis pas sûr de bien comprendre ce que tu fais mais en utilisant empty() à la ligne 4, tu captures aussi ton cas 0 sur un booléen.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut
    Bonjour Sabotage,

    Merci pour le déplacement du topic, je n'avais pas vu cette section sur PDO.

    Effectivement pour le empty(), j'ai remplacé cette condition par Pour mon message d'erreur, cela vient a priori du fait que la valeur NULL n'est pas acceptée pour une colonne de type BOOLEAN avec ma requête préparée.

    Ce que je souhaite faire est en fait assez simple :
    - j'ai des lignes issues d'un fichier CSV. Ce sont des fichiers qui font actuellement plus de 20000 lignes, d'où le souhait d'utiliser des requêtes préparées.
    - je veux envoyer les données de ces lignes dans une table d'importation de données, avec 3 types possibles de données postgreSQL : boolean, integer et text.
    - je créé la table et les champs en fonction du type des données rencontrées dans le fichier CSV. Jusque là, tout va bien.
    - la fonction ci-dessus concerne la partie suivante ou chaque ligne est traitée (notamment des cast en INTEGER et conversion de certains textes en TRUE/FALSE/NULL).
    - là où ça bloque, c'est pour le cas où le champ booléen n'est pas renseigné, ce qui donne une chaine vide lors de l'importation : je veux mettre une valeur NULL et j'obtiens une erreur SQLSTATE[22P02] car au lieu de NULL, postgreSQL convertie NULL en chaine vide (ou reçoit un texte vide de la part de PDO), et le rejette...

    J'ai aussi cherché de ce côté dans la doc, mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PDO::ATTR_ORACLE_NULLS (disponible pour tous les pilotes, et pas juste Oracle ) : Conversion des valeurs NULL et chaînes vides.
        PDO::NULL_NATURAL : Pas de conversion.
        PDO::NULL_EMPTY_STRING : Chaîne vide convertie en NULL.
        PDO::NULL_TO_STRING : NULL est converti en chaîne vide.

  4. #4
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut
    Bon, j'ai trouvé, c'est la chaine ('TRUE') et non la valeur booléenne (TRUE) qu'il faut fournir à bindValue()...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/09/2013, 10h14
  2. [Rave 6 BE]Valeur "Invalid" pour tous les champs !
    Par Giovanny Temgoua dans le forum Rave
    Réponses: 4
    Dernier message: 19/10/2006, 23h29
  3. Pb de liens entre table pour une requête
    Par syldudu dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/08/2006, 18h27
  4. [ netstat ] surveillance entre machines pour demon mysql
    Par gogozep001 dans le forum Développement
    Réponses: 2
    Dernier message: 28/08/2003, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo