Esto me parece un error (¿no informado?) en la emulación de declaraciones preparadas de PDO:
-
la implementación de
PDOStatement::execute()eventualmente invocapdo_parse_params(); -
que, a su vez, intenta citar/escape valores basado en el tipo de datos del parámetro relevante (como lo indica el
$data_typeargumentos paraPDOStatement::bindValue()yPDOStatement::bindParam()—todos los parámetros provistos como$input_parametersaPDOStatement::execute()se tratan comoPDO::PARAM_STR, como se indica en la documentación de esa función); -
calling el
quoter()independientemente de si sonnull:en el caso de PDO_MySQL, eso esmysql_handle_quoter(), que (eventualmente) pasa el valor amysqlnd_cset_escape_quotes()omysql_cset_escape_slashes(), dependiendo del servidorNO_BACKSLASH_ESCAPESmodo SQL; -
dado un
nullargumento, 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);