Всем привет. У меня есть код вывода результата поиска, при первом запросе выводится то количество страниц, которое соответствует запросу. Но при нажатии на следующую страницу выводятся уже все данные из БД. Я так понимаю запрос должен каждый раз повторяться при нажатии на номер страницы. Каким образом это можно сделать? Вот код: Код (Text): <?php if (isset($_POST['submit_s'])) { $submit_s = $_POST['submit_s']; } if (isset($_POST['search'])) { $search = $_POST['search']; } if (isset($submit_s)) { if (empty($search) or strlen($search) < 3) { exit ("<p>Поисковый запрос не введен, либо он менее 3-х символов.</p>"); } $search = trim($search); $search = stripslashes($search); $search = htmlspecialchars($search); } /*else { exit("<p>Для того чтобы что то найти, необходимо что то ввести ;D.</p>"); }*/ ?> <?php //соединение с базой данных при помощи функции mysql_connect() //в аргументах функции укажите имя сервера, логин и пароль. $db = mysql_connect("127.0.0.1","root",""); //функция mysql_select_db() выбирает текущую //базу данных с именем "komtet_test" mysql_select_db("db_name" ,$db); mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET 'utf8'"); //функция mysql_query() выполняет запрос на выборку данных //результирующий набор данных хранится в переменной $sql /*$result = mysql_query("SELECT COUNT(tags) AS count from table_name WHERE `tags` LIKE '%".$search."%' ORDER BY tags DESC"); $row = mysql_fetch_assoc($result); echo $row['count']; $rows_max = $row['count'];*/ $query = "SELECT * FROM `table_name` WHERE `tags` LIKE '%".$search."%' ORDER BY tags DESC"; $result = mysql_query($query) or die("Invalid query: " . mysql_error()); $rows_max = mysql_num_rows($result); // Сколько всего новостей у нас в базе $show_pages = 4; // Сколько новостей покажем пользователю $this_page = filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT); // Номер текущей страницы // (По полезнейшей функции filter_var() - курим мануал) if ($this_page) { $offset = (($show_pages * $this_page) - $show_pages); } else { $this_page = 1; // Ставим в единицу (первая страница) если не передан параметр $_GET['page'] $offset = 0; } // Запиливаем собственно, панельку со ссылками на страницы, если нужна пагинация if ($rows_max > $show_pages) { $r = 1; while ($r <= ceil($rows_max/$show_pages)) { if ($r != $this_page) { echo '<a href="'.$search.'?page=' . $r . '" title="Перейти на страницу '.$r.'">'.$r.'</a>'; } else { echo '<b>' . $r . '</b>'; // Если это текущая страница - то ссылка на саму себя не нужна } $r++; } } echo '<div class="body list"><div class="post"><h2>Результаты:'. $search.'</h2></div><div class="thumb_grid">'; /*SELECT COUNT(id) AS count from table_name WHERE `tags` LIKE '%".$search."%' ORDER BY tags DESC*/ $query_limited = "SELECT * from `table_name` WHERE `tags` LIKE '%".$search."%' ORDER BY `tags` DESC LIMIT $offset, $show_pages"; $final_result = mysql_query($query_limited); while ($row = mysql_fetch_assoc($final_result)) { $row["tags"]=str_replace(', ',',',$row["tags"]); $category = substr(strrchr($row["tags"], ','), 1); echo '<div rel="'.$row["id"].'" class="thumb"> <a href="/wallpaper/_w'.$row["id"].'.html" title="'.$row["name"].'" rel="permalink"> <img src="/user-content/uploads/wall/thumb/'.$row["img"].'" alt="'.$row["tags"].'"/></a> <div class="size_wall">'.$row["size"].'</div><div class="tags"><a href="/category/'.$category.'/">'.$category.'</a></div> </div> ';} printf (' </div></div>'); printf ('<div class="clear"></div>'); ?>
Вроде должен все верно выводить, нормальный он%), и разбиение должно быть нормальным. Но мне нех делать абсолютно, код малость переделал так как считаю он должен был быть написан=), комментарии не удалял, зато дописал пару своих xD Код (PHP): <?php if (isset($_POST['submit_s']))//вообще я бы все что ниже в одно условие запихал%) { $submit_s = $_POST['submit_s']; } if (isset($_POST['search'])) { $search = $_POST['search']; } if (isset($submit_s)) { if (empty($search) or strlen($search) < 3)// двойная работа, empty($search) or можно убрать { exit ("<p>Поисковый запрос не введен, либо он менее 3-х символов.</p>"); } $search = trim($search); $search = stripslashes($search); //нах?) $search = htmlspecialchars($search); } /*else { exit("<p>Для того чтобы что то найти, необходимо что то ввести ;D.</p>"); }*/ ?> <?php //соединение с базой данных при помощи функции mysql_connect() //в аргументах функции укажите имя сервера, логин и пароль. $db = mysql_connect("127.0.0.1","root",""); $search=mysql_real_escape_string($search,$db);// !!!!!не забываем фильтровать) //функция mysql_select_db() выбирает текущую //базу данных с именем "komtet_test" mysql_select_db("db_name" ,$db); mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET 'utf8'"); //функция mysql_query() выполняет запрос на выборку данных //результирующий набор данных хранится в переменной $sql /*$result = mysql_query("SELECT COUNT(tags) AS count from table_name WHERE `tags` LIKE '%".$search."%' ORDER BY tags DESC"); $row = mysql_fetch_assoc($result); echo $row['count']; $rows_max = $row['count'];*/ $query = "SELECT COUNT(tags) FROM `table_name` WHERE `tags` LIKE '%$search%' ORDER BY tags DESC";//tags надо индексом сделать $result=mysql_query($query) or die("Invalid query: " . mysql_error()); $rows_max= mysql_fetch_row($result); $rows_max=$rows_max[0];//думаю так будет правильнее $show_pages = 4; // Сколько новостей покажем пользователю $this_page = intval($_GET['page']); // Номер текущей страницы // (По полезнейшей функции filter_var() - курим мануал), !!!!!в данном случае она не нужна, проще вписать intval%) if ($this_page) { $offset = (($show_pages * $this_page) - $show_pages); } else { $this_page = 1; // Ставим в единицу (первая страница) если не передан параметр $_GET['page'] $offset = 0; } // Запиливаем собственно, панельку со ссылками на страницы, если нужна пагинация if ($rows_max > $show_pages) { $r = 1; while ($r <= ceil($rows_max/$show_pages)) { if ($r != $this_page) { echo '[url="',$search,'?page=',$r,'"]',$r,'[/url]'; } else { echo '<b>',$r,'</b>'; // Если это текущая страница - то ссылка на саму себя не нужна } $r++; } } echo '<div class="body list"><div class="post"><h2>Результаты:',$search,'</h2></div><div class="thumb_grid">'; /*SELECT COUNT(id) AS count from table_name WHERE `tags` LIKE '%".$search."%' ORDER BY tags DESC*/ $query_limited = "SELECT * from `table_name` WHERE `tags` LIKE '%".$search."%' ORDER BY `tags` DESC LIMIT $offset, $show_pages"; $final_result = mysql_query($query_limited); while ($row = mysql_fetch_assoc($final_result)) { $row['tags']=str_replace(', ',',',$row['tags']); $category = substr(strrchr($row['tags'], ','), 1); echo '<div rel="',$row['id'],'" class="thumb"> <a href="/wallpaper/_w',$row['id'],'.html" title="',$row['name'],'" rel="permalink"> <img src="/user-content/uploads/wall/thumb/',$row['img'],'" alt="',$row['tags'],'"/></a> <div class="size_wall">',$row['size'],'</div><div class="tags">[url="/category/',$category,'/"]',$category,'[/url]</div> </div> ';}//однажды я просто обжогся жуткими тормозами из-за 'text'.$var1.'more text'.$var --в цикле ощутимые тормоза начинаются) //так что лучше использовать разделение запятыми так как echо православен и допускает это :D echo ' </div></div> <div class="clear"></div>'; ?>
Да код то верный. Выводит результаты поиска только на первой странице, а при переходе на другие страницы выводятся уже все результаты, которые есть в БД, а мне нужны только результаты поиска.
Так же, как и не в поиске, если грубо. Отличие только в условии запроса. Как сделать пагинацию? Как сделать вывод списка статей? --- Добавлено --- P.S. Текст поискового запроса желательно как-то кодировать и пихать в урл путем редиректа. --- Добавлено --- P.P.S. Ну а потом декодировать, если пых это не сделает автоматически за вас.
@Gasgolder, если ключевые слова для поиска передаются гет параметром, то ничего не мешает привязать их к ссылкам пагинатора. Если пост, то опять же ничто не мешает привязать их к ссылкам в виде гет параметров, или флагу передаваемому тем же методом гет по которому будут браться ключевые слова сохранённые например в сессии или даже бд.