Постраничный вывод из бд по фильтру

413
21 июля 2017, 01:24

Вообщем, использовал скрипт постраничного вывода данных из бд. В принципе, все работает, но при применении фильтров из селектов постраничный вывод правильно считает и выводит данные, но при нажатие на определенную страницу или следующую страницу данные фильтра сбрасываются и выводяться все страницы и данные по первому условию. Не могу разобраться. Подскажите, если кто знает.

</head>
<body>
<form action="" method="POST">
<div class="right_container">
<div align="center">
<div class="filtr">
<span>ФИЛЬТР</span><br>
</div>
<br>
<select name="data[namev]" class="select">
<option value="" selected>Выберите номер</option>
<option value="без №">без №</option>
<option value="№1">№1</option>
<option value="№2">№2</option>
<option value="№3">№3</option>
<option value="№4">№4</option>
<option value="№5">№5</option>
<option value="№6">№6</option>
<option value="№7">№7</option>
<option value="№8">№8</option>
<option value="№9">№9</option>
<option value="№10">№10</option>
<option value="№11">№11</option>
<option value="№12">№12</option>
</select>
<br>
<?php
// устанавливаем первый и последний год диапазона
$yearArray = range(1800, 2030);
?>
<!-- выводим выпадающий список -->
<select name="data[year]"  class="select">
    <option value="" selected>Выберите год</option>
    <?php
    foreach ($yearArray as $year) {
        // если вы хотите выбрать конкретный год
        $selected = ($year == 1799) ? 'selected' : '';
        echo '<option '.$selected.' value="'.$year.'">'.$year.'</option>';
    }
    ?>
</select>
<br>
<select name="data[lang]"  class="select">
<option value="" selected>Выберите язык</option>
<?php
$query = 'SELECT lang FROM lang';
$result = mysql_query ( $query ) or die ( 'Query failed: ' . mysql_error ( ) );
   while ( $line = mysql_fetch_array ( $result, MYSQL_ASSOC ) ) {
      echo '<option value="' . $line [ 'lang' ] . '">' . $line [ 'lang' ] . "</option>";
   }
?>          
</select>
<br>
<select name="data[sigla]" class="select">
<option value="" selected>Выберите местонахождение</option>
<?php
$query = 'SELECT name FROM sigla';
$result = mysql_query ( $query ) or die ( 'Query failed: ' . mysql_error ( ) );
   while ( $line = mysql_fetch_array ( $result, MYSQL_ASSOC ) ) {
      echo '<option value="' . $line [ 'name' ] . '">' . $line [ 'name' ] . "</option>";
   }
