私は何かを解決するのに問題があります。オンラインでスレッド化されたコメントの例を使用し、手動で入力されたデータに対してテストし、完全に機能しました。
しかし、この設定はちょっと奇妙です。PATHメソッドを使用するため、最初のコメントのパスは01、そのコメントへの応答のパスは01_01、最初のコメントへの別の応答のパスは01_02になります。各名前の横にある私のスクリーンショット(上記)で相対パスを確認できます。
この方法は、私が多くのコメントに対してテストしたので、非常にうまく機能します。私が抱えている問題は、次の応答パスを計算することです。たとえば、私のユーザーが01_01_01のパスを持つJeremyClarksonのコメントをクリックしたとします。これに対する次のシーケンスは01_01_02ですが、これはすでにKimBauerのコメントで使用されています。少しクエリを実行して最後の行を選択し、それに1を追加できると思いましたSELECT * FROM comments WHERE path LIKE '01_01_%'
が、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>';
}