【发布时间】:2012-12-06 04:00:05
【问题描述】:
我正在尝试使用 PDO 将“NULL”动态插入到数据库中。
表结构:
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 查询:
$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] 的值是sometimes'NULL'。如何将其插入数据库?当我运行查询然后查看数据库中的数据时,这条记录显示的是 0.0000,而不是 null。
How do I insert NULL values using PDO? 提供了一些解决方案。
- 我认为我不能按照示例使用
$stmt->execute(array( ':v1' => null, ':v2' => ... )),因为有时该项目为空,有时则不是。因此,我需要引用我创建的变量$fix['FixPM'][$i]并在需要时将其设为 null
提前致谢。
【问题讨论】:
-
FixPM字段在Fixed表架构中是否可以为空? -
您好,我已经澄清了这个问题。表结构显示 FixPM 可以为空。
-
变量的值实际上是
NULL,还是字符串'NULL',当转换为数值时将转换为0? PDO 应该正确处理真正的NULL,但字符串会被强制转换。 -
$fix["FixPM"][0] = null;这没有做任何事情(不好)。和 $fix["FixPM"][0] = 'NULL';转换为 0.00000(不好)
-
实际的NULL值不起作用?我觉得这很奇怪。要修复字符串,您需要
':fixPM' => strtoupper($fix['FixPM'][$i]) === 'NULL' ? NULL : $fix['FixPM'][$i],