0

私は何かを解決するのに問題があります。オンラインでスレッド化されたコメントの例を使用し、手動で入力されたデータに対してテストし、完全に機能しました。

ここに画像の説明を入力してください

しかし、この設定はちょっと奇妙です。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>';
}
4

1 に答える 1

1

2 つのアンダースコアを使用して、正確に 2 桁を検索できます__。アンダースコアは、正確に 1 つの不明な文字に一致するワイルドカードです。_また、はワイルドカード文字であるため、リテラルのアンダースコアをエスケープする必要があります。

SELECT * FROM comments WHERE path LIKE '01\_01\___' ESCAPE '\'
于 2012-10-20T17:26:48.933 に答える