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_typearguments 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_ESCAPESMode SQL ; -
donné un
nullargument, 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);