php - 使用 LIKE 进行 PDO 分页
问题描述
以下 PHP SQL 代码显示错误 Recoverable fatal error: Object of class PDOStatement could not be convert to string in /home/customer/xxxx/fetch_data.php on line 28 我试图从表中显示产品信息filter
有两个 $statement->execute();
,一个是统计总搜索结果,另一个是显示当前页面的产品。我是 PDO 方法的新手,而不是整体编码方面的专家。
$filter_query = $stmt . 'LIMIT '.$start.', '.$limit.'';
导致问题。 使用该功能和相关功能,代码可以工作并显示数据。但是如果我启用它,就会出现错误。
$limit = '5';
$page = 1;
if($_POST['page'] > 1)
{
$start = (($_POST['page'] - 1) * $limit);
$page = $_POST['page'];
}
else
{
$start = 0;
}
$search = "%samsung%";
$stmt = $connect->prepare("SELECT * FROM filter WHERE product_name LIKE :needle");
$stmt->bindParam(':needle', $search, PDO::PARAM_STR);
##
##
$filter_query = $stmt . 'LIMIT '.$start.', '.$limit.'';
$statement->execute();
$total_data = $stmt->rowCount();
$stmt = $connect->prepare($filter_query);
$stmt->execute();
$result = $stmt->fetchAll();
$total_filter_data = $stmt->rowCount();
$output = '
<h3> '.$total_data.' results found </h3>
and display each product
我按照建议尝试了以下代码,Your Common Sense
并且分页和总搜索结果计数工作正常,但没有显示任何产品。
$limit = '5';
$page = 1;
if($_POST['page'] > 1)
{
$start = (($_POST['page'] - 1) * $limit);
$page = $_POST['page'];
}
else
{
$start = 0;
}
$name=str_replace(' ', '%', $_POST['query']);
$search = "%$name%";
$base_sql = "SELECT %s FROM filter WHERE product_name LIKE ?";
##
##
####
$count_sql = sprintf($base_sql, "count(*)");
$stmt = $connect->prepare($count_sql);
$stmt->execute([$search]);
$total_data = $stmt->fetchColumn();
####
$data_sql = $count_sql = sprintf($base_sql, "*")." LIMIT ?,?";
$stmt = $connect->prepare($data_sql);
$stmt->execute([$search, $start, $limit]);
$result = $stmt->fetchAll();
##
$output = '
<h3> '.$total_data.' results found </h3> ';
if($total_data > 0)
{
foreach($result as $row)
{
and display each product
使用以下行使代码显示一些数据,但分页不起作用。
$data_sql = sprintf($base_sql, "*");
$stmt = $connect->prepare($data_sql);
$stmt->execute([$search]);
$result = $stmt->fetchAll();
解决方案
这不是一项简单的任务,因为我们需要两次运行相同的查询,但差异很小。第一个查询将使用count(*)
SQL 函数来获取匹配搜索条件的记录总数。第二个查询将选择带有 LIMIT 子句的实际字段来获取单页的数据。
$base_sql = "SELECT %s FROM filter WHERE product_name LIKE ?";
$count_sql = sprintf($base_sql, "count(*)");
$stmt = $connect->prepare($count_sql);
$stmt->execute([$search]);
$total = $stmt->fetchColumn();
$data_sql = $count_sql = sprintf($base_sql, "*")." LIMIT ?,?";
$stmt = $connect->prepare($data_sql);
$stmt->execute([$search, $start, $limit]);
$data = $stmt->fetchAll();
重要提示:为了使此代码正常工作,请确保您正确连接到 mysql。正确的连接将使 LIMIT 子句接受占位符,并且还会在出现任何问题时警告您。
推荐阅读
- javascript - Node.js exported function assign to variable
- azure - AMQ6004:Azure 文件共享服务上的多实例队列管理器
- python - Python模块未完全安装
- python - 将嵌套的序列化数据作为一个获取
- java - Travis-ci unable to find the chromedriver
- c - While loop continue running after using return to break in C
- html - 本地 http-server 未连接到 firebase 用户
- datatables-1.10 - 我们不能将逗号分隔的列号传递给 yadcf 初始化函数来设置过滤器吗
- java - 圆盘序列中的交叉点数
- google-cloud-platform - Google Cloud Translation Api 仅返回目标语言的翻译