artyomweb
Освоившийся
Дата регистрации:
23.09.2014 22:48:11
Сообщений: 26
Здравствуйте, у меня проблема есть постраничный вывод информации из базы данных,
который всё нормально работает и есть форма фильтра поиска из этой базы данных для отфильтровывания
результата вывода информации (например по бренду). После отфильтровывания т.е. после нажатия на 'submit'
формы информация отфильтровывается (показывается нужная), но при перелистываниии страниц (пагинация)
информация вновь становится какая была изначальная. Как сделать чтобы после использования фильтра поиска
пагинация тоже подстраивалась под результат формы поиска?
Подскажите пожалуйста всё перепробывал ничего не получается!!!
Вот скрипты:
<?php
function page()
if(empty($_GET["page"])){
$page = 1;
} else {
if(!is_numeric($_GET["page"])) die("Неправильный формат номера страницы!"
$page = $_GET["page"];
}
return $page;
}
function sql_query($onpage, $page, $table)
{
$begin = $page*$onpage; // откуда начинать
$sql = "SELECT * FROM $table LIMIT ".$begin.", ".$onpage;
$result = mysql_query($sql) or die(mysql_error());
return $result;
}
function navigation($onpage, $page, $table)
{
$return = null;
$count = mysql_query("SELECT COUNT(*) FROM $table" or die(mysql_error());
$count = mysql_fetch_array($count);
$count = $count[0];
$pages = $count/$onpage;
if ($page != 1) $pervpage = '<a href=?page=1>Первая</a> | <a href=?page='. ($page - 1) .'>Предыдущая</a> | ';
if ($page != $onpage) $nextpage = ' | <a href=?page='. ($page + 1) .'>Следующая</a> | <a href=?page=' .floor($pages). '>Последняя</a>';
if($page - 5 > 0) $page5left = ' <a href=?page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=?page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=?page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 5 <= $pages) $page5right = ' | <a href=?page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $pages) $page4right = ' | <a href=?page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $pages) $page3right = ' | <a href=?page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $pages) $page2right = ' | <a href=?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $pages) $page1right = ' | <a href=?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
if ($page > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pagin\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<span>'.$page.'</span>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage." Всего <b>".floor($pages)."</b> стр.";
echo "</div>";
}
elseif ($page = 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pagin\">";
echo '<span>'.$page.'</span>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage." Всего <b>".floor($pages)."</b> стр.";
echo "</div>";
}
}
include "sql_connect.php";
$onpage = 15; // записей на страницу
$page = page(); // определяем страницу
$result = sql_query($onpage, $page, $table);
$row = mysql_fetch_array ($result);
if ($row['currencyId']='RUR'$money='руб.';
$i=0;
$w=3;
$navigation = navigation($onpage, $page, $table); // определим навигацию
echo $navigation;
echo "<table id=\"table_tovars\">";
do{
if(($i==0)||!($i%$w))echo"<tr>";
$i++;
printf ("
<td align=\"center\">
<h4>%s</h4>
<h5>%s</h5>
<img src=\"%s\"/>
<h3>Цена: <span>%s</span> $money</h3>
<a target=\"_blank\" href=\"%s\">Купить</a>
</td>
",$row['vendor'],$row['model'],$row['picture'],$row['price'],$row['currencyId'],$row['url']);
if(!($i%$w)||(mysql_num_rows($result)==$i))echo"</tr>";
}while ($row = mysql_fetch_array ($result));
echo "</table>";
$navigation = navigation($onpage, $page, $table); // определим навигацию
echo $navigation;
mysql_close(); // отключение от БД
?>
tikkiwiki
Модератор
Дата регистрации:
15.11.2013 15:36:59
Сообщений: 194
Здравствуйте. Вы хотите, чтобы пагинация работала при выводе результатов поиска?
artyomweb
Освоившийся
Дата регистрации:
23.09.2014 22:48:11
Сообщений: 26
Да она у меня работает при загрузке данной страницы с отображаемой на
ней данными из базы данных, т.е. переходы по страницам работают, но после фильтрации
с помощью установленной на данной странице формы (<form><input.....></form>
контент на
странице меняется согласно запросу из формы, а вот при переходе на другую страницу
(1,2,3,следующая,предыдущая и т.д.) контент вновь становится какой был изначально
при загрузке страницы. Мне же нужно чтобы после фильтра поиска т.е. после нажатия на
кнопку <submit> в форме пагинация также сохранялась согласно заданным критериям поиска.
Для обработки формы у меня на этой же странице есть:
if ($_POST["price_start"]) $start = "`price` >= '".htmlspecialchars($_POST["price_start"])."'";
if ($_POST["price_end"]) $end = "`price` <= '".htmlspecialchars($_POST["price_end"])."'";
if ($start) $log = "WHERE ".$start;
if ($end) $log = "WHERE ".$end;
if ($start && $end) $log ="WHERE ".$start." AND ".$end;
//$log находится изначально в sql запросе в функции
function sql_query($onpage, $page, $table, $log)
{
$begin = $page*$onpage; // откуда начинать
$sql = "SELECT * FROM $table $log LIMIT ".$begin.", ".$onpage;
$result = mysql_query($sql) or die(mysql_error());
return $result;
}
Дальше идёт код для пагинации, result и вывод данных из sql-запроса. Я думаю что пагинация
после фильтрации формой у меня сбивается на начальный запрос при переходе на другие страницы пагинации
из-за того что result и собственно вывод контента расположены на этой же странице изначально при загрузке,
но как сделать иначе не знаю. Подскажите что-нибудь пожалуйста или в чём-нибудь другом причина не понимаю?
artyomweb
Освоившийся
Дата регистрации:
23.09.2014 22:48:11
Сообщений: 26
Вот форма:
<form id="search_form" name="form" action="" method="post">
<table>
<tr>
<td class="text">Цена от:<input type="text" name="price_start" /> рублей</td>
</tr>
<tr>
<td class="text">Цена до:<input type="text" name="price_end" /> рублей</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="filter" value="Кнопка" />
</td>
</tr>
</table>
</form>
Или как-то делать с помощью Аякса? В общем хоть что-нибудь всё встало из-за
этого!
Jey-Val-Star
Освоившийся
Дата регистрации:
30.11.2014 21:33:11
Сообщений: 27
Вам нужно переделать функцию навигации - в адрес ссылок навигации добавлять (если есть ) параметры фильтра
т.е у вас идет get вида page=2 а должен стать вида page=2&price_start=2&price_end=10
Но параметры фильтра передавать через get, через post работать не будет (или придумайте как передать post гиперссылкой))))
И еще заметил, у вас грубая ошибка в выводе записей, а конкретно с какой позиции начинать. Формула для $begin не верна в корне.
Пример: вы находитесь на первой странице ($page=1), количество записей на страницу у вас 15, а 1×15=15.
Т.е. находясь на первой странице вы получите записи начиная с 15 позиции, а должны с первой.
правильная формула для этого - текущая_страница×количество_записей_на_страницу+1-количество_записей_на_страницу.
и получаем 1×15+1-15=1
Для второй страницы 2×15+1-15=16
и тд
artyomweb
Освоившийся
Дата регистрации:
23.09.2014 22:48:11
Сообщений: 26
Огромное спасибо за ответ буду пробывать! Я уж думал никто не ответит,
а так вроде стало ясно! Ещё раз спасибо за помощь!!!
Jey-Val-Star
Освоившийся
Дата регистрации:
30.11.2014 21:33:11
Сообщений: 27
Не за что - обращайся))) Сам когда-то мучил пагинацию
Кстати - вместо кучи if
if($page - 5 > 0) $page5left = ' <a href=?page='. ($page - 5) .'>'. ($page - 5).'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=?page='. ($page - 4) .'>'. ($page - 4).'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=?page='. ($page - 3) .'>'. ($page - 3).'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=?page='. ($page - 2) .'>'. ($page - 2).'</a> | ';
if($page - 1 > 0) $page1left = '<a href=?page='. ($page - 1) .'>'. ($page - 1).'</a> | ';
if($page + 5 <= $pages) $page5right = ' | <a href=?page='. ($page + 5) .'>'. ($page+ 5) .'</a>';
if($page + 4 <= $pages) $page4right = ' | <a href=?page='. ($page + 4) .'>'. ($page+ 4) .'</a>';
if($page + 3 <= $pages) $page3right = ' | <a href=?page='. ($page + 3) .'>'. ($page+ 3) .'</a>';
if($page + 2 <= $pages) $page2right = ' | <a href=?page='. ($page + 2) .'>'. ($page+ 2) .'</a>';
if($page + 1 <= $pages) $page1right = ' | <a href=?page='. ($page + 1) .'>'. ($page+ 1) .'</a>';
Лучше 2 цикла)
artyomweb
Освоившийся
Дата регистрации:
23.09.2014 22:48:11
Сообщений: 26
Jey-Val-Star спасибо за подсказку с $begin действительно была
серьёзная ошибка всё исправил работает, но вот с самой пагинацией
пока что не получается. Я вроде понял что надо в самой функции
а именно в ссылках по страницам надо что доделывать, но пока только на
уровне догадок))). Подскажи примерно что добавлять в ($page + 1) или
же нужно в функции page() что делать? Что то кручусь вокруг а не выходит.
Jey-Val-Star
Освоившийся
Дата регистрации:
30.11.2014 21:33:11
Сообщений: 27
добавить параметр фильтра в виде GET запрса к URL (если есть)
Там много чего переписывать нужно...
В идеале для выбора из БД - один запрос перед которым проверяется значение фильтра
(если есть значения - то выбираем те которые подходят по это значение)
И точно такой же запрос для пагинации. С одним но вытащить на записи а информацию об их количестве
artyomweb
Освоившийся
Дата регистрации:
23.09.2014 22:48:11
Сообщений: 26
Я сделал условие на проверку GET-запроса в функции выборки из базы:
function sql_query($onpage, $page, $where, $log)
{
if ($_GET["price_start"]){$start = "`price` >= '".htmlspecialchars($_GET["price_start"])."'";}
if ($_GET["price_end"]){$end = "`price` >= '".htmlspecialchars($_GET["price_end"])."'";}
if ($start) $log = "AND ".$start;
if ($end) $log = "AND ".$end;
if ($start && $end) $log ="AND ".$start." AND ".$end;
$begin = $page*$onpage+1-$onpage; // откуда начинать
$sql = "SELECT * FROM $where $log LIMIT ".$begin.", ".$onpage;
$result = mysql_query($sql) or die(mysql_error());
return $result;
}
Такую же и в пагинации:
function navigation($onpage, $page, $where, $log)
{
$return = null;
if ($_GET["price_start"]){$start = "`price` >= '".htmlspecialchars($_GET["price_start"])."'";}
if ($_GET["price_end"]){$end = "`price` >= '".htmlspecialchars($_GET["price_end"])."'";}
if ($start) $log = "AND ".$start;
if ($end) $log = "AND ".$end;
if ($start && $end) $log ="AND ".$start." AND ".$end;
$count = mysql_query("SELECT COUNT(*) FROM $where $log" or die(mysql_error());
$count = mysql_fetch_array($count);
$count = $count[0];
$pages = $count/$onpage;
//Дальше идут if(ы)
Запрос из фильтра работает и выводится информация но пагинация всё равно работает
по старому запросу. C вставкой GET параметра из фильтра в URL я не совсем понял.
В URL который значится в if(ах) в функции пагинации или в URL который идёт изначально при
загрузке страницы до фильтра.