Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Depurar PDO mySql inserir NULL no banco de dados em vez de vazio


Isso me parece ser um bug (n não relatado?) na emulação de instrução preparada do PDO:

  1. a implementação de PDOStatement::execute() eventualmente invoca pdo_parse_params() ;

  2. que, por sua vez, tenta citar/escape valores com base no tipo de dados do parâmetro relevante (como indicado pelo $data_type argumentos para PDOStatement::bindValue() e PDOStatement::bindParam() —todos os parâmetros fornecidos como $input_parameters para PDOStatement::execute() são tratados como PDO::PARAM_STR , conforme indicado na documentação dessa função);

  3. valores digitados em string são escapados/citados por chamando o driver de banco de dados relevante quoter() método independentemente de serem null :no caso de PDO_MySQL, isso é mysql_handle_quoter() , que (eventualmente) passa o valor para mysqlnd_cset_escape_quotes() ou mysql_cset_escape_slashes() , dependendo do NO_BACKSLASH_ESCAPES do servidor modo SQL;

  4. dado um null argumento, ambas as funções retornam uma string vazia.

Minha opinião é que, antes de ligar o parâmetro digite (no passo 2 acima), pdo_parse_params() deve definir o tipo para PDO::PARAM_NULL se o valor for null . No entanto, alguns podem argumentar que isso impediria o tratamento específico do tipo de null valores quando apropriado, caso em que o caso de string (na etapa 3 acima) deve definitivamente lidar com null valores antes de continuar com uma chamada para quoter() do driver método.

Como solução temporária, desabilitar a emulação de instrução preparada geralmente é o melhor:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);