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_type
argumenty proPDOStatement::bindValue()
aPDOStatement::bindParam()
—všechny parametry poskytnuty jako$input_parameters
naPDOStatement::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_ESCAPES
režim SQL; -
má hodnotu
null
argument, 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);