2010-07-21 62 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);'會很好。或者使用準備好的語句 – 2010-07-21 06:31:56

回答

2

SELECT的基本語法是:

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

所以,就在那裏的條件後結束。

以下是顯示full syntax的文檔。

+0

但是我的代碼究竟在哪裏?我嘗試了一切,但沒有成功:( – lone 2010-07-21 06:31:25

+3

我不相信你真的嘗試過它,他說在WHERE條件之後,這就像它可以解釋的那樣簡單。 「WHERE $ conditions LIMIT ...」 – enricog 2010-07-21 06:34:50

+0

I它是否顯示我的分頁全部是錯誤的,例如,如果我有40條記錄,它只會顯示一條而不是其他條目。 – lone 2010-07-21 06:37:06

0

這應該顯示第10行:

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 

LIMIT條款更改爲以下應顯示的行11〜20:

LIMIT  10, 10 

另外請注意,你應該逃脫你$construct字符串爲@Col. Shrapnel在上面的評論中建議。這是爲了避免SQL injection

此外,您可能需要使用Full Text Indexing來代替。

+1

我想補充說LIMIT子句參數應該明確地被轉換/計算爲int,以防止注入 – 2010-07-21 06:38:52

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);