Dette forekommer mig at være en (n urapporteret?) fejl i PDO's forberedte erklæringsemulering:
-
implementeringen af
PDOStatement::execute()
til sidst påkalderpdo_parse_params()
; -
som til gengæld forsøger at citere/undslippe værdier baseret på den relevante parameters datatype (som angivet af
$data_type
argumenter tilPDOStatement::bindValue()
ogPDOStatement::bindParam()
-alle parametre angivet som$input_parameters
tilPDOStatement::execute()
behandles somPDO::PARAM_STR
, som angivet i dokumentationen for den funktion); -
streng-type værdier er escaped/citeret af opkald den relevante databasedrivers
quoter()
metode, uanset om de ernull
:i tilfælde af PDO_MySQL er det mysql_handle_quoter() , som (til sidst) sender værdien til enten >mysqlnd_cset_escape_quotes()
ellermysql_cset_escape_slashes()
, afhængigt af serverensNO_BACKSLASH_ESCAPES
SQL-tilstand; -
givet en
nul
argument, returnerer begge disse funktioner en tom streng.
Min mening er, at før aktiverer parameterens type
(i trin 2 ovenfor), pdo_parse_params()
skal indstille typen til PDO::PARAM_NULL
hvis værdien er null
. Nogle vil dog hævde, at dette ville forhindre typespecifik håndtering af null
værdier, hvor det er relevant, i hvilket tilfælde strengcasen (i trin 3 ovenfor) burde helt sikkert håndtere null
værdier, før du fortsætter med et kald til førerens quoter()
metode.
Som en midlertidig løsning er deaktivering af forberedt sætningsemulering normalt alligevel det bedste:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);