問題は次のとおりです:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
PDOStatement ::execute() のマニュアルページ 言う(私の強調):
パラメータ
input_parameters
実行中のSQLステートメントにバインドされたパラメーターと同じ数の要素を持つ値の配列。 すべての値はPDO::PARAM_STRとして扱われます 。
したがって、パラメータは文字列として挿入されるため、最終的なSQLコードは次のようになります。
LIMIT '0', '10'
これは、MySQLが数値にキャストせず、解析エラーをトリガーする特定のケースです:
mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1
ドキュメント 言わなければならない:
LIMIT
句を使用して、SELECT
によって返される行数を制限できます。 声明。LIMIT
1つまたは2つの数値引数を取ります。これらは両方とも非負の整数定数である必要がありますが、次の例外があります。
プリペアドステートメント内で、
LIMIT
パラメータは?を使用して指定できますプレースホルダーマーカー。ストアドプログラム内で、
LIMIT
パラメータは、整数値のルーチンパラメータまたはローカル変数を使用して指定できます。
選択肢は次のとおりです。
-
タイプを設定できるように、パラメータを1つずつバインドします:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
これらの値をパラメータとして渡さないでください:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
エミュレートされた準備を無効にします(MySQLドライバーには、数値引数を引用するバグ/機能があります):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);