2012-10-20 126 views
0

我有麻烦工作的东西了。我刚刚在线使用了一个线程注释示例,对照手动输入的数据进行了测试,并且完美地工作。Threaded /嵌套/ Hierachial评论

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>'; 
} 
+0

我认为放弃路径创意并寻求简单的'id','parentid'解决方案可能会更好。 – PeeHaa

+1

@PeeHaa:我给了这个解决方案两个小时的耐心,然后我可以切换到'id> parent_id'方法:) – ShadowStorm

+1

在parentID旁边,您可能想了解一些关于所谓的嵌套集的知识。每种方法都有优点和缺点,所以通常了解更多替代方法的不同方法是很好的。 – hakre

回答

1

您可以使用两个下划线搜索精确的两位数__。下划线是完全匹配一个未知字符的通配符。你应该逃避字面下划线,因为_是通配符。

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

我很高兴你添加了最新的更新,解释了两个下划线的含义。我只是写信问:)我会对此有一个解决办法,让你知道。谢谢。 – ShadowStorm

+0

ESCAPE是一个MySQL函数吗? – ShadowStorm

+0

得到这个稍作调整的工作。首先,ESCAPE不是一个MySQL函数(我没有指定它的错误)。我也无法转义非通配符下划线,所以我使用LIKE“01_01 ___”,现在看起来工作正常。 – ShadowStorm