Cela me semble être un bogue (non signalé ?) Dans l'émulation d'instructions préparées de PDO :
-
la mise en œuvre de
PDOStatement::execute()
éventuellement invoquepdo_parse_params()
; -
qui, à son tour, tente de citer/échapper des valeurs en fonction du type de données du paramètre pertinent (comme indiqué par le
$data_type
arguments dePDOStatement::bindValue()
etPDOStatement::bindParam()
—tous les paramètres fournis sous la forme$input_parameters
àPDOStatement::execute()
sont traités commePDO::PARAM_STR
, comme indiqué dans la documentation de cette fonction); -
les valeurs de type chaîne sont échappées/quotées par appelant
quoter()
méthode indépendamment du fait qu'ils soientnull
:dans le cas de PDO_MySQL, c'estmysql_handle_quoter()
, qui transmet (éventuellement) la valeur soit àmysqlnd_cset_escape_quotes()
oumysql_cset_escape_slashes()
, selonNO_BACKSLASH_ESCAPES
Mode SQL ; -
donné un
null
argument, ces deux fonctions renvoient une chaîne vide.
Mon avis est qu'avant l'activation du paramètre taper
(à l'étape 2 ci-dessus), pdo_parse_params()
doit définir le type sur PDO::PARAM_NULL
si la valeur est null
. Cependant, certains pourraient affirmer que cela empêcherait la gestion spécifique au type de null
valeurs le cas échéant, auquel cas le cas de la chaîne (à l'étape 3 ci-dessus) devrait certainement gérer null
valeurs avant de procéder à un appel au quoter()
du pilote méthode.
Comme solution de contournement provisoire, la désactivation de l'émulation d'instructions préparées est généralement préférable :
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);