CREATE TABLE IF NOT EXISTS comments ( id INTEGER PRIMARY KEY AUTOINCREMENT, resource_id INTEGER NOT NULL, user_id INTEGER NOT NULL, body TEXT NOT NULL, created_at TEXT NOT NULL);CREATE INDEX IF NOT EXISTS idx_comments_resource ON comments (resource_id, id ASC);
$stmt = $this->pdo->prepare( 'SELECT * FROM comments WHERE resource_id = :rid ORDER BY id ASC LIMIT :lim OFFSET :off');$stmt->bindValue(':rid', $resourceId, PDO::PARAM_INT);$stmt->bindValue(':lim', $limit, PDO::PARAM_INT);$stmt->bindValue(':off', $offset, PDO::PARAM_INT);
How-to: コメントスレッド API
このガイドでは、ページネーション・著者のみによる削除・管理者オーバーライドを備えた、リソーススコープ付きのコメントスレッドを示します。
パターン概要
limitとoffsetクエリパラメーターによるページネーション。スキーマ
2
3
4
5
6
7
8
ページネーションパターン
2
3
4
5
6
レスポンスには
total(リソースの全コメント数)、limit、offsetが含まれ、クライアントがページネーションコントロールを構築できます:2
3
4
5
6
limit のクランプ
無効または範囲外の limit/offset 値は静かに安全なデフォルト値にクランプされます:
2
3
4
5
6
7
8
クエリ文字列での ReDoS を避けるため
ctype_digit()を使用しています。IDOR: 著者のみの削除
非管理者ユーザーは自分のコメントしか削除できません。他人のコメントを削除しようとすると(403 ではなく)404 が返ります:
2
3
リソース分離
すべてのクエリに
WHERE resource_id = :ridを含め、リソース 1 のコメントがリソース 2 と混在しないようにします。バリデーションルール
X-User-Idctype_digit、>0body{resourceId}パスctype_digit、最大 18 文字、>0。それ以外は 404limitクエリoffsetクエリルート
2
3
関連
../NENE2-FT/commentlog/docs/howto/note-taking.md(FT202、ノート CRUD)docs/howto/leaderboard-ranking.md(FT206、リソーススコープデータ)