Струва ми се, че това е (недокладван?) бъг в емулацията на подготвеното изявление на PDO:
-
имплементацията на
PDOStatement::execute()
в крайна сметка извикваpdo_parse_params()
; -
че от своя страна се опитва да цитира/избяга стойности въз основа на типа данни на съответния параметър (както е посочено от
$data_type
аргументи къмPDOStatement::bindValue()
иPDOStatement::bindParam()
—всички параметри, предоставени като$input_parameters
къмPDOStatement::execute()
се третират катоPDO::PARAM_STR
, както е посочено в документацията на тази функция); -
стойностите, въведени в низ са екранирани/в кавички от извикване
quoter()<на съответния драйвер на базата данни /код>
метод, независимо дали саnull
:в случая на PDO_MySQL, това еmysql_handle_quoter()
, което (в крайна сметка) предава стойността наmysqlnd_cset_escape_quotes()
илиmysql_cset_escape_slashes()
, в зависимост отNO_BACKSLASH_ESCAPES
на сървъра SQL режим; -
дадено
null
аргумент, и двете функции връщат празен низ.
Моето мнение е, че преди превключването на параметъра тип
(в стъпка 2 по-горе), pdo_parse_params()
трябва да зададе типа на PDO::PARAM_NULL
ако стойността е null
. Някои обаче биха могли да твърдят, че това би предотвратило специфично за типа обработка на null
стойности, където е уместно, в който случай редов случай (в стъпка 3 по-горе) определено трябва да обработва null
стойности, преди да продължите с извикване на quoter()
на драйвера метод.
Като междинно решение, деактивирането на емулация на подготвени оператори обикновено е най-доброто:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);