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_typeargumenty doPDOStatement::bindValue()iPDOStatement::bindParam()—wszystkie parametry podane jako$input_parametersdoPDOStatement::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_ESCAPESserwera tryb SQL; -
otrzymał
nullargument, 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);