На сайте есть форма поиска товаров, которая выводит на страницу с пагинацией данные в цикле. Косяк: показывается количество страниц, но результаты выводятся только на первую страницу, на последующих - ничего нет. Как решить?
P.S. Есть другая страница с пагинацией, на которую выводятся данные в цикле НЕ ФОРМОЙ, а просто кодом с заранее известными, постоянными критериями поиска. На этой странице все работает отлично. Используется тот же самый код. Способы поиска разные - код вывода один, думаю в этом и проблема. Что именно изменить в коде, как решить?
Мы должны угадывать как это всё реализовано?)
Мне казалось не обязательно сразу мусорить кодом, если в общих чертах ситуация может быть понятной, ведь скорей всего, проблема возникает из-за того, что данные отправляются формой один раз и на страницах 2+ они уже не доступны. Впрочем, вот код:
<?php
ini_set('display_errors', 'Off');
$userid = $_SESSION['user']['id'];
$ge = $_POST['ge'];
$aOt = $_POST['aOt'];
$aDo = $_POST['aDo'];
$plas = $_POST['plas'];
$tph = $_POST['tph'];
if(!empty($tph)){ $tph = '1';
$tph = (int)$tph;}
if (empty($tph)){ $tph = '0';
$tph = (int)$tph;}
$ton = $_POST['ton'];
if(!empty($ton)){ $ton = 'on';}
else if (empty($ton)){ $ton = '%';}
$trand = $_POST['trand'];
if(empty($trand)){ $trand = '%';}
else if(!empty($trand)){ $trand = date("U");
$trand = (int)$trand;
$trand2 = 43200;
$trand = $trand - $trand2;}
$stmt = $mysqli->prepare("SELECT * FROM `users` WHERE `ge` LIKE ? AND `ag`>=? AND `ag`<=? AND `plas` LIKE ? AND `ph` >= ? AND `of` LIKE ? AND `rand` >= ? ") or die(mysqli_error($mysqli));
$stmt->bind_param('siisisi', $ge,$aOt,$aDo,$plas, $tph, $ton, $trand);
$stmt->execute();
if($stmt->error)die('ОШИБКА СОЕДИНЕНИЯ: '.$stmt->error);
$results = $stmt->get_result();
$totalRows = $results->num_rows; //количество всех записей в таблице
$rowsPerPage = 18; //сколько записей выводится на страницу
$totalPages = ceil($totalRows/$rowsPerPage);//количество страниц
$iCurr = (empty($_POST['page']) ? 1 : intval($_POST['page']));//номер текущей страницы
$offset = ($iCurr - 1) * $rowsPerPage;//базовое смещение для лимита
$stmt = $mysqli->prepare("SELECT * FROM `users` WHERE `ge` LIKE ? AND `ag`>=? AND `ag`<=? AND `plas` LIKE ? AND `ph` >= ? AND `of` LIKE ? AND `rand` >= ? ORDER BY `data` DESC LIMIT $offset, $rowsPerPage") or die(mysqli_error($mysqli));
$stmt->bind_param('siisisi', $ge,$aOt,$aDo,$plas, $tph, $ton, $trand);
$stmt->execute();
if($stmt->error)die('ОШИБКА СОЕДИНЕНИЯ: '.$stmt->error);
$check_us = $stmt->get_result();
if ($check_us->num_rows < 1 ) echo '<p style="text-align: center; color: #fff">СОВПАДЕНИЙ НЕ НАЙДЕНО<br><span style="color: #c6c">попробуйте изменить критерии поиска</span></p>';
else
while($result = mysqli_fetch_assoc($check_us))
{
?>
<div class="form">
<?php if(!empty($result['avatar'])): ?>
<img src="/uploads/Photos_Open/<?php echo $result['avatar']; ?>" width="120px">
<? endif ?>
<?php if(empty($result['avatar'])): ?>
<img src="/img/zastavkana.png">
<? endif ?>
<div class="overlay2">
<?php if(!empty($result['na'])) echo $result['na'] . ', ' ?>
<?php if(!empty($result['ag'])) echo $result['ag']; ?><br/>
<?php if(!empty($result['plas'])) echo $result['plas']; ?>
</div>
<form action="/handlers/hand_author_shersh.php" method="POST">
<button type="submit" class="overlay88">
<select name="author_id" style="display: none">
<option value="<?php echo $result['id']; ?>"></option>
</select>
</form>
</div>
<? } ?>
<div class="pag8">
<?php
for ($i = 1; $i <= $totalPages; $i++){
if ($iCurr == $i){
echo "<a href=site_rez_poisk.php?page=$i><span class=\"pag9\"> $i </span></a>";
}
else {
echo "<a href=site_rez_poisk.php?page=$i><span class=\"pag10\"> $i </span></a>";
}
}
?>
Параметры поиска обычно отправляют GET, а не POST, и тогда все параметры в URL.
Иначе ж даже ссылкой на поиск не поделиться.
Например, гугл.
https://www.google.com/search?q=php
Увы, но просто изменение метода на GET в форме и обработчике ничего не дает. Результаты поиска видны только на первой странице.
А может такое быть, если форма ставится на страницу инклудом?
Ну так определяйте в какой части проблема.
Как отлаживать маленькие программы – Блог Петра Калинина
Если в URL есть все нужные параметры, то видимо что-то не так с их доставанием или использованием.
И в адресе страниц
должны же быть все параметры, а не только страница.
Как вариант, можно например достать текущий URL, распарсить query, в массиве установить номер страницы, собрать query.
https://www.php.net/manual/en/function.parse-url.php
https://www.php.net/manual/en/function.parse-str.php
https://www.php.net/manual/en/function.http-build-query.php
кнопка Код нажата не была )
Если проблема именно в этом куске кода (то есть как минимум работает до перехода по страницам), то тут адрес некорректный
параметры же через &
разделяется, ?
только в начале.
What is a URL? - Learn web development | MDN
И после первой страницы получится фигня типа ...&page=1&page=42
если тупо вставлять $_SERVER['QUERY_STRING']
.
Поэтому и надо
Работает) Спасибо).