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 ユーザー、役割、およびリソースがあります。ユーザーはリソースを持つことができ、ロールはリソースを持つことができます。ユーザーには 1 つの役割があります。テーブル user_resource には、ユーザーがリソースへのアクセスを許可されているかどうかを示すフィールドがあります。役割についても同様です。すべてのリソースを含むテーブル (HTML テーブル) が必要で、ユーザーがリソースへのアクセスを許可されているかどうかを確認します (最初に user_resource を介して、次に role_resource を介して)。

4

2 に答える 2

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 に答える
1

バインドなしで実行を直接呼び出してみましたか。

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