sql >> Base de Datos >  >> RDS >> Mysql

Depurar PDO mySql insertar NULL en la base de datos en lugar de vacío

Esto me parece un error (¿no informado?) en la emulación de declaraciones preparadas de PDO:

  1. la implementación de PDOStatement::execute() eventualmente invoca pdo_parse_params() ;

  2. que, a su vez, intenta citar/escape valores basado en el tipo de datos del parámetro relevante (como lo indica el $data_type argumentos para PDOStatement::bindValue() y PDOStatement::bindParam() —todos los parámetros provistos como $input_parameters a PDOStatement::execute() se tratan como PDO::PARAM_STR , como se indica en la documentación de esa función);

  3. calling el quoter() independientemente de si son null :en el caso de PDO_MySQL, eso es mysql_handle_quoter() , que (eventualmente) pasa el valor a mysqlnd_cset_escape_quotes() o mysql_cset_escape_slashes() , dependiendo del servidor NO_BACKSLASH_ESCAPES modo SQL;

  4. dado un null argumento, ambas funciones devuelven una cadena vacía.

Mi opinión es que, antes de activar los parámetros escribir (en el paso 2 anterior), pdo_parse_params() debe establecer el tipo en PDO::PARAM_NULL si el valor es null . Sin embargo, algunos podrían argumentar que esto evitaría el manejo específico de tipo de null valores donde corresponda, en cuyo caso string case (en el paso 3 anterior) definitivamente debería manejar null valores antes de proceder con una llamada al controlador quoter() método.

Como solución provisional, deshabilitar la emulación de declaraciones preparadas suele ser lo mejor de todos modos:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);