Phân trang PDO với LIKE
Mã PHP SQL sau hiển thị lỗi Lỗi nghiêm trọng có thể khôi phục: Không thể chuyển đổi đối tượng của lớp PDOStatement thành chuỗi trong /home/customer/xxxx/fetch_data.php trên dòng 28 Tôi đang cố hiển thị thông tin sản phẩm từ bảng filterCó hai $statement->execute();, một là đếm tổng số kết quả tìm kiếm và một kết quả khác là hiển thị các sản phẩm cho trang hiện tại. Tôi mới sử dụng phương pháp PDO và không phải là chuyên gia về mã hóa tổng thể.
Các vấn đề đang gây ra. Với điều đó và các chức năng liên quan, mã hoạt động và hiển thị dữ liệu. Nhưng nếu tôi bật nó, lỗi sẽ xuất hiện.$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
Tôi đã thử mã sau theo đề xuất của đề xuất Your Common Sensevà phân trang và tổng số kết quả tìm kiếm đang hoạt động tốt, nhưng không có sản phẩm nào được hiển thị.
$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
Sử dụng dòng sau làm cho mã hiển thị một số dữ liệu, nhưng phân trang không hoạt động.
$data_sql = sprintf($base_sql, "*");
$stmt = $connect->prepare($data_sql); $stmt->execute([$search]); $result = $stmt->fetchAll();
Trả lời
Đó không phải là một nhiệm vụ tầm thường vì chúng ta cần chạy cùng một truy vấn hai lần nhưng có sự khác biệt nhỏ. Truy vấn đầu tiên sẽ sử dụng count(*)hàm SQL để lấy tổng số bản ghi phù hợp với tiêu chí tìm kiếm. Truy vấn thứ hai sẽ chọn các trường thực tế với mệnh đề LIMIT để lấy dữ liệu cho trang đơn.
$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();
Quan trọng: Để mã này hoạt động, hãy đảm bảo rằng bạn đang kết nối với mysql đúng cách . kết nối thích hợp sẽ cho phép điều khoản LIMIT để chấp nhận trình giữ chỗ và cũng sẽ cảnh báo bạn trong trường hợp có bất kỳ sự cố nào.