Debug PDO mySql вставляет NULL в базу данных вместо пустой

Я пытаюсь динамически вставить «NULL» в базу данных с помощью PDO.

СТРУКТУРА ТАБЛИЦЫ:

CREATE TABLE IF NOT EXISTS `Fixes` ( `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'PK', `CurrencyId` int(11) NOT NULL COMMENT 'FK', `MetalId` int(11) NOT NULL COMMENT 'FK', `FixAM` decimal(10,5) NOT NULL, `FixPM` decimal(10,5) DEFAULT NULL, `TimeStamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`Id`), KEY `CurrencyId` (`CurrencyId`), KEY `MetalId` (`MetalId`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13 ; 

PHP / PDO QUERY:

 $sql = 'UPDATE Fixes SET FixAM = :fixAM, FixPM = :fixPM WHERE MetalId IN (SELECT Id FROM Metals WHERE Name = :metal) AND CurrencyId IN (SELECT Id FROM Currencies Where Id = :currency)'; $stmt = $db->prepare($sql); for ($i = 0; $i<3; $i++) { $stmt->execute(array( ':metal' => 'Silver', ':fixAM' => $fix['FixAM'][$i], ':fixPM' => $fix['FixPM'][$i], ':currency' => ($i+1)) ); } 

например, иногда значение $fix['FixPM'][$i] иногда является «NULL». Как вставить это в базу данных? Когда я запускаю запрос, а затем просматриваю данные в базе данных, эта запись показывает 0.0000, а не null.

Как вставить значения NULL с помощью PDO? предоставляет несколько решений.

  • Я не думаю, что могу использовать $stmt->execute(array( ':v1' => null, ':v2' => ... )) в соответствии с примером, потому что иногда элемент имеет значение null, а иногда и нет. Таким образом, мне нужно обратиться к переменной, которую я создал $fix['FixPM'][$i] и сделать это нулевым, когда и когда это необходимо

Заранее спасибо.

Related of "Debug PDO mySql вставляет NULL в базу данных вместо пустой"

Мне кажется, что это ошибка (n unreported?) В подготовленной формулировке заявления PDO:

  1. реализация PDOStatement::execute() конечном итоге вызывает pdo_parse_params() ;

  2. что, в свою очередь, пытается указать / PDOStatement::bindValue() значения на основе типа данных соответствующего параметра (как указано параметрами $data_type параметров PDOStatement::bindValue() и PDOStatement::bindParam() предоставленными как $input_parameters для PDOStatement::execute() рассматриваются как PDO::PARAM_STR , как указано в документации к этой функции);

  3. строковые значения экранируются / цитируются путем вызова метода quoter() соответствующего драйвера базы данных независимо от того, являются ли они null : в случае PDO_MySQL это mysql_handle_quoter() , который (в конечном итоге) передает значение либо mysqlnd_cset_escape_quotes() либо mysql_cset_escape_slashes() , в зависимости от NO_BACKSLASH_ESCAPES SQL NO_BACKSLASH_ESCAPES SQL;

  4. с учетом null аргумента, обе эти функции возвращают пустую строку.

Я считаю, что до включения типа параметра (на шаге 2 выше) pdo_parse_params() должен установить тип в PDO::PARAM_NULL если значение равно null . Тем не менее, некоторые могут утверждать, что это предотвратило бы обращение к null значениям типа, когда это необходимо, и в этом случае случай строки (на шаге 3 выше) должен определенно обрабатывать null значения, прежде чем приступать к вызову метода quoter() .

В качестве промежуточного обходного пути отключение готовой эмуляции отчета, как правило, в лучшем случае:

 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);