Php 如何在url中发送搜索词以对结果进行分页
我有一个简单的表单来搜索表格中输入的搜索词Php 如何在url中发送搜索词以对结果进行分页,php,mysql,pagination,Php,Mysql,Pagination,我有一个简单的表单来搜索表格中输入的搜索词 $query = $_GET['term']; $min_length = 1; if(strlen($query) >= $min_length){ $query = htmlspecialchars($query); $query = mysqli_real_escape_string($link, $query); } 这里的变量“query”是从表单发布的搜索查询 对数据库的查询如下所示 $sql = mysqli_quer
$query = $_GET['term'];
$min_length = 1;
if(strlen($query) >= $min_length){
$query = htmlspecialchars($query);
$query = mysqli_real_escape_string($link, $query);
}
这里的变量“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¤tpage=$x'>$x</a> ";
因此,在我看来,当我转到任何其他页面,但第一次从我的搜索表单提交的第一页显然没有被再次发布,因此没有得到任何结果
当我把那个“如果”去掉的时候,分页就起作用了。但是不使用它可以吗?您需要转发术语参数和当前页面索引。您还必须添加
offset $x*$pagesize
limit $pagesize
对于您的问题…以下是一些想法:
在进入分页方面之前,仅通过查看您的查询,我建议您使用MySQL自然语言全文搜索。这将使您的查询类似于:
SELECT * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
// you should provide some validation for these parameters, but I am not showing that
$query = $_GET['term'];
$page = $_GET['page'];
SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
LIMIT :offset, :pagerows
这需要在搜索中使用的字段之间建立全文索引。这需要对表使用MyISAM引擎
关于在where子句中使用全文搜索,需要注意的一件有趣的事情是,它将按照相关性的顺序返回行。因此,例如,对于搜索项,在DB列中有许多匹配项的记录将比只有一个匹配项的记录具有更高的相关性。在大多数像您这样的搜索用例中,这是您想要的行为,而您当前的查询根本不提供这种功能
现在开始分页
您可能需要传递一些额外的参数来指示页面。假设您的参数如下所示:
SELECT * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
// you should provide some validation for these parameters, but I am not showing that
$query = $_GET['term'];
$page = $_GET['page'];
SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
LIMIT :offset, :pagerows
您还可以在代码中的某个地方设置一些值,以确定每页要显示的行数。如果您想让用户选择每页的行数,这甚至可以是参数的形式
$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子句,查询将返回多少行。有几种方法可以做到这一点。您只需首先不受限制地运行同一查询,并从该查询中获取行数。这可能适用于您不接受用户输入以过滤结果集,并且用户可以在任意页码上进入分页视图的情况
这似乎不是与搜索相关的用例,因此我将为您提供另一个可能最适合搜索查询用例的选项。这是SQL\u CALC\u FOUND\u ROWS关键字与FOUND\u ROWS函数的结合使用。下面是它的工作原理
只需将SQL\u CALC\u FOUND\u行添加到SELECT查询中,如下所示:
SELECT * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
// you should provide some validation for these parameters, but I am not showing that
$query = $_GET['term'];
$page = $_GET['page'];
SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
LIMIT :offset, :pagerows
您的查询将按预期返回分页结果,但使用相同的DB连接,您可以在应用上一次查询的限制之前进行后续查询,以获取找到的行数,即结果集中的行数。这个问题非常简单:
SELECT FOUND_ROWS()
因此,从编码的角度来看,这可能是这样的:
$sql = <<<EOT
SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
LIMIT :offset, :pagerows
EOT;
// perform query here
// work with your result set
while ($row = /* your row fetch logic here */) {
// do something with row
}
// now query DB again to get found rows
// you must use same DB connection used for initial query
// and you must not perform any queries between your initial
// SELECT and this query to get row count
$row_sql = 'SELECT FOUND_ROWS()';
// execute your query and read the value from the result
// lets assume you set this to a variable named $total_rows
// now simply determine number of available page by simple math and rounding
$page_count = ceil($total_rows / $rows_per_page);
请尝试以下方式:
SELECT * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
// you should provide some validation for these parameters, but I am not showing that
$query = $_GET['term'];
$page = $_GET['page'];
SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE
MATCH (name, brand, description, spec, category, subcategory)
AGAINST :query
AND STATUS = 1
LIMIT :offset, :pagerows
pagination.php
我希望它能起作用。通过URL而不是帖子标题发送查询。换句话说,在表单方法中,将其设置为get,并将$_POST['term']更改为$_get['term']。我同意Jeremy的观点,将您的url设置为:mysite.com/mypage/classified/3,因此您只需更改页码3//而无需url重写mysite.com/mypage.foo&term=classified¤tpage=3我编辑了这个问题!!问题再次编辑!您是否需要在应用程序中的任意位置提供页面总数的指标?我已编辑了查询,以包括偏移量和限制。我的代码有这个,但我粘贴到这里时似乎已经删除了它们。我还做了其他编辑。。。。。。。。。。