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