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_type
argumentos paraPDOStatement::bindValue()
yPDOStatement::bindParam()
—todos los parámetros provistos como$input_parameters
aPDOStatement::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_ESCAPES
modo SQL; -
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);