Я пытаюсь динамически вставить «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]
и сделать это нулевым, когда и когда это необходимо Заранее спасибо.
Мне кажется, что это ошибка (n unreported?) В подготовленной формулировке заявления PDO:
реализация PDOStatement::execute()
конечном итоге вызывает pdo_parse_params()
;
что, в свою очередь, пытается указать / PDOStatement::bindValue()
значения на основе типа данных соответствующего параметра (как указано параметрами $data_type
параметров PDOStatement::bindValue()
и PDOStatement::bindParam()
предоставленными как $input_parameters
для PDOStatement::execute()
рассматриваются как PDO::PARAM_STR
, как указано в документации к этой функции);
строковые значения экранируются / цитируются путем вызова метода quoter()
соответствующего драйвера базы данных независимо от того, являются ли они null
: в случае PDO_MySQL это mysql_handle_quoter()
, который (в конечном итоге) передает значение либо mysqlnd_cset_escape_quotes()
либо mysql_cset_escape_slashes()
, в зависимости от NO_BACKSLASH_ESCAPES
SQL NO_BACKSLASH_ESCAPES
SQL;
с учетом null
аргумента, обе эти функции возвращают пустую строку.
Я считаю, что до включения типа параметра (на шаге 2 выше) pdo_parse_params()
должен установить тип в PDO::PARAM_NULL
если значение равно null
. Тем не менее, некоторые могут утверждать, что это предотвратило бы обращение к null
значениям типа, когда это необходимо, и в этом случае случай строки (на шаге 3 выше) должен определенно обрабатывать null
значения, прежде чем приступать к вызову метода quoter()
.
В качестве промежуточного обходного пути отключение готовой эмуляции отчета, как правило, в лучшем случае:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);