如何在分页结果的网址中发送搜索字词

时间:2014-07-02 14:52:18

标签: php mysql pagination

我有一个简单的表格来搜索表格中输入该表格的搜索词。

$query = $_GET['term'];
$min_length = 1;
if(strlen($query) >= $min_length){
   $query = htmlspecialchars($query);
   $query = mysqli_real_escape_string($link, $query);
}

此处变量'查询'是从表单发布的搜索查询。

数据库的查询如下所示

$sql = mysqli_query($link, "SELECT * FROM products WHERE `name` LIKE '%".$query."%' OR   
`brand` LIKE '%".$query."%'
OR `description` LIKE '%".$query."%' OR `spec` LIKE '%".$query."%'
OR `category` LIKE '%".$query."%' OR `subcategory` LIKE '%".$query."%' AND status = 1 
ORDER BY id DESC LIMIT $offset, $rowsperpage")  OR die(mysqli_error($link));

如果我不对结果进行分页,这样就行了,但我需要对它们进行分页。

我想我需要让这行代码发送变量' $ query'到每个分页页面。

echo " <a href='{$_SERVER['PHP_SELF']}?$query&currentpage=$x'>$x</a> ";

&#39; $ X&#39;只是当前页面的变量

我的表单现在设置为method =&#34; get&#34;

编辑:排序(我认为)

我把所有东西包裹在

if(isset( $_GET['submit'] ) ){
}

所以在我看来,当我去任何其他页面但是从我的搜索表单提交的第一页(第一次)显然没有再次发布时,所以没有结果。< / p>

当我接受这个&#39;如果&#39;分页作品。但没有它可以吗?

3 个答案:

答案 0 :(得分:0)

您需要转发术语参数和当前页面索引。你还必须添加

offset $x*$pagesize
limit $pagesize

查询...

答案 1 :(得分:0)

这里有一些想法:

在进入分页方面之前,只需查看您的查询,我建议您查看使用MySQL自然语言全文搜索(http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html)。这会使你的查询像这样:

SELECT * FROM products
WHERE
  MATCH (name, brand, description, spec, category, subcategory)
    AGAINST :query
  AND STATUS = 1

这需要在搜索中使用的字段中使用FULLTEXT索引。这需要在桌面上使用MyISAM引擎。

有关在where子句中使用全文搜索的一个有趣的事情是,它将按“相关性”的顺序返回行。因此,例如,对于您的搜索词,在数据库列中具有多个匹配项的记录将具有比具有单个匹配的记录更高的相关性。在大多数搜索使用案例中,这是理想的行为,而您当前的查询根本不做任何事情来提供此类功能。

现在开始分页。

您可能需要传递一些额外的参数来指示页面。所以说你的参数是这样的:

// you should provide some validation for these parameters, but I am not showing that
$query = $_GET['term'];
$page = $_GET['page'];

您还可以在代码中的某个位置设置一些值来确定要显示的每页行数。如果您想让用户选择每页的行数,这甚至可以采用参数的形式。

$rows_per_page = $_GET['pagerows'];
// or simply something like $rows_per_page = 10;

计算要在LIMIT子句中使用的值是微不足道的。我假设$page是基于1的(即第一页的值为1)

$offset = ($page - 1) * $rows_per_page;

将它与上面的查询结合在一起得到:

SELECT * FROM products
WHERE
  MATCH (name, brand, description, spec, category, subcategory)
    AGAINST :query
  AND STATUS = 1
LIMIT :offset, :pagerows

注意我只是在查询中使用命名参数语法。您应该考虑为这些查询使用预准备语句。

这就是简单的用例。现在,如果您想向用户显示与搜索结果相关的页数的一些指示,该怎么办?这意味着如果没有LIMIT子句,您需要了解查询将返回多少行。有几种方法可以做到这一点。您可以先运行不带LIMIT的相同查询,然后从该查询中获取行数。这可能适用于您不接受用户输入来过滤结果集的情况,并且用户可以在任意页码上的分页视图中到达。

这似乎不是用于搜索的用例,因此我将为您提供另一个可能最适合搜索查询用例的选项。这是将SQL_CALC_FOUND_ROWS关键字与FOUND_ROWS()函数结合使用。这是它的工作原理。

您只需将SQL_CALC_FOUND_ROWS添加到SELECT查询中,如下所示:

SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE
  MATCH (name, brand, description, spec, category, subcategory)
    AGAINST :query
  AND STATUS = 1
LIMIT :offset, :pagerows

您的查询将按预期返回分页结果,但使用相同的数据库连接,您可以进行后续查询以获取“找到的行”的数量(即应用{{1}之前结果集中的行从上一个查询)。该查询非常简单:

LIMIT

所以从编码的角度来看,这是如何看待的:

SELECT FOUND_ROWS()

答案 2 :(得分:0)

请尝试这样的事情:

<强> pagination.php

<?php
function getPagingQuery($sql, $itemPerPage = 10)
{
    if (isset($_GET['page']) && (int)$_GET['page'] > 0) {
        $page = (int)$_GET['page'];
    } else {
        $page = 1;
    }

    // start fetching from this row number
    $offset = ($page - 1) * $itemPerPage;

    return $sql . " LIMIT $offset, $itemPerPage";

}
function getPagingLink($sql, $itemPerPage = 10,$strGet)
{
    $result        = mysql_query($sql) or die(mysql_error());
    $pagingLink    = '';
    $totalResults  = mysql_numrows($result);


    $totalPages    = ceil($totalResults / $itemPerPage);


    // how many link pages to show
    $numLinks      = 10;


    // create the paging links only if we have more than one page of results
    if ($totalPages > 1) {

        $self = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ;

        if (isset($_GET['page']) && (int)$_GET['page'] > 0) {
            $pageNumber = (int)$_GET['page'];
        } else {
            $pageNumber = 1;
        }

        // print 'previous' link only if we're not
        // on page one
        if ($pageNumber > 1) {
            $page = $pageNumber - 1;
            if ($page > 1) {
                $prev = " <a href=\"$self?page=$page&$strGet\" class=\"paging\">[Prev]</a> ";
            } else {
                $prev = " <a href=\"$self?$strGet\" class=\"paging\">[Prev]</a> ";
            }   

            $first = " <a href=\"$self?$strGet\" class=\"paging\">[First]</a> ";
        } else {
            $prev  = ''; // we're on page one, don't show 'previous' link
            $first = ''; // nor 'first page' link
        }

        // print 'next' link only if we're not
        // on the last page
        if ($pageNumber < $totalPages) {
            $page = $pageNumber + 1;
            $next = " <a href=\"$self?page=$page&$strGet\" class=\"paging\">[Next]</a> ";
            $last = " <a href=\"$self?page=$totalPages&$strGet\" class=\"paging\">[Last]</a> ";
        } else {
            $next = ''; // we're on the last page, don't show 'next' link
            $last = ''; // nor 'last page' link
        }

        $start = $pageNumber - ($pageNumber % $numLinks) + 1;
        $end   = $start + $numLinks - 1;        

        $end   = min($totalPages, $end);

        $pagingLink = array();
        for($page = $start; $page <= $end; $page++) {
            if ($page == $pageNumber) {

                $pagingLink[] = " $page ";   // no need to create a link to current page
            } else {
                if ($page == 1) {

                    $pagingLink[] = " <a href=\"$self?$strGet\" class=\"paging\">$page</a> ";
                } else {    

                    $pagingLink[] = " <a href=\"$self?page=$page&$strGet\" class=\"paging\">$page</a> ";
                }   
            }

        }

        $pagingLink = implode(' | ', $pagingLink);

        // return the page navigation link
        $pagingLink = $first . $prev . $pagingLink . $next . $last;

    }

    return $pagingLink;
}
?>

<强> product_search.php

$query = $_GET['term'];
$select = "SELECT * FROM products WHERE `name` LIKE '%".$query."%' ";

$strget="term=".$query;
$rowsPerPage =10;
$result= mysql_query(getPagingQuery($sel_products, $rowsPerPage, $strget)) or die(mysql_error());
$pagingLink = getPagingLink($sel_products, $rowsPerPage, $strget); 
$num_rows = mysql_numrows($result);

if($num_rows > 0) {
        while($array_in= mysql_fetch_array($result)) 
        { 
        $product_id = $array_in['id'];
        $product_name = $array_in['name'];
        }

echo $pagingLink;

}
else
{
echo "No Results To Display";
}

我希望它能起作用。