Mysql
 sql >> Database >  >> RDS >> Mysql

Debug PDO mySql inserisce NULL nel database anziché vuoto

Questo mi sembra essere un bug (non segnalato?) nell'emulazione dell'istruzione preparata da PDO:

  1. l'implementazione di PDOStatement::execute() eventualmente richiama pdo_parse_params() ;

  2. 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 per PDOStatement::bindValue() e PDOStatement::bindParam() —tutti i parametri forniti come $input_parameters a PDOStatement::execute() sono trattati come PDO::PARAM_STR , come indicato nella documentazione di tale funzione);

  3. i valori di tipo stringa vengono sottoposti a escape/quotati da chiamando quoter() metodo indipendentemente dal fatto che siano null :nel caso di PDO_MySQL, è mysql_handle_quoter() , che (alla fine) passa il valore a mysqlnd_cset_escape_quotes() o mysql_cset_escape_slashes() , a seconda del NO_BACKSLASH_ESCAPES modalità SQL;

  4. 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);