2012-10-20 4 views
0

뭔가 작업하는 데 문제가 있습니다. 난 그냥 온라인으로 스레드 주석 예제를 사용하여 수동으로 입력 된 데이터에 대해 그것을 테스트하고 완벽하게 작동합니다.스레딩/중첩/간접적 인 설명

enter image description here

는 그러나이 설정은 좀 이상하다. PATH 메소드를 사용하므로 첫 번째 주석의 경로는 01이고, 해당 주석에 대한 응답은 01_01 경로이고 첫 번째 주석에 대한 다른 응답은 01_02입니다. 내 스크린 샷 (위)에서 각 이름 옆의 상대 경로를 볼 수 있습니다.

이 방법은 많은 의견에 대해 테스트 해본 결과 매우 잘 수행됩니다. 문제는 다음 회신 경로를 계산하는 것입니다. 예를 들어 내 사용자가 01_01_01의 경로가있는 Jeremy Clarkson의 댓글에서 [답장]을 클릭했다고 가정 해 보겠습니다. 다음 순서는 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 :이 솔루션을 2 시간 더 기다려주세요. 그러면 id> parent_id 메소드로 전환 할 수 있습니다 :) – ShadowStorm

+1

parentID 다음으로, 중첩 된 세트에 대해 조금 배우고 싶을 것입니다. 각각의 방법에는 장단점이 있으므로 더 많은 대안을위한 다양한 접근법을 아는 것이 좋습니다. – hakre

답변

1

두 개의 밑줄을 사용하여 정확히 두 자리를 검색 할 수 있습니다. __. Underscore는 정확히 하나의 알 수없는 문자와 일치하는 와일드 카드입니다. _은 와일드 카드 문자이므로 문자 그대로 밑줄을 벗어나야합니다.

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

마지막 업데이트에서 밑줄이 무엇을 의미하는지 설명해 주셔서 감사합니다. 나는 단지 물어볼 것을 쓰고 있었다 :) 나는 이것에서 갈라진 금을 가지고 있고, 당신에게 알릴 것이다. 감사. – ShadowStorm

+0

ESCAPE가 MySQL 기능입니까? – ShadowStorm

+0

약간의 조정만으로 작동합니다. 첫째, ESCAPE는 MySQL 함수가 아닙니다. 또한 와일드 카드가 아닌 밑줄을 이스케이프하는 데 어려움을 겪었으므로 이제는 잘 작동하는 것처럼 보이는 LIKE '01_01 ___'을 사용했습니다. – ShadowStorm