3

我有以下内容,但我无法让它工作:

$pdo = new \PDO('pgsql:host=xxxx;port=xxx;dbname=xxx;user=xxx;password=xxx');

$foo = 123;
$bar = 123;

$query = '
SELECT *, 
(
    SELECT allow
    FROM foo 
    WHERE foo_field = ?
    AND lorem.lorem_id = foo.lorem_id
) as foo_allowed, (
    SELECT allow
    FROM bar
    WHERE bar_id = ?
    AND lorem.lorem_id = bar.lorem_id
) as bar_allowed
FROM lorem';

$stmt = $pdo->prepare($query);
$stmt->bindValue(1, $foo);
$stmt->bindValue(2, $bar);
$stmt->execute();

var_dump($stmt->fetchAll());

上面的代码给了我以下错误:

消息:执行“(查询)”时发生异常:SQLSTATE [08P01]:<>:7 错误:绑定消息提供 2 个参数,但准备好的语句“”需要 1 个

我在mysql中尝试了同样的方法,效果很好。我也尝试过命名参数,但这也不起作用。

使用 PHP 5.4.6 和 PostgreSQL 9.1.7。

@Kovge 我有用户、角色和资源。用户可以拥有资源,角色可以拥有资源。一个用户只有一个角色。在表 user_resource 中有一个字段表示是否允许用户访问资源。角色也是一样。我想要一个包含所有资源的表(HTML 表),并查看是否允许用户访问资源(首先通过 user_resource,然后是 role_resource)

4

2 回答 2

1

您是否尝试过不绑定直接调用执行。

$stmt = $pdo->prepare($query);
$stmt->execute(array( 1 => $foo, 2 => $bar));
于 2014-10-09T11:19:43.417 回答
1

你能用表连接代替吗?所以你的查询变成了这样:

SELECT l.*,
       f.allow,
       b.allow
  FROM foo_allowed f INNER JOIN
       lorem l ON ( l.lorem_id = f.lorem_id ) INNER JOIN       
       bar_allowed b ON ( l.lorem_id = b.lorem_id )       
 WHERE f.foo_field = ?
   AND b.bar_field = ?

我没有对此进行测试,因此语法可能是错误的。

于 2013-04-09T16:06:01.967 回答