Dies scheint mir ein (nicht gemeldeter?) Fehler in der vorbereiteten Anweisungsemulation von PDO zu sein:
-
die Implementierung von
PDOStatement::execute()
irgendwann ruftpdo_parse_params()
auf ; -
das wiederum versucht, Werte zu zitieren/escapen basierend auf dem Datentyp des relevanten Parameters (wie durch
$data_type
angegeben). Argumente fürPDOStatement::bindValue()
undPDOStatement::bindParam()
– alle Parameter, die als$input_parameters
bereitgestellt werden zuPDOStatement::execute()
werden alsPDO::PARAM_STR
behandelt , wie in der Dokumentation dieser Funktion angegeben); -
string-typisierte Werte werden durch calling
quoter()
-Methode unabhängig davon, ob sienull
sind :im Fall von PDO_MySQL ist dasmysql_handle_quoter()
, die (eventuell) den Wert entweder an <übergibt code>mysqlnd_cset_escape_quotes() odermysql_cset_escape_slashes()
, je nachNO_BACKSLASH_ESCAPES
des Servers SQL-Modus; -
mit
null
versehen Argument, geben beide Funktionen eine leere Zeichenkette zurück.
Meiner Meinung nach, vor dem Einschalten des Parameters Typ
(in Schritt 2 oben), pdo_parse_params()
sollte den Typ auf PDO::PARAM_NULL
setzen wenn der Wert null
ist . Einige mögen jedoch argumentieren, dass dies die typspezifische Behandlung von null
verhindern würde gegebenenfalls Werte, in diesem Fall die String-Fall (in Schritt 3 oben) sollte auf jeden Fall mit null
umgehen Werte, bevor Sie mit einem Aufruf des quoter()
des Treibers fortfahren Methode.
Als vorläufige Problemumgehung ist das Deaktivieren der vorbereiteten Anweisungsemulation normalerweise ohnehin das Beste:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);