Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Debug PDO mySql fügt NULL in die Datenbank ein statt leer

Dies scheint mir ein (nicht gemeldeter?) Fehler in der vorbereiteten Anweisungsemulation von PDO zu sein:

  1. die Implementierung von PDOStatement::execute() irgendwann ruft pdo_parse_params() auf ;

  2. das wiederum versucht, Werte zu zitieren/escapen basierend auf dem Datentyp des relevanten Parameters (wie durch $data_type angegeben). Argumente für PDOStatement::bindValue() und PDOStatement::bindParam() – alle Parameter, die als $input_parameters bereitgestellt werden zu PDOStatement::execute() werden als PDO::PARAM_STR behandelt , wie in der Dokumentation dieser Funktion angegeben);

  3. string-typisierte Werte werden durch calling quoter() -Methode unabhängig davon, ob sie null sind :im Fall von PDO_MySQL ist das mysql_handle_quoter() , die (eventuell) den Wert entweder an <übergibt code>mysqlnd_cset_escape_quotes() oder mysql_cset_escape_slashes() , je nach NO_BACKSLASH_ESCAPES des Servers SQL-Modus;

  4. 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);