当bitvalue为false时,PostgreSQL错误

时间:2012-09-21 23:40:54

标签: php postgresql pdo

我在使用PDO将比特值保存到PostgreSQL-DB时遇到了一些麻烦。每当位(bool)为假时我都会收到此错误

Warning: PDOStatement::execute(): SQLSTATE[22026]: String data, length mismatch: 7 
ERROR: bit string length 0 does not match type bit(1) in /var/www/html/application/models/Database.php on line 75

代码显示有点复杂,但这是进入DB类的内容。

UPDATE users SET name=:name,email=:email,address=:address,zip=:zip,joindate=:joindate,phone=:phone,password=:password,activationcode=:activationcode,birthdate=:birthdate,lastdigits=:lastdigits,driverlicense=:driverlicense,e_presentation=:e_presentation,e_showphone=:e_showphone,e_showaddress=:e_showaddress,e_radius=:e_radius,e_showinsearch=:e_showinsearch,w_presentation=:w_presentation,w_showphone=:w_showphone,w_showaddress=:w_showaddress,w_radius=:w_radius,w_showinsearch=:w_showinsearch WHERE id=:id

与参数绑定的数据

Array ( [:name] => My Name [:email] => myemail@gmail.com [:address] => My Address [:zip] => 79133 [:joindate] => 2012-09-18 12:39:56.769584 [:phone] => 073 917 13 97 [:password] => c6d18ac44b378ff3cecf09d9ebec31ad301c4394d7e1sdfjksc81cd3fbf47777f8df0ac9f33d14da18d71b76fc9c3e1210cb2efcabf6ed66f779d [:activationcode] => [:birthdate] => 1993-08-05 [:lastdigits] => 5079 [:driverlicense] => 0 [:e_presentation] => Test [:e_showphone] => 1 [:e_showaddress] => 1 [:e_radius] => 10 [:e_showinsearch] => 1 [:w_presentation] => Test [:w_showphone] => 1 [:w_showaddress] => 1 [:w_radius] => 10 [:w_showinsearch] => 1 [:id] => 28 ) 1

快速Google搜索向我显示其他人遇到了同样的问题,但没有解决方案。

2 个答案:

答案 0 :(得分:2)

也许您最好使用boolean类型而不是bit(1)

如果您确实需要将boolean值转换为bit(1),则直接投射不起作用:

select FALSE::bit(1), TRUE::bit(1)

但这有效:

select FALSE::int::bit(1), TRUE::int::bit(1)

先转为integer,然后转为bit

答案 1 :(得分:1)

如果我们认为某个位是1或0的数字,那么php中的false不是数字。
<? echo false; ?>打印一个空字符串,而不是数字0 在PHP的很多其他情况下,0false将是等价的,但它们仍然不是同一个东西,并且从PostgreSQL的角度来看,一个空字符串作为值有点是不可接受的。

当将位值传递给false或类似时,php代码应将0转换为execute()。 使用

$sth->bindParam(':param', $value, PDO::PARAM_INT);
$valuefalse时,

也会有效,因为这会强制转换为0