Zdá se mi, že jde o (nenahlášenou?) chybu v emulaci připraveného příkazu PDO:
-
implementace z
PDOStatement::execute()případně vyvolápdo_parse_params(); -
že se na oplátku pokouší citovat/uniknout hodnoty na základě datového typu příslušného parametru (jak je označeno
$data_typeargumenty proPDOStatement::bindValue()aPDOStatement::bindParam()—všechny parametry poskytnuty jako$input_parametersnaPDOStatement::execute()jsou považovány zaPDO::PARAM_STR, jak je uvedeno v dokumentaci k této funkci); -
hodnoty typu string jsou uvozeny/uvozeny voláním příslušný databázový ovladač
quoter()bez ohledu na to, zda jsounull:v případě PDO_MySQL je tomysql_handle_quoter(), který (nakonec) předá hodnotu buďmysqlnd_cset_escape_quotes()nebomysql_cset_escape_slashes(), v závislosti na serveruNO_BACKSLASH_ESCAPESrežim SQL; -
má hodnotu
nullargument, obě tyto funkce vrátí prázdný řetězec.
Můj názor je, že před přepnutím parametru typ
(v kroku 2 výše), pdo_parse_params() by měl nastavit typ na PDO::PARAM_NULL pokud je hodnota null . Někteří by však mohli namítnout, že to zabrání typově specifickému zacházení s null hodnoty, kde je to vhodné, v takovém případě případ řetězce (v kroku 3 výše) by rozhodně měl zpracovávat null hodnoty před pokračováním ve volání ovladače quoter() metoda.
Jako dočasné řešení je obvykle nejlepší zakázat emulaci připraveného příkazu:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);