Mysql
 sql >> Base de données >  >> RDS >> Mysql

Debug PDO mySql insère NULL dans la base de données au lieu de vide

Cela me semble être un bogue (non signalé ?) Dans l'émulation d'instructions préparées de PDO :

  1. la mise en œuvre de PDOStatement::execute() éventuellement invoque pdo_parse_params() ;

  2. 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 de PDOStatement::bindValue() et PDOStatement::bindParam() —tous les paramètres fournis sous la forme $input_parameters à PDOStatement::execute() sont traités comme PDO::PARAM_STR , comme indiqué dans la documentation de cette fonction);

  3. les valeurs de type chaîne sont échappées/quotées par appelant quoter() méthode indépendamment du fait qu'ils soient null :dans le cas de PDO_MySQL, c'est mysql_handle_quoter() , qui transmet (éventuellement) la valeur soit à mysqlnd_cset_escape_quotes() ou mysql_cset_escape_slashes() , selon NO_BACKSLASH_ESCAPES Mode SQL ;

  4. 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);