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_typeargomenti perPDOStatement::bindValue()ePDOStatement::bindParam()—tutti i parametri forniti come$input_parametersaPDOStatement::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_ESCAPESmodalità SQL; -
dato un
nullargomento, 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);