Струва ми се, че това е (недокладван?) бъг в емулацията на подготвеното изявление на 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);