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_typeargumenter tilPDOStatement::bindValue()ogPDOStatement::bindParam()-alle parametre angivet som$input_parameterstilPDOStatement::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_ESCAPESSQL-tilstand; -
givet en
nulargument, 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);