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);
操作指南:评论线程 API
本指南演示资源范围内的评论线程,包含分页、仅作者可删除以及管理员覆盖权限。
模式概述
limit和offset查询参数实现分页。数据库结构
2
3
4
5
6
7
8
分页模式
2
3
4
5
6
响应包含
total(该资源的所有评论数)、limit和offset,方便客户端构建分页控件:2
3
4
5
6
限制值裁剪
无效或超出范围的 limit/offset 值会被静默裁剪为安全默认值:
2
3
4
5
6
7
8
使用
ctype_digit()是为了避免查询字符串上的 ReDoS 攻击。IDOR:仅作者可删除
非管理员用户只能删除自己的评论。尝试删除其他用户的评论返回 404(而非 403):
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,资源范围数据)