php – 调试PDO mySql将NULL插入数据库而不是空

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 调试PDO mySql将NULL插入数据库而不是空脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使用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 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.

How do I insert NULL values using PDO?提供了一些解决方案.

>我不认为我可以使用$stmt-> execute(array(‘:v1’=> null,’:v2’=> …)),因为有时该项为null,有时不会.因此,我需要引用我创建的变量$fix [‘FixPM’] [$i]并在需要时将其设为null

提前致谢.

解决方法

在我看来,这是PDO准备的语句仿真中的一个(未报告的?)错误

> PDOstatement的implementation :: execute()eventually调用pdo_parse_params();
>反过来,attempts to quote/escape values基于相关参数的数据类型(由PDOStatement::bindValue()PDOStatement::bindParam()的$data_tyPE参数指示 – 作为$input_parameters到PDOStatement::execute()提供的所有参数被视为PDO :: PARAM_STR,如文档中所述功能);
>字符串类型值由calling相关数据库驱动程序的quoter()方法转义/引用,而不管它们是否为空:在PDO_MysqL的情况下,即mysql_handle_quoter(),它(最终)将值传递给mysqlnd_cset_escape_quotes()mysql_cset_escape_slashes(),具体取决于服务器NO_BACKSLASH_ESCAPES sql模式;
>给定一个null参数,这两个函数都返回一个空字符串.

我的观点是,在switching on the parameter’s type之前(在上面的步骤2中),如果值为null,pdo_parse_params()应该将类型设置为PDO :: PARAM_NULL.但是,有些人可能会争辩说这会在适当的情况下阻止特定于类型的null值处理,在这种情况下,string case(在上面的步骤3中)应该在继续调用驱动程序的quoter()方法之前处理空值.

作为临时解决方法,禁用预准备语句仿真通常是最好的:

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

脚本宝典总结

以上是脚本宝典为你收集整理的php – 调试PDO mySql将NULL插入数据库而不是空全部内容,希望文章能够帮你解决php – 调试PDO mySql将NULL插入数据库而不是空所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。