#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 ?