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_typeangegeben). Argumente fürPDOStatement::bindValue()undPDOStatement::bindParam()– alle Parameter, die als$input_parametersbereitgestellt werden zuPDOStatement::execute()werden alsPDO::PARAM_STRbehandelt , wie in der Dokumentation dieser Funktion angegeben); -
string-typisierte Werte werden durch calling
quoter()-Methode unabhängig davon, ob sienullsind :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_ESCAPESdes Servers SQL-Modus; -
mit
nullversehen 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);