我在使用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搜索向我显示其他人遇到了同样的问题,但没有解决方案。
答案 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的很多其他情况下,0
和false
将是等价的,但它们仍然不是同一个东西,并且从PostgreSQL的角度来看,一个空字符串作为值有点是不可接受的。
当将位值传递给false
或类似时,php代码应将0
转换为execute()
。
使用
$sth->bindParam(':param', $value, PDO::PARAM_INT);
当$value
为false
时,也会有效,因为这会强制转换为0
。