线程/嵌套/分层注释

时间:2012-10-20 17:23:20

标签: php sql

我遇到了麻烦。我刚刚在线使用了一个线程评论示例,针对手动输入的数据进行了测试,并且工作得很好。

enter image description here

但这种设置有点奇怪。它使用PATH方法,因此第一个注释的路径为01,对该注释的回复的路径为01_01,对第一个注释的另一个回复的路径为01_02。您可以在我的屏幕截图(上图)中看到每个名称旁边的相对路径。

这个方法表现得非常好,因为我已经针对很多很多评论进行了测试。我遇到的问题是计算下一个回复路径。例如,假设我的用户点击了Jeremy Clarkson评论的[回复],该评论的路径为01_01_01。下一个序列将是01_01_02,但Kim Bauer的评论已经使用过它。我以为我可以做一个小查询SELECT * FROM comments WHERE path LIKE '01_01_%'并选择最后一行并添加1,但Chloe O'Brien的评论有01_01_01_01,这会影响这个结果。

有人可以解释一下如何计算下一条回复的正确路径吗?

我的修复:

我通过这样做来计算下一个可用路径:

SELECT path
FROM blog_comments
WHERE path LIKE '01_01___'
ORDER BY path DESC
LIMIT 1

$last_path = $row[0];
$last_path_suffix = substr($last_path,strrpos($last_path,'_')+1);
$next_path_suffix = str_pad($last_path_suffix+1,2,'0',STR_PAD_LEFT);
$next_path = substr($last_path,0,strlen($last_path)-strlen($last_path_suffix)).$next_path_suffix;

如果有人想使用这种方法,打印就是这样的:

$SQL = "SELECT * FROM comments ORDER BY path ASC;";

while($row = $STH->fetch()) {
    $nesting_depth = strlen($row['path']) - strlen(str_replace('_','',$row['path']));
    $left_margin = $nesting_depth * 40; // 40 pixels nesting indent

    echo '<div class="comment_item" style="margin-left:'.$left_margin.'px;">';
        echo '<strong>'.htmlspecialchars($row['author_name']).'<br>';
        echo htmlspecialchars($row['comment']).'<br>';
    echo '</div>';
}

1 个答案:

答案 0 :(得分:1)

您可以使用两个下划线__来搜索正好两位数。 Underscore是一个通配符,只匹配一个未知字符。你应该逃避文字下划线,因为_是一个通配符。

SELECT * FROM comments WHERE path LIKE '01\_01\___' ESCAPE '\'