Gra*_*avy 4 php mysql null pdo insert
我试图使用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 ;
Run Code Online (Sandbox Code Playgroud)
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))
);
}
Run Code Online (Sandbox Code Playgroud)
例如有时,对于值$fix['FixPM'][$i]是有时 "NULL".如何将其插入数据库?当我运行查询然后查看数据库中的数据时,此记录显示0.0000,而不是null.
如何使用PDO插入NULL值?提供了一些解决方案.
$stmt->execute(array( ':v1' => null, ':v2' => ... ))按照例子使用,因为有时该项目为空,有时不是.因此,我需要引用我创建的变量,并在需要时$fix['FixPM'][$i]将其设置为null提前致谢.
在我看来,这是PDO准备的语句仿真中的一个(未报告的?)错误:
在实施的PDOStatement::execute() 最终调用pdo_parse_params();
反过来,它试图根据相关参数的数据类型引用/转义值(如所提供的$data_type参数PDOStatement::bindValue()和PDOStatement::bindParam()-all参数所示$input_parameters,PDOStatement::execute()被视为PDO::PARAM_STR,如该函数的文档中所述);
字符串类型的值通过调用相关的数据库驱动程序的quoter()方法进行转义/引用,而不管它们是否null:在PDO_MySQL的情况下mysql_handle_quoter(),即(最终)将值传递给mysqlnd_cset_escape_quotes()或者mysql_cset_escape_slashes(),取决于服务器的NO_BACKSLASH_ESCAPESSQL模式;
给定一个null参数,这两个函数都返回一个空字符串.
我的意见是,在打开参数的类型之前(在上面的步骤2中),如果值是,pdo_parse_params()则应将类型设置PDO::PARAM_NULL为null.但是,有些人可能会争辩说这会null在适当的情况下阻止特定于类型的值处理,在这种情况下,字符串大小写(在上面的步骤3中)应该null在继续调用驱动程序quoter()方法之前处理值.
作为临时解决方法,禁用预准备语句仿真通常是最好的:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
Run Code Online (Sandbox Code Playgroud)