Questo mi sembra essere un bug (non segnalato?) nell'emulazione dell'istruzione preparata da PDO:
-
l'implementazione di
PDOStatement::execute()
eventualmente richiamapdo_parse_params()
; -
che, a sua volta, tenta di citare/sfuggire ai valori in base al tipo di dati del parametro rilevante (come indicato da
$data_type
argomenti perPDOStatement::bindValue()
ePDOStatement::bindParam()
—tutti i parametri forniti come$input_parameters
aPDOStatement::execute()
sono trattati comePDO::PARAM_STR
, come indicato nella documentazione di tale funzione); -
i valori di tipo stringa vengono sottoposti a escape/quotati da chiamando
quoter()
metodo indipendentemente dal fatto che sianonull
:nel caso di PDO_MySQL, èmysql_handle_quoter()
, che (alla fine) passa il valore amysqlnd_cset_escape_quotes()
omysql_cset_escape_slashes()
, a seconda delNO_BACKSLASH_ESCAPES
modalità SQL; -
dato un
null
argomento, entrambe queste funzioni restituiscono una stringa vuota.
La mia opinione è che, prima di attivare il parametro digita
(nel passaggio 2 sopra), pdo_parse_params()
dovrebbe impostare il tipo su PDO::PARAM_NULL
se il valore è null
. Tuttavia, alcuni potrebbero obiettare che ciò impedirebbe la gestione specifica del tipo di null
valori ove appropriato, nel qual caso la stringa (nel passaggio 3 sopra) dovrebbe sicuramente gestire null
valori prima di procedere con una chiamata al quoter()
del driver metodo.
Come soluzione temporanea, disabilitare l'emulazione delle istruzioni preparate è generalmente comunque la cosa migliore:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);