2010-05-10 6 views
1

SQL 선택으로 bbcode를 코딩하고 싶습니다. 기본적으로 사용자가 텍스트 필드에 [user]Anotheruser[/user]을 입력 할 수있게하려면 프런트 엔드에서 다음과 같은 URL로 변환해야합니다. http://mydomain.com/user/[userid]/anotheruser. 따라서 userid를 얻으려면 SQL 선택 항목을 포함시켜야하고, 다른 사용자가 실제로 존재하는지 확인하는 추가 방법이 필요합니다. bbcode 작성에 일반적으로 사용되는 preg_replace으로이 작업을 수행 할 수 있습니까? 아니면 더 복잡한 작업이 필요합니까?PHP : SQL 선택이있는 BBCode?

답변

0

pre_replace가 작동해야합니다.주의하시기 바랍니다. 특정 구멍을 패치해야합니다 ... 특히 SQL 주입을 조심하십시오.

0

다른 곳에서해야하는 것처럼 POST 쪽 주사를 피해야합니다.

이 상황은 전혀 다릅니다.

0

preg_match 먼저 태그, 쿼리를 실행, 사용자 이름을 가져올 수 (주의 그 단계는 안전하게!) 새로운 URL로 전체 일치하는 문자열 대체 :

preg_match_all ('#\[user\](.*?)\[/user\]#i', $text, $matches, PREG_SET_ORDER); 

for ($i = 0, $j = count($matches); $i < $j; $i++) 
{ 
    $userName = $matches[$i][1]; 
    $userId = 0; 

    // query example with mysqli 
    $stmt = $sql->prepare('SELECT uid FROM users WHERE username = ? LIMIT 1'); 
    $stmt->bind_param('s', $userName); 
    $stmt->execute(); 
    $stmt->bind_result($userId); 

    if ($stmt->fetch()) 
    { 
     $text = str_replace($matches[$i][0], "<a href=\"/user/$userId/$userName\" title=\"$userName\">$userName</a>", $text); 
    } 
} 
+0

좋은 솔루션을. 리소스를 절약하기 위해 각 일치 항목을 삭제 한 다음'$ matches'를'implode()'하고 WHERE username IN (..imploded matches ..)를 쿼리 할 수 ​​있습니다. 그렇게하면 * 하나의 쿼리 만 실행하면됩니다. – Alec

+0

그래, 방금 SQL 쿼리에 가능한 코드 하나를 보여주고 싶었다. 준비된 명령문을 사용할 때 명령문을 한 번 (루프 이전에) 준비하고 매개 변수를 갱신하고 실행하는 것이 더 나을 것입니다. 준비된 문장은 실제로 꽤 빠르며,'IN'을 사용하는 것보다 훨씬 빠르다고 믿습니다. (아마도 여러분이 스스로 벗어날 필요가 없으므로 아마도 조금 더 안전 할 것입니다.) – poke