2010-07-21 6 views
1

내 검색 결과에 페이지 매김을 사용하고 있지만 내 검색 스크립트에서 어떤 이유로 내 페이지 매김이 제대로 작동하지 않습니다. 나는 내 검색 쿼리 코드에 LIMIT $start, $display을 넣을 정확한 위치를 찾지 못하는 것 같습니다. 어디서나 페이지 매김을 잘못 표시합니다. 어떤 사람이 나를 도울 수 있습니까?MySQL LIMIT 질문

여기 내 PHP & MySQL 검색 코드의 일부입니다.

$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
mysqli_select_db($mysqli, "sitename"); 

    $search_explode = explode(" ", $search); 

    foreach($search_explode as $search_each) { 
     $x++; 
     if($x == 1){ 
      $construct .= "article_content LIKE '%$search_each%' OR title LIKE '%$search_each%' OR summary LIKE '%$search_each%'"; 
     } else { 
      $construct .= "OR article_content LIKE '%$search_each%' OR title LIKE '%$search_each%' OR summary LIKE '%$search_each%'"; 
     } 

    } 

$construct = "SELECT users.*, users_articles.* FROM users_articles 
       INNER JOIN users ON users_articles.user_id = users.user_id 
       WHERE $construct"; 
$run = mysqli_query($mysqli, $construct); 

$foundnum = mysqli_num_rows($run); 

SQL 문.

SELECT users.*, users_articles.* FROM users_articles INNER JOIN users ON users_articles.user_id = users.user_id WHERE article_content LIKE '%find%' OR title LIKE '%find%' OR summary LIKE '%find%'OR article_content LIKE '%this%' OR title LIKE '%this%' OR summary LIKE '%this%'OR article_content LIKE '%article%' OR title LIKE '%article%' OR summary LIKE '%article%' LIMIT 0, 10 
+2

'$ search_each = mysqli_real_escape_string ($ mysqli, $ search_each);를 추가하는 것이 좋습니다. 또는 준비된 문장을 사용하십시오 –

답변

2

SELECT의 기본 구문은 다음과 같습니다 그래서

SELECT [fields] 
FROM [tables [JOIN tables]] 
WHERE [conditions] 
GROUP BY [fields] 
HAVING [conditions] 
ORDER BY [fields] 
LIMIT [limit] 

, 오른쪽 WHERE 조건 후 마지막에.

다음은 full syntax을 보여주는 설명서입니다.

+0

하지만 정확히 어디에서 코드를 사용합니까? 나는 모든 것을 시도했지만 아무런 성공도하지 못했다. ( – lone

+3

나는 당신이 정말로 시도한 것을 믿지 않는다. 그는 어디서나 간단히 설명 할 수있는 것처럼 말했다. "WHERE $ conditions LIMIT ..." – enricog

+0

나는 예를 들어 40 개의 레코드가 있으면 나머지는 표시하지 않습니다. – lone

0

이 처음 10 개 행을 표시해야합니다 : 또한 당신은 아마 당신의 $construct 탈출해야 있습니다

LIMIT  10, 10 

:에 LIMIT 절을 변경

SELECT  users.*, users_articles.* FROM users_articles 
INNER JOIN users ON users_articles.user_id = users.user_id 
WHERE  article_content LIKE '%something%' 
LIMIT  0, 10 

을 11 ~ 20 행을 표시해야 다음 위의 설명에 제안 된 @Col. Shrapnel 문자열. 이것은 SQL injection을 피하기위한 것입니다.

또한 Full Text Indexing을 사용하여 조사 할 수 있습니다.

+1

나는 LIMIT 절 매개 변수를 주입에서 보호하기 위해 int로 명시 적으로 캐스팅/평가해야한다고 덧붙였다. –

1

쿼리를 작성할 때 문자열 조각에 공백을 넣는 것을 기억하십니까? PHP는 사용자가 직접 입력하지 않은 문자열에 아무 것도 넣지 않습니다.

$x = 'a'; 
$x .= 'b'; 

당신에게 ab하지 a[space]b을 제공합니다. 두 번째 이상의 검색어가 입력되면 $construct은 구문 오류로 가득 차게됩니다. 그 이유는 후속 OR이 이전에 추가 된 검색어의 끝에 추가되기 때문입니다. 당신은 같은 것을하게 될 겁니다 : 당신이 당신의 쿼리의 끝과 사이에 공간이 확실하지 않고 제한 조항 추가하면 같은이 적용

[...snip...] OR summary LIKE '%$search_each%OR article_content LIKE[...snip...] 
              ^^--syntax error here. 

"LIMIT의 X를 Y"텍스트 당신은 추가합니다.

0
$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
mysqli_select_db($mysqli, "sitename"); 

    $search_explode = explode(" ", $search); 

    foreach($search_explode as $search_each) { 
     $x++; 
     if($x == 1){ 
      $construct .= " article_content LIKE '%$search_each%' OR title LIKE '%$search_each%' OR summary LIKE '%$search_each%'"; 
     } else { 
      $construct .= " OR article_content LIKE '%$search_each%' OR title LIKE '%$search_each%' OR summary LIKE '%$search_each%'"; 
     } 

    } 

$construct = "SELECT users.*, users_articles.* FROM users_articles 
       INNER JOIN users ON users_articles.user_id = users.user_id 
       WHERE $construct"; 
$construct .= " LIMIT 0, 10" ; // replace 0, 10 with your variables 

$run = mysqli_query($mysqli, $construct); 

$foundnum = mysqli_num_rows($run);