【问题标题】:SQLite PDO bindings not working?SQLite PDO 绑定不起作用?
【发布时间】:2011-08-27 18:05:36
【问题描述】:

我觉得我在这件事上失去了理智。我有三个简单的表。用户表、角色表和以多对多关系连接用户和角色的 role_user 表。

我对用户的角色有以下代码:

$query = $pdo->prepare('select roles.* from roles inner join role_user on roles.id = role_user.role_id where role_user.user_id = ?');
$query->execute(array('1'));
die(var_dump($query->fetchAll()));

这将返回一个空数组。没有结果。但是,如果我将代码更改为此,我将获得用户的角色:

$query = $pdo->prepare('select roles.* from roles inner join role_user on roles.id = role_user.role_id where role_user.user_id = 1');
$query->execute();
die(var_dump($query->fetchAll()));

我是否遗漏了一些非常明显的东西?我的 SQL 有什么东西弄乱了绑定吗?为什么绑定的示例不起作用?

【问题讨论】:

  • 如果你说array(1)怎么办?字符串和数字之间的区别对于 SQLite 来说应该无关紧要,但是......
  • @mu - 试过了。没有结果。这真的让我大吃一惊!我以前做过大量的 PDO 工作,但从未见过这样的事情。
  • 如果您使用bindParam 填充占位符而不是提供给execute,会发生什么情况?
  • 伙计,如果这有什么不同,我要吃一顶帽子。 execute(array(...)) 应该与调用 bindParam/bindValue 完全相同。嗯。你有switched PDO to exception-throwing mode吗?也许那里还有另一个错误被隐藏了。
  • @TaylorOtwell 然后发布您的评论作为答案并接受它以帮助未来的观众

标签: php sqlite pdo


【解决方案1】:

这是 PDO 中的一个错误:http://bugs.php.net/bug.php?id=45259

作为一种解决方法,以下代码虽然较重,但在 PHP5.3 中应该可以工作:

$query = $pdo->prepare(
    'select roles.* from roles inner join role_user on roles.id = role_user.role_id '
    . 'where role_user.user_id = :id'
);
$query->bindValue(':id', 1, PDO::PARAM_INT);
$query->execute();
die(var_dump($query->fetchAll()));

最新版本的 SQLite 有原生的预处理语句,但我认为 PDO 还不能使用它们(IIRC,PDO 的代码没有真正的维护者,所以它没有太多发展)。它可能不会改变任何东西,但您仍然可以尝试使用 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); 禁用模拟

【讨论】:

  • 这个答案是否可以通用,以便适用于任何类型的绑定值?
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 2015-06-10
  • 2014-02-26
  • 2012-09-17
  • 1970-01-01
  • 2017-12-05
  • 2013-06-08
  • 2020-09-05
相关资源
最近更新 更多