За последние 24 часа нас посетили 22139 программистов и 1149 роботов. Сейчас ищут 611 программистов ...

Как сделать пагинацию в поиске

Тема в разделе "PHP и базы данных", создана пользователем AkudJEE, 16 янв 2013.

  1. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Всем привет. У меня есть код вывода результата поиска, при первом запросе выводится то количество страниц, которое соответствует запросу. Но при нажатии на следующую страницу выводятся уже все данные из БД. Я так понимаю запрос должен каждый раз повторяться при нажатии на номер страницы. Каким образом это можно сделать? Вот код:
    Код (Text):
    1. <?php
    2.  if (isset($_POST['submit_s']))
    3.  {
    4.  $submit_s = $_POST['submit_s'];
    5.  }
    6.  
    7.  if (isset($_POST['search']))
    8.  {
    9.  $search = $_POST['search'];
    10.  }
    11.  
    12.  if (isset($submit_s))
    13.  {
    14.  
    15.  if (empty($search) or strlen($search) < 3)
    16.  {
    17.  exit ("<p>Поисковый запрос не введен, либо он менее 3-х символов.</p>");
    18.  }
    19.  
    20.  $search = trim($search);
    21.  $search = stripslashes($search);
    22.  $search = htmlspecialchars($search);
    23.  
    24.  }
    25.  
    26.  /*else
    27.  {
    28.  exit("<p>Для того чтобы что то найти, необходимо что то ввести ;D.</p>");
    29.  }*/
    30.  
    31.  ?>
    32.  <?php
    33. //соединение с базой данных при помощи функции mysql_connect()
    34.   //в аргументах функции укажите имя сервера, логин и пароль.
    35.   $db = mysql_connect("127.0.0.1","root","");
    36.   //функция mysql_select_db() выбирает текущую
    37.   //базу данных с именем "komtet_test"
    38.   mysql_select_db("db_name" ,$db);
    39. mysql_query("SET NAMES 'utf8'");
    40. mysql_query("SET CHARACTER SET 'utf8'");
    41.   //функция mysql_query() выполняет запрос на выборку данных
    42.   //результирующий набор данных хранится в переменной $sql
    43.  
    44.     /*$result = mysql_query("SELECT COUNT(tags) AS count from table_name WHERE  `tags` LIKE '%".$search."%' ORDER BY tags DESC");
    45. $row = mysql_fetch_assoc($result);
    46. echo $row['count'];
    47. $rows_max = $row['count'];*/
    48.  
    49. $query =  "SELECT * FROM `table_name` WHERE  `tags` LIKE '%".$search."%' ORDER BY tags DESC";
    50. $result = mysql_query($query) or die("Invalid query: " . mysql_error());
    51.  
    52. $rows_max = mysql_num_rows($result); // Сколько всего новостей у нас в базе
    53. $show_pages = 4; // Сколько новостей покажем пользователю
    54.      
    55.       $this_page = filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT); // Номер текущей страницы
    56.     // (По полезнейшей функции filter_var() - курим мануал)
    57.      
    58.     if ($this_page)
    59.     {
    60.             $offset = (($show_pages * $this_page) - $show_pages);
    61.     }
    62.     else
    63.     {
    64.             $this_page = 1; // Ставим в единицу (первая страница) если не передан параметр $_GET['page']
    65.             $offset = 0;
    66.     }
    67.      
    68.     // Запиливаем собственно, панельку со ссылками на страницы, если нужна пагинация
    69.     if ($rows_max > $show_pages)
    70.     {
    71.            $r = 1;
    72.            while ($r <= ceil($rows_max/$show_pages))
    73.            {
    74.                if ($r != $this_page)
    75.                {          
    76.                     echo '<a href="'.$search.'?page=' . $r . '" title="Перейти на страницу '.$r.'">'.$r.'</a>';
    77.                }
    78.                else
    79.                {
    80.                    echo '<b>' . $r . '</b>'; // Если это текущая страница - то ссылка на саму себя не нужна
    81.                 }
    82.                 $r++;      
    83.            }
    84.     }
    85.    
    86.  
    87.   echo '<div class="body list"><div class="post"><h2>Результаты:'. $search.'</h2></div><div class="thumb_grid">';
    88.    /*SELECT COUNT(id) AS count from table_name WHERE  `tags` LIKE '%".$search."%' ORDER BY tags DESC*/  
    89.     $query_limited = "SELECT * from `table_name` WHERE  `tags` LIKE '%".$search."%' ORDER BY `tags` DESC LIMIT $offset, $show_pages";
    90.     $final_result = mysql_query($query_limited);
    91.  
    92.     while ($row = mysql_fetch_assoc($final_result)) {  
    93.  
    94.           $row["tags"]=str_replace(', ',',',$row["tags"]);  
    95.              $category = substr(strrchr($row["tags"], ','), 1);  
    96.         echo '<div rel="'.$row["id"].'" class="thumb">
    97.     <a href="/wallpaper/_w'.$row["id"].'.html" title="'.$row["name"].'" rel="permalink">
    98.                 <img src="/user-content/uploads/wall/thumb/'.$row["img"].'" alt="'.$row["tags"].'"/></a>
    99.                 <div class="size_wall">'.$row["size"].'</div><div class="tags"><a href="/category/'.$category.'/">'.$category.'</a></div>
    100.         </div>  
    101.         ';}
    102.          printf (' </div></div>');
    103.  
    104.  printf ('<div class="clear"></div>');
    105.    
    106.     ?>
     
  2. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Вроде должен все верно выводить, нормальный он%), и разбиение должно быть нормальным. Но мне нех делать абсолютно, код малость переделал так как считаю он должен был быть написан=), комментарии не удалял, зато дописал пару своих xD
    Код (PHP):
    1. <?php
    2.  if (isset($_POST['submit_s']))//вообще я бы все что ниже в одно условие запихал%)
    3.  {
    4.  $submit_s = $_POST['submit_s'];
    5.  }
    6.  
    7.  if (isset($_POST['search']))
    8.  {
    9.  $search = $_POST['search'];
    10.  }
    11.  
    12.  if (isset($submit_s))
    13.  {
    14.  
    15.  if (empty($search) or strlen($search) < 3)//  двойная работа,  empty($search) or можно убрать
    16.  {
    17.  exit ("<p>Поисковый запрос не введен, либо он менее 3-х символов.</p>");
    18.  }
    19.  
    20.  $search = trim($search);
    21.  $search = stripslashes($search); //нах?)
    22.  $search = htmlspecialchars($search);
    23.  }
    24.  
    25.  /*else
    26.  {
    27.  exit("<p>Для того чтобы что то найти, необходимо что то ввести ;D.</p>");
    28.  }*/
    29.  
    30.  ?>
    31.  <?php
    32. //соединение с базой данных при помощи функции mysql_connect()
    33.   //в аргументах функции укажите имя сервера, логин и пароль. 
    34.   $db = mysql_connect("127.0.0.1","root","");
    35.   $search=mysql_real_escape_string($search,$db);//  !!!!!не забываем фильтровать) 
    36.   //функция mysql_select_db() выбирает текущую 
    37.   //базу данных с именем "komtet_test"
    38.   mysql_select_db("db_name" ,$db);
    39. mysql_query("SET NAMES 'utf8'");
    40. mysql_query("SET CHARACTER SET 'utf8'");
    41.   //функция mysql_query() выполняет запрос на выборку данных 
    42.   //результирующий набор данных хранится в переменной $sql
    43.  
    44.    /*$result = mysql_query("SELECT COUNT(tags) AS count from table_name WHERE  `tags` LIKE '%".$search."%' ORDER BY tags DESC");
    45. $row = mysql_fetch_assoc($result);
    46. echo $row['count'];
    47. $rows_max = $row['count'];*/
    48.  
    49. $query =  "SELECT COUNT(tags) FROM `table_name` WHERE  `tags` LIKE '%$search%' ORDER BY tags DESC";//tags надо индексом сделать
    50. $result=mysql_query($query) or die("Invalid query: " . mysql_error());
    51.  
    52. $rows_max= mysql_fetch_row($result);
    53. $rows_max=$rows_max[0];//думаю так будет правильнее
    54.  
    55. $show_pages = 4; // Сколько новостей покажем пользователю
    56.       $this_page = intval($_GET['page']); // Номер текущей страницы
    57.     // (По полезнейшей функции filter_var() - курим мануал), !!!!!в данном случае она не нужна, проще вписать intval%)
    58.       
    59.     if ($this_page)
    60.     {
    61.             $offset = (($show_pages * $this_page) - $show_pages);
    62.     }
    63.     else
    64.     {
    65.             $this_page = 1; // Ставим в единицу (первая страница) если не передан параметр $_GET['page']
    66.             $offset = 0;
    67.     }
    68.      
    69.     // Запиливаем собственно, панельку со ссылками на страницы, если нужна пагинация
    70.     if ($rows_max > $show_pages)
    71.     {
    72.            $r = 1;
    73.            while ($r <= ceil($rows_max/$show_pages))
    74.            {
    75.                if ($r != $this_page)
    76.                {          
    77.                     echo '[url="',$search,'?page=',$r,'"]',$r,'[/url]';
    78.                }
    79.                else
    80.                {
    81.                    echo '<b>',$r,'</b>'; // Если это текущая страница - то ссылка на саму себя не нужна
    82.                 }
    83.                 $r++;      
    84.            }
    85.     }
    86.    
    87.  
    88.   echo '<div class="body list"><div class="post"><h2>Результаты:',$search,'</h2></div><div class="thumb_grid">'; 
    89.    /*SELECT COUNT(id) AS count from table_name WHERE  `tags` LIKE '%".$search."%' ORDER BY tags DESC*/  
    90.     $query_limited = "SELECT * from `table_name` WHERE  `tags` LIKE '%".$search."%' ORDER BY `tags` DESC LIMIT $offset$show_pages";
    91.     
    92.     $final_result = mysql_query($query_limited);  
    93.     while ($row = mysql_fetch_assoc($final_result))
    94.     {
    95.         $row['tags']=str_replace(', ',',',$row['tags']);  
    96.             $category = substr(strrchr($row['tags'], ','), 1);  
    97.       echo '<div rel="',$row['id'],'" class="thumb">
    98.     <a href="/wallpaper/_w',$row['id'],'.html" title="',$row['name'],'" rel="permalink">
    99.                 <img src="/user-content/uploads/wall/thumb/',$row['img'],'" alt="',$row['tags'],'"/></a>
    100.             <div class="size_wall">',$row['size'],'</div><div class="tags">[url="/category/',$category,'/"]',$category,'[/url]</div>
    101.         </div>  
    102.         ';}//однажды я просто обжогся жуткими тормозами из-за 'text'.$var1.'more text'.$var  --в цикле ощутимые тормоза начинаются)
    103. //так что лучше использовать разделение запятыми так как echо православен и допускает это :D
    104.        
    105. echo ' </div></div> <div class="clear"></div>';
    106.     
    107. ?>
     
  3. Gizma4ok

    Gizma4ok Активный пользователь

    С нами с:
    16 янв 2013
    Сообщения:
    2
    Симпатии:
    0
  4. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Да код то верный. Выводит результаты поиска только на первой странице, а при переходе на другие страницы выводятся уже все результаты, которые есть в БД, а мне нужны только результаты поиска.
     
  5. Gasgolder

    Gasgolder Новичок

    С нами с:
    12 мар 2019
    Сообщения:
    1
    Симпатии:
    0
    Такая же проблема. У тебя что нибудь получилось? 6 лет прошло думаю что получилось)
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Так же, как и не в поиске, если грубо. Отличие только в условии запроса.

    Как сделать пагинацию?
    Как сделать вывод списка статей?
    --- Добавлено ---
    P.S. Текст поискового запроса желательно как-то кодировать и пихать в урл путем редиректа.
    --- Добавлено ---
    P.P.S. Ну а потом декодировать, если пых это не сделает автоматически за вас.
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Gasgolder, если ключевые слова для поиска передаются гет параметром, то ничего не мешает привязать их к ссылкам пагинатора. Если пост, то опять же ничто не мешает привязать их к ссылкам в виде гет параметров, или флагу передаваемому тем же методом гет по которому будут браться ключевые слова сохранённые например в сессии или даже бд.