問題は次のとおりです。
$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 つの数値引数を取ります。これらは両方とも非負の整数定数でなければなりません。
選択肢は次のとおりです。
パラメータを 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);