?>          
</select>
<br>
<input class="btn_search" type="submit" name="smb" value="Применить">
<p></p>
</div>
</div>
<div class="left_container">
<?php 
$num = 10;
$page = $_GET['page'];
$result1 = mysql_query("SELECT COUNT(*) FROM `osnov` WHERE `name` LIKE '1%'");
$temp = mysql_fetch_array($result1);
$posts = $temp[0];
$total = (($posts - 1) / $num) + 1;
$total =  intval($total);
$page = intval($page);
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
$start = $page * $num - $num; 
$result = mysql_query("SELECT `name`, `year`, `namev`, `lang`, `vid`, `period`, `sigla` FROM `osnov` WHERE `name` LIKE '1%' LIMIT ".$start.", ".$num) or die('error!'); 
$filter = '';
if(isset($_POST['smb']))
{
    $data = array(
        'year' => '',
        'lang' => '',
        'sigla' => '',
        'namev' => ''
    );
    $request = $_POST['data'];
    foreach($request as $key => $value)
    {
        if( array_key_exists($key,$data) )
        {
            $data[$key] = $value;
        }
    }
    foreach($data as $key => $value)
    {
        if( $value != '' )
        {
            $filter .= " AND `".$key."`='".$value."'";
        }
    }
$result2 = mysql_query("SELECT COUNT(*) from osnov WHERE `name` LIKE '1%'".$filter);
$temp = mysql_fetch_array($result2);
$posts = $temp[0];
$total = (($posts - 1) / $num) + 1;
$total =  intval($total);
$page = intval($page);
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
$start = $page * $num - $num;   
$result = mysql_query("SELECT `name`, `year`, `namev`, `lang`, `vid`, `period`, `sigla` FROM `osnov` WHERE `name` LIKE '1%'".$filter." LIMIT ".$start.", ".$num) or die('error!');
}
while ($row = mysql_fetch_array($result)) {
 echo '<div class="boxer result">
      <div class="box"><a class="result-item-title">' . $row['name'] . '</a>
      <div class="result-item-detail">
      <div class="box-row"><div class="result-item-detail-title">Год</div>
      <div class="box"><span class="attr_title">' . $row['year'] . '</span></div></div>
      <div class="box-row"><div class="result-item-detail-title">Номер</div>
      <div class="box"><span class="attr_title">' . $row['namev'] . '</span></div></div>
      <div class="box-row"><div class="result-item-detail-title">Язык</div>
      <div class="box"><span class="attr_title">' . $row['lang'] . '</span></div></div>
      <div class="box-row"><div class="result-item-detail-title">Вид</div>
      <div class="box"><span class="attr_title">' . $row['vid'] . '</span></div></div>
      <div class="box-row"><div class="result-item-detail-title">Периодичность</div>
      <div class="box"><span class="attr_title">' . $row['period'] . '</span></div></div>
      <div class="box-row"><div class="result-item-detail-title">Местонахождение</div>
      <div class="box"><span class="attr_title">' . $row['sigla'] . '</span></div></div>      
      </div></div></div>';   
}
?>
<?php 
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href=tabl.php?page=1>Первая</a> | <a href=tabl.php?page='. ($page - 1) .'>Предыдущая</a> | ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' | <a href=tabl.php?page='. ($page + 1) .'>Следующая</a> | <a href=tabl.php?page=' .$total. '>Последняя</a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 5 > 0) $page5left = ' <a href=tabl.php?page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=tabl.php?page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=tabl.php?page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=tabl.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=tabl.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 5 <= $total) $page5right = ' | <a href=tabl.php?page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $total) $page4right = ' | <a href=tabl.php?page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $total) $page3right = ' | <a href=tabl.php?page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $total) $page2right = ' | <a href=tabl.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href=tabl.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню если страниц больше одной
if ($total > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pstrnav\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;
echo "</div>";
}
?>
</div>
</form>
</body>
</html>
Answer 1

При выводе пагинации добавьте в этот участок кода параметры фильтра (год, номер, язык, вид, периодичность, местоположение):

// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href=tabl.php?page=1>Первая</a> | <a href=tabl.php?page='. ($page - 1) .'>Предыдущая</a> | ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' | <a href=tabl.php?page='. ($page + 1) .'>Следующая</a> | <a href=tabl.php?page=' .$total. '>Последняя</a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 5 > 0) $page5left = ' <a href=tabl.php?page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=tabl.php?page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=tabl.php?page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=tabl.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=tabl.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 5 <= $total) $page5right = ' | <a href=tabl.php?page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $total) $page4right = ' | <a href=tabl.php?page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $total) $page3right = ' | <a href=tabl.php?page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $total) $page2right = ' | <a href=tabl.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href=tabl.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';

Например, можно формировать ссылки таким образом:

tabl.php?page=3&year=2017&namev=123&lang=ru

В самом скрипте надо ввести проверку на присутствие GET-переменных фильтра и если они есть, то при обращении к базе данных добавляем дополнительные условия.

READ ALSO
Как привязать активный чекбокс и блок внутри которого он находится?

Как привязать активный чекбокс и блок внутри которого он находится?

Сейчас я вывожу в одном блоке количество выбранных элементов, в другом label выбранных элементов по порядку, не сортируя

495
Как вывести всплывающее окно на сайте в Wordpress

Как вывести всплывающее окно на сайте в Wordpress

Хочу реализовать всплывающее окно с контактами при наведении на номер телефона (те

291
Input radio checked по умолчанию не переключается через label

Input radio checked по умолчанию не переключается через label

Суть простая, есть (n) количество radio-кнопок из которой одна должна быть выбрана по умолчанию

302
Вывод картинок во View ASP.NET

Вывод картинок во View ASP.NET

Вот моя модель:

169