Разбиение на страницы PDO с помощью LIKE

#php #sql #pdo

Вопрос:

Следующий код PHP SQL показывает исправимую фатальную ошибку: Объект класса 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();
 

Комментарии:

1. не объединяйте смещение предела для объекта оператора, сделайте это в операторе запроса (сразу после предложения like), и в этом случае у него должен быть свой собственный заполнитель

2. @Кевин, если у вас есть время, пожалуйста, покажите пример. Я попробовал $stmt = $connect->подготовить(«ВЫБЕРИТЕ * ИЗ фильтра, ГДЕ имя продукта, НАПРИМЕР :ограничение иглы». $start.»,». $limit.»»); и он показывает нулевые продукты

3. Вы проверили, не приводит ли выполнение запроса к ошибке в базе данных?

4. @Нико Хаасе, Нет, на самом деле этот код работал нормально до того, как я попытался добавить функцию «подготовленное заявление». также он правильно подсчитывает страницы.

5. @NicoHaase К вашему сведению, PDO может создавать исключения, поэтому нет необходимости заполнять ваш код $stmt->errorInfo();

Ответ №1:

Это не тривиальная задача, так как нам нужно выполнить один и тот же запрос дважды, но с незначительными различиями. Первый запрос будет использовать 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. правильное подключение позволит ОГРАНИЧИТЕЛЬНОМУ пункту принимать заполнители, а также предупредит вас в случае каких-либо проблем.

Комментарии:

1. Я попробовал, и в разделе результатов отображается «найдено 100 результатов». В базе данных всего 7 записей, и только раздел разбиения на страницы показывает эти данные. Раздел продуктов ничего не показывает

2. изменение «количество(*)»);» показывает правильные номера страниц, но по-прежнему не отображаются продукты

3. что касается раздела продукта, то ваши начальные и предельные переменные должны иметь разумные значения

4. да, начало и предел имеют значения. отредактировал мой вопрос.

5. @YourCommonSense, Почему $data_sql = $count_sql = sprintf($base_sql, «*»).» ОГРАНИЧЕНИЕ ?,?»; … необходим ли $count_sql ?