記事表示

PDOの不具合

PDOのプレースホルダが意図したとおりに動作しません…。

$stmt = $pdo->prepare('SELECT * FROM address LIMIT ?, ?');
$flag = $stmt->execute(array(0, 5));

こんな風に書くと、SQLの文法エラーと言われてしまいます。
プレースホルダを文字で指定しても駄目。

$stmt = $pdo->prepare('SELECT * FROM address LIMIT :from, :to');
$flag = $stmt->execute(array(':from' => 0, ':to' => 5));

LIMIT句以外なら、普通にプレースホルダが機能するんだけどなぁ…。
ちなみに、bindValue() で値を指定してから execute() を実行するようにすればLIMIT句でも大丈夫だった。

$stmt = $pdo->prepare('SELECT * FROM address LIMIT ?, ?');
$stmt->bindValue(1, 0, PDO::PARAM_INT);
$stmt->bindValue(2, 5, PDO::PARAM_INT);
$flag = $stmt->execute();

文字で指定しても当然のように動作します。

$stmt = $pdo->prepare('SELECT * FROM address LIMIT :from, :to');
$stmt->bindValue(':from', 0, PDO::PARAM_INT);
$stmt->bindValue(':to',   5, PDO::PARAM_INT);
$flag = $stmt->execute();

なかなか原因が判らなかったけど、これはPDOの不具合らしい。

何とも厄介な…。公式サイトには

PDO::execute() errors when parameters are used in LIMIT clause

と書かれているので execute() の問題らしいけど、bindValue() を使えばバージョンに関わらず実行できる…と思っていいのかな…。
うっかりミスでSQLインジェクションが起こり得ないようにするためにプレースホルダを使っている(僕の場合は)ので、「LIMIT句に値を渡すときだけ直接指定する」という書き方は極力避けたいのだけど。

ページ移動

トラックバックURL

  • http://www.favorite-labo.org/blog/trackback/101

トラックバック

  • トラックバックはまだありません。

コメント

  • コメントはまだありません。

コメント投稿

  • コメントを入力して投稿ボタンを押してください。
投稿フォーム
名前
Eメール
URL
コメント
投稿キー

投稿キーには以下の数値を半角で入力してください。(スパム対策)

投稿キー

コメントプレビュー

JavaScriptをONにすると、ここにプレビューを表示できます。

ユーティリティ

2009年01月

- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

ツールメニュー

メッセージ

匿名で一言送信できます。

送信フォーム
メッセージ

RSSリーダー

  • JavaScriptをONにすると、RSSリーダーが表示されます。

利用ツール