问题描述
以下PHP sql代码显示错误
可恢复的致命错误:在第28行的/home/customer/xxxx/fetch_data.PHP中,类PDOStatement的对象无法转换为字符串
我试图显示表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();
重要:为了使此代码正常工作,请确保您connecting to mysql properly。正确的连接将使LIMIT子句接受占位符,并在出现任何问题时向您发出警告。