การแบ่งหน้า PDO ด้วย LIKE

Aug 18 2020

โค้ด PHP SQL ต่อไปนี้แสดงข้อผิดพลาด Recoverable fatal error: Object of class PDOStatement ไม่สามารถแปลงเป็นสตริงใน /home/customer/xxxx/fetch_data.php ในบรรทัดที่ 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();

คำตอบ

YourCommonSense Aug 18 2020 at 08:23

นั่นไม่ใช่งานเล็กน้อยเพราะเราต้องเรียกใช้แบบสอบถามเดียวกันสองครั้ง แต่มีความแตกต่างเล็กน้อย แบบสอบถามแรกจะใช้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 clause ยอมรับตัวยึดตำแหน่งและจะเตือนคุณในกรณีที่เกิดปัญหาใด ๆ