带有位域的 PDO 准备好的语句

Posted

技术标签:

【中文标题】带有位域的 PDO 准备好的语句【英文标题】:PDO prepared statements with bit fields 【发布时间】:2012-10-10 05:37:50 【问题描述】:

我在使用 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

返回

返回正确的行数

【问题讨论】:

提示:对于多行字符串赋值,使用HEREDOCs。它们更容易阅读,您不必嵌入 \n 换行符并担心转义引号。 ***.com/questions/10540483/… @rambo,添加答案:) 【参考方案1】:

问题是\n不能在查询中

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

【讨论】:

它适用于所有其他查询。如果省略 where 子句中的 is_demo 行,它可以工作【参考方案2】:

mysql 可以将字符串值“0”转换为在字符串前加上“B”这样的代码:

$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 准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

带有 SQL Server 和准备好的语句的 PHP PDO

如何使用带有 BIT(1) 列的 PDO 准备语句?

位域的 PDO 问题 [重复]

带有命名占位符的 PDO 准备好的语句 IN 子句无法按预期工作 [重复]

SELECT PDO 准备好的语句中的 SELECT [重复]

PDO 是不是仍在为 MySQL 模拟准备好的语句?