PDO准备语句与位字段
PDO准备语句与位字段
在使用PDO预处理语句和bit
数据类型时,我遇到了一个问题。当使用PDO预处理语句从数据库中检索结果时,返回了一个空结果集,但是如果使用普通的SQL查询,正确的结果会返回。如果省略了where子句中的is_demo
字段,它就能正常工作!?
数据库表结构
CREATE TABLE IF NOT EXISTS `user` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `client_id` smallint(5) unsigned NOT NULL, `is_admin` bit(1) NOT NULL, `is_demo` bit(1) NOT NULL, `name` varchar(30) NOT NULL, `pass` varbinary(20) NOT NULL, PRIMARY KEY (`id`), KEY `client_id` (`client_id`), KEY `is_admin` (`is_admin`), KEY `is_demo` (`is_demo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
PDO预处理语句
$sql = "SELECT id,client_id,is_admin,is_demo\n" ."FROM user\n" ."WHERE is_demo=? && client_id=? && name=? && pass=?\n" ."ORDER BY name"; $fields = [ 0, 500, 'test', 123 ]; $sth = $dbh->prepare($sql); $sth->execute($fields);
返回结果
PDOStatement Object ( [queryString] => SELECT id,client_id,is_admin,is_demo FROM user WHERE is_demo=? && client_id=? && name=? && pass=? ORDER BY name )
没有返回行
普通查询
SELECT id, client_id, is_admin, is_demo FROM user WHERE is_demo=0 && client_id=500 && name='test' && pass=123 ORDER BY name
返回结果
返回正确的行数
在使用PDO prepared statements时,如果需要将字符串值"0"转换为bit类型,可以通过在字符串前加上"B"来实现。例如,在以下代码中,可以将字符串"0"转换为bit类型:
$sql = "SELECT id,client_id,is_admin,is_demo\n" ."FROM user\n" ."WHERE is_demo=B? && client_id=? && name=? && pass=?\n" ."ORDER BY name"; $fields = [ '0', 500, 'test', 123 ]; $sth = $dbh->prepare($sql); $sth->execute($fields);
然而,使用PDO prepared statements时,如果直接将字符串值"0"传递给参数绑定,MySQL会将其作为字符串而不是bit类型处理。这可能导致查询结果不符合预期。
为了解决这个问题,可以在字符串前加上"B",将其转换为bit类型。这可以通过在SQL查询中使用`B?`来实现。在上述代码中,`is_demo=B?`将字符串"0"转换为bit类型。
通过使用`B?`并将字符串值"0"转换为bit类型,可以确保在查询中正确处理bit字段。这样,查询结果将符合预期。
总结起来,PDO prepared statements在处理bit字段时可能出现问题,因为直接将字符串值"0"传递给参数绑定时,MySQL会将其作为字符串处理。为了解决这个问题,可以使用`B?`将字符串值"0"转换为bit类型,以确保查询结果符合预期。