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
Partager