2010-07-21 63 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);