【发布时间】:2020-08-18 08:05:17
【问题描述】:
以下 PHP SQL 代码显示错误
可恢复的致命错误:无法将 PDOStatement 类的对象转换为第 28 行 /home/customer/xxxx/fetch_data.php 中的字符串
我试图从表中显示产品信息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();
【问题讨论】:
-
不要连接语句对象上的限制偏移量,在查询语句中(就在like子句之后)这样做,在这种情况下它应该有自己的占位符
-
@Kevin,如果你有时间,请举个例子。我试过 $stmt = $connect->prepare("SELECT * FROM filter WHERE product_name LIKE :needle LIMIT '.$start.', '.$limit.'");它显示零产品
-
你检查过执行查询是否会在数据库中抛出错误吗?
-
@Nico Haase,不,实际上在我尝试添加“准备好的语句”功能之前,这段代码运行良好。它也正确计算页面数。
-
@NicoHaase 仅供参考,PDO 可以抛出异常,因此无需使用 $stmt->errorInfo();