PDO准备语句与位字段

24 浏览
0 Comments

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

返回结果

返回正确的行数

0
0 Comments

在使用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类型,以确保查询结果符合预期。

0
0 Comments

问题出现的原因是查询语句中的换行符"\n"无法正常被识别,导致查询失败。

解决方法是去除查询语句中的换行符"\n",或者使用其他方式来表示换行。

修改后的查询语句如下:

$sql = "SELECT id, client_id, is_admin, is_demo
FROM user
WHERE is_demo=? && client_id=? && name=? && pass=?
ORDER BY name";

这样修改后的查询语句中已经没有换行符"\n",可以正常执行查询操作。

0