我们有类似下面的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。如何规避这个错误?
答案 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需要传入变量或引用。