Wydaje mi się, że jest to (niezgłoszony?) błąd w emulacji przygotowanej instrukcji PDO:
-
implementacja z
PDOStatement::execute()
ewentualnie wywołujepdo_parse_params()
; -
to z kolei próby cytowania/unikania wartości na podstawie typu danych odpowiedniego parametru (jak wskazuje
$data_type
argumenty doPDOStatement::bindValue()
iPDOStatement::bindParam()
—wszystkie parametry podane jako$input_parameters
doPDOStatement::execute()
są traktowane jakoPDO::PARAM_STR
, zgodnie z dokumentacją tej funkcji); -
wartości wpisane w ciąg znaków są cytowane/wymieniane przez wywołanie odpowiedni sterownik bazy danych
quoter()
metoda niezależnie od tego, czy sąnull
:w przypadku PDO_MySQL jest tomysql_handle_quoter()
, który (ostatecznie) przekazuje wartość domysqlnd_cset_escape_quotes()
lubmysql_cset_escape_slashes()
, w zależności odNO_BACKSLASH_ESCAPES
serwera tryb SQL; -
otrzymał
null
argument, obie te funkcje zwracają pusty ciąg.
Moim zdaniem przed włączeniem parametru wpisz
(w kroku 2 powyżej), pdo_parse_params()
powinien ustawić typ na PDO::PARAM_NULL
jeśli wartość to null
. Jednak niektórzy mogą twierdzić, że uniemożliwiłoby to obsługę specyficznego dla typu null
wartości tam, gdzie to konieczne, w takim przypadku string case (w kroku 3 powyżej) zdecydowanie powinien obsługiwać null
wartości przed kontynuowaniem wywołania funkcji quoter()
sterownika metoda.
Jako tymczasowe obejście, wyłączenie emulacji przygotowanych instrukcji jest zazwyczaj najlepsze:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);