2

我们有类似下面的 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 或包含双精度值。在它为空/null的情况下,我们只想插入一个空值,但我们收到以下错误:

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

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

4

1 回答 1

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);
}

关于php 手册中的bindValue vs bindParam

绑定参数()

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

大多数参数是输入参数,即以只读方式用于构建查询的参数。一些驱动程序支持调用将数据作为输出参数返回的存储过程,而一些驱动程序还支持作为输入/输出参数发送数据并更新以接收数据的存储过程。

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

于 2012-11-29T14:22:57.393 回答