2

プロジェクトで Doctrine DBAL を使用しようとしています。私のデータベースは Postgresql です。これは単純な使用例であり、なぜこれが機能しないのか本当にわかりません。

$query = "SELECT * FROM table ORDER BY field :order LIMIT :amount";

次のように仮定します。

$order = 'DESC' and $amount = 'ALL';

上記のコードは問題ないようです。

$statement = $app['db']->prepare($sql);
$statement->bindValue('order', $order);
$statement->bindValue('amount', $amount);
$statement->execute();

次のエラーが表示されます。

SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1"
LINE 1: SELECT * FROM table ORDER BY field $1 LIMIT $2

誰かがこの動作を説明できますか? 私は引用の問題を疑っています...

よろしく
カミル

4

2 に答える 2

2

昏睡状態に陥っていませんか?

SELECT * FROM table ORDER BY field, :order LIMIT :amount

(ところで、このようなものには、エミュレートされた準備済みステートメントを実際に使用する必要があります。そうしないと、order by/limit 句によって、基本的に、あらゆる場所で seq スキャンが発生することが保証されます。)

于 2013-11-20T22:56:02.607 に答える
1

わかりました、私はこれを理解しました。

SQL 言語の一部は、準備済みステートメントのパラメーターとして使用できません。したがって、たとえば、そのようなクエリを作成するには、ある種の条件を使用する必要があります。

$sql = 'SELECT * FROM table ORDER BY field ';
if ($order = 'ASC') {
  $sql .= 'ASC ';
} else ... {
  ...
}
$sql .= 'LIMIT :amount';

これですべてが機能するはずです。
また、coma の後のパラメーターは、すべてのクエリに共通のパラメーターとして扱われ、機能しませんでした。それがすべてかもしれませんが、結果には何の影響もありませんでした。
スレッドは閉じられると思います...

于 2013-11-21T14:08:54.913 に答える