LIKE ile PDO sayfalandırma

Aug 18 2020

Aşağıdaki PHP SQL kodu, Kurtarılabilir ölümcül hata hatasını gösteriyor: PDOStatement sınıfının nesnesi, 28. satırda /home/customer/xxxx/fetch_data.php içinde dizeye dönüştürülemedi Tablodan ürün bilgilerini görüntülemeye çalışıyordum filterİki $statement->execute();, bir toplam arama sonuçlarını saymak ve bir diğeri de geçerli sayfa için ürünleri görüntülemek. PDO yönteminde yeniyim ve genel kodlama konusunda uzman değilim.

Sorunlara yol açıyor. Bununla ve ilgili işlevlerle, kod çalışır ve verileri görüntüler. Ancak etkinleştirirsem hata ortaya çıkıyor.$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

Aşağıdaki kodu önerdiği gibi denedim Your Common Senseve sayfalandırma ve toplam arama sonucu sayısı iyi çalışıyor, ancak hiçbir ürün görüntülenmiyor.

    $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

Aşağıdaki satırı kullanmak kodun bazı verileri göstermesine neden olur, ancak sayfalandırma çalışmıyor.

$data_sql = sprintf($base_sql, "*");
    $stmt = $connect->prepare($data_sql); $stmt->execute([$search]); $result = $stmt->fetchAll();

Yanıtlar

YourCommonSense Aug 18 2020 at 08:23

Aynı sorguyu iki kez çalıştırmamız gerektiğinden bu önemsiz bir görev değil, ancak küçük farklılıklar var. İlk sorgu count(*), arama kriterleriyle eşleşen toplam kayıt sayısını elde etmek için SQL işlevini kullanacaktır . İkinci sorgu, tek sayfanın verilerini almak için LIMIT yan tümcesine sahip gerçek alanları seçecektir.

$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();

Önemli: Bu kodun çalışması için mysql'e doğru şekilde bağlandığınızdan emin olun . doğru bağlantı, bir LIMIT cümlesinin yer tutucuları kabul etmesine izin verecek ve ayrıca herhangi bir sorun olması durumunda sizi uyaracaktır.