使用PDO发送空值会导致错误

时间:2012-11-29 13:59:18

标签: php postgresql pdo double postgresql-8.4

我们有类似下面的PDO语句,我们用它来与PostgreSQL 8.4 DB进行通信。

$st = $db -> prepare("INSERT INTO Saba.Betriebskosten (personalkosten)
                                            VALUES(:kd_personalkosten)");
$st -> bindParam(':kd_personalkosten', $val['kd_personalkosten']);

$ val ['kd_personalkosten']为空/ null或包含double值。在它为空/ null的情况下,我们只想插入一个空值,但是我们收到以下错误:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for type double precision: '';

这意味着将empty / null转换为与双精度字段不兼容的空STRING。如何规避这个错误?

1 个答案:

答案 0 :(得分:3)

在我看来,值是“”(空字符串)bindParam在SQL查询中转换为“”,并且由于personalkosten的类型为Double,因此会引发错误。

这应解决此问题与空文本以进行双重转换:

$st -> bindParam(':kd_personalkosten', (float) $val['kd_personalkosten']);

如果你真的想在变量为空时插入NULL值,那么你应该这样做:

$value = $val['kd_personalkosten'];
if ($value === '' or $value === NULL) {
    $st->bindValue(':kd_personalkosten', NULL, PDO::PARAM_NULL); // note the bindValue() instead of bindParam()
} else {
    $st->bindParam(':kd_personalkosten', $value);
}

关于bindValue vs bindParam来自php手册:

  

bindParam()

     

将PHP变量绑定到相应的命名或问号   占位符在用于准备的SQL语句中   声明。与PDOStatement :: bindValue()不同,变量绑定为   参考,只会在当时进行评估   调用PDOStatement :: execute()。

     

大多数参数都是输入参数,即参数   以只读方式使用以构建查询。一些司机   支持调用将数据作为输出返回的存储过程   参数,还有一些也作为输入/输出参数发送   数据并更新以接收它。

基本上,bindValue允许您绑定直接值或常量,而bindParam需要传入变量或引用。