2012-10-20 125 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