Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
1

Как сделать запрос наличия в форме поискового запроса запроса на поиск одноразовым?

13.07.2019, 22:57. Показов 1458. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. У меня проблема. Я PHP изучаю всего несколько месяцев и делаю по совместительству себе свой сайт. Делаю новостную ленту для него с поиском новостей. Поиск уже выдаёт результат запроса, и даже в обратном порядке и с использованием пагинации, НО ПРОБЛЕМА - он выдаёт результат поиска только на первой странице, а на второй и последующих страницах выдаёт сообщение о том, что я не ввёл запрос для поиска - после завершения первой итерации запроса снова запускается условие (if) наличия поискового запроса в форме для него. Как сделать так, чтобы этого не было, а результаты поиска выводились на все страницы пагинатора?

Вот код файла с обработчиком запроса и пагинатором:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
    
 
    $db_server = '127.0.0.1';
    $db_user = 'SERGEY';
    $db_password = 'BArn05toNga';
    $db_name = 'solar_system';
    
if (isset($_GET['page'])){
    $page = $_GET['page'];
}else $page = 1;
 
if (isset($_POST['form1'])){
$name = $_POST['form1'];
}
 else $name = "Вы не ввели данные для поиска";
 
 
      $countonPages = 10;// Количество записей на странице
 
    
    // Подключаемся к серверу БД
    $link = mysqli_connect("$db_server", "$db_user", "$db_password", "$db_name");
if (mysqli_connect_errno()) {
    printf("Не удалось подключиться к MySQL", mysqli_connect_error());
    exit();
}
$shift = $countonPages*($page-1);
 
$query = "SELECT ID, Nazvanie_stati, Data_publikacii_stati, Text_stati, Text_ssilki_v_menu FROM novosti_o_kosmose WHERE Nazvanie_stati LIKE '%$name%' ORDER by ID DESC LIMIT $shift, $countonPages";
 
if ($result = mysqli_query($link, $query)) {
    /* извлечение ассоциативного массива */
    while ($row = mysqli_fetch_assoc($result)) {
       printf ("<BR>#%s \n Опубликовано %s \n <BR><BR> %s \n<BR><BR> %s \n<BR><BR>  %s \n<BR><BR><BR><HR color = 'black' border = '1'>", $row["ID"], $row["Data_publikacii_stati"], $row["Nazvanie_stati"], $row["Text_stati"], $row["Text_ssilki_v_menu"]);
    }
    mysqli_free_result($result);
}
 
/*Пагинатор*/
$query = "SELECT COUNT(*) AS Nazvanie_stati FROM novosti_o_kosmose";
$result = mysqli_query($link, $query) or die(mysqli_connect_error($link));
$count = mysqli_fetch_assoc($result)['Nazvanie_stati'];
$pagesCount = ceil($count/($countonPages));
 
for ($i = 1; $i <= $pagesCount; $i++) {
    echo "<a href='?page=$i'>$i</a> ";
    }
 
/* закрытие соединения */
mysqli_close($link);
 
?>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2019, 22:57
Ответы с готовыми решениями:

Поиск по тексту с коллекцией в качестве поискового запроса
Добрый день! Передо мной стоит такая задача. Нужно провести поиск по тексту, используя в кач-ве...

Название поддомена как целевого поискового запроса
Недавно заметил что первую позицию в гугле по интересующей меня тематике занимает сайт, у которого...

Как открыть в браузере страницу с результатами заданного поискового запроса?
Здравствуйте. Для того чтобы открыть хром а в нем google через консоль, нужно написать start...

Перенаправление поискового запроса
Скачанная с интернета зараза наустанавливала всякого мусора в системе(Амиго и прочее). Большинство...

22
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
14.07.2019, 01:30 2
Передавать поисковой запрос методом GET и подставлять его в URL вместе с параметром page.
1
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
14.07.2019, 01:33 3
Serg019, Поиск и подобные всякие фильтрации делаются не постом, а get-ом. У вас должны оставаться get параметры в адресной строке.
1
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
14.07.2019, 10:57 4
Верно. При обработке POST-запроса делается перенаправление методом GET по адресу /search?s=код_запроса[&page=1] и при наличии дополнительных страниц к нему добавляется параметр page (или меняется значение этого параметра). Либо, если поисковый запрос не кодируется (не считая использования "URL-кодировки"), можно делать запрос методом GET напрямую с формы.

Добавлено через 3 минут
В первом случае код запроса можно передавать и в пути: /search/код_запроса[?page=1]

Добавлено через 9 минут
Выбор $count нужно делать с тем же условием отбора, что и в основном запросе к базе данных, если индексация не устроена более сложным образом.
1
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
14.07.2019, 13:03  [ТС] 5
Да, но как сделать так, чтобы проверка наличия запроса в поисковой форме в случае большого количества результатов самого запроса происходила бы только один раз? Вот в чём суть моего вопроса.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
14.07.2019, 15:01 6
Serg019, так делать не надо. Просто добавьте поисковой запрос в URL-адреса всех страниц навигации и всё.
0
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
15.07.2019, 13:45  [ТС] 7
А чем же тогда POST плох и зачем его придумали?
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
15.07.2019, 13:47 8
Serg019, к примеру, если отправить форму с логином и паролем методом GET, то логин и пароль будут видны в URL, в т.ч. в истории браузера. Поэтому в подобных ситуациях лучше использовать POST.
1
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
15.07.2019, 18:16 9
POST - основной метод передачи данных на сервер. POST-параметры могут иметь значительно большие размеры, передаваться без кодирования, что имеет большое значение при загрузке файлов на сервер.
0
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
16.07.2019, 13:59  [ТС] 10
Хорошо. Если это не надо делать, то почему у меня результаты запроса к БД выводятся только на первой странице, а на последующих высвечивается моё сообщение о том, что я не ввёл данные для поиска и больше ничего?
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
16.07.2019, 14:05 11
Serg019, потому что вы не передаёте поисковой запрос на другие страницы.
0
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
16.07.2019, 17:49 12
Serg019, я же вам все расписал. "Код запроса" должен присутствовать в адресах всех результирующих страниц. Добавляется/изменяется только параметр page (у результирующих страниц, начиная со второй).
0
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
17.07.2019, 13:47  [ТС] 13
Это я понял. А как он передаётся на последующие страницы? Я не понимаю.
0
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
17.07.2019, 18:09 14
Просто наследуйте в ссылках этот параметр. Естественно, если он проходит валидацию при обработке текущего запроса.
0
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
17.07.2019, 18:42  [ТС] 15
Вот изменённая версия первоначального кода вместе с формой для поиска:


HTML5
1
2
3
4
5
6
7
8
9
10
11
<BODY>
<!-- Search -->
<div class='search'>
     <form action='Search2.php' method="GET">
<input type=text name='form1' value='' size=28 name=search><BR>
<input type=hidden name='page' value='1' size=28 name=search2>
<input type=submit value='Поиск'>
     </form>
     </div>
     <!-- END Search -->
</BODY>

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
    $db_server = '127.0.0.1';
    $db_user = 'SERGEY';
    $db_password = 'BArn05toNga';
    $db_name = 'solar_system';
    
if (isset($_GET['page'], $_GET['form1']))
{
    $page = $_GET['page'];
    $name = $_GET['form1'];
}
else 
{
$page = 1;
$name = "Вы не ввели данные для поиска";
 echo $name;
}
 
      $countonPages = 10;// Количество записей на странице
 
    
    // Подключаемся к серверу БД
    $link = mysqli_connect("$db_server", "$db_user", "$db_password", "$db_name");
if (mysqli_connect_errno()) {
    printf("Не удалось подключиться к MySQL", mysqli_connect_error());
    exit();
}
$shift = $countonPages*($page-1);
 
$query = "SELECT ID, Nazvanie_stati, Data_publikacii_stati, Text_stati, Text_ssilki_v_menu FROM novosti_o_kosmose WHERE Nazvanie_stati LIKE '%$name%' ORDER by ID DESC LIMIT $shift, $countonPages";
 
if ($result = mysqli_query($link, $query)) {
    /* извлечение ассоциативного массива */
    while ($row = mysqli_fetch_assoc($result)) {
       printf ("<BR>#%s \n Опубликовано %s \n <BR><BR> %s \n<BR><BR> %s \n<BR><BR>  %s \n<BR><BR><BR><HR color = 'black' border = '1'>", $row["ID"], $row["Data_publikacii_stati"], $row["Nazvanie_stati"], $row["Text_stati"], $row["Text_ssilki_v_menu"]);
    }
    mysqli_free_result($result);
}
 
/*Пагинатор*/
$query = "SELECT ID, Nazvanie_stati, Data_publikacii_stati, Text_stati, Text_ssilki_v_menu FROM novosti_o_kosmose WHERE Nazvanie_stati LIKE '%$name%' ORDER by ID DESC LIMIT $shift, $countonPages";
$result = mysqli_query($link, $query) or die(mysqli_connect_error($link));
$count = mysqli_fetch_assoc($result)['ID'];
$pagesCount = ceil($count/($countonPages));
var_dump ($count);
 
for ($i = 1; $i <= $pagesCount; $i++) {
    echo "<a href='?page=$i'>$i</a> ";
    }
 
/* закрытие соединения */
mysqli_close($link);
А вот код файла, из котого посылается запрос (который проходит на первую страницу пагинации):

HTML5
1
2
3
4
5
6
7
8
9
10
11
<BODY>
<!-- Search -->
<div class='search'>
     <form action='Search2.php' method="GET">
<input type=text name='form1' value='' size=28 name=search><BR>
<input type=hidden name='page' value='1' size=28 name=search2>
<input type=submit value='Поиск'>
     </form>
     </div>
     <!-- END Search -->
</BODY>
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$db_server = '127.0.0.1';
    $db_user = 'SERGEY';
    $db_password = 'BArn05toNga';
    $db_name = 'solar_system';
    
  $countonPages = 10;// Количество записей на странице
  
if (isset($_GET['page'])){
    $page = $_GET['page'];
}else $page = 1;
  
  $link = mysqli_connect("$db_server", "$db_user", "$db_password", "$db_name");// Подключаемся к базе данных
  $shift = $countonPages*($page-1);
 
$query = "SELECT * FROM novosti_o_kosmose ORDER by ID DESC LIMIT $shift, $countonPages";
 
if ($result = mysqli_query($link, $query)) {
 
    /* извлечение ассоциативного массива */
    while ($row = mysqli_fetch_assoc($result)) {
        printf ("<BR>#%s \n Опубликовано %s \n <BR><BR> %s \n<BR><BR> %s \n<BR><BR>  %s \n<BR><BR><BR><HR color = 'black' border = '1'>", $row["ID"], $row["Data_publikacii_stati"], $row["Nazvanie_stati"], $row["Text_stati"], $row["Text_ssilki_v_menu"]);
    }
}
 
/*Пагинатор*/
$query = "SELECT COUNT(*) AS ID FROM novosti_o_kosmose";
$result = mysqli_query($link, $query) or die(mysqli_connect_error($link));
$count = mysqli_fetch_assoc($result)['ID'];
$pagesCount = ceil($count/$countonPages);
 
for ($i = 1; $i <= $pagesCount; $i++) {
    echo "<a href='?page=$i'>$i</a> ";
    }
 
/* закрытие соединения */
mysqli_close($link);
Добавлено через 11 минут
Да, да. В файле-источнике запроса тоже есть пагинация, но В НЁМ ВСЁ РАБОТАЕТ и запрос на вторую и далее страницу пагинатора проходит. В файле-приемнике где-то происходит обнуление? Может в if-фе?

Добавлено через 9 минут
var_dump ($count) в файле-приемнике на первой странице выдачи запроса показывает, что в этой переменной находится 21 ID-значение, соответствующее количеству совпадающих с запросом строк БД (что верно). На второй же странице выдачи запроса - уже в нём значение NULL. Почему? Не понимаю.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
17.07.2019, 19:02 16
Цитата Сообщение от Serg019 Посмотреть сообщение
PHP
1
echo "<a href='?page=$i'>$i</a> ";
Вы не подставляете поисковый запрос в URL.

Прочитайте ещё раз внимательно все ответы. Вам нужно подставлять поисковой запрос в URL. Подставлять в URL. Примерно так:

HTML5
1
<a href="?page=15&form1=$_GET['form1']">15</a>
0
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
17.07.2019, 19:05 17
Цитата Сообщение от estic Посмотреть сообщение
Выбор $count нужно делать с тем же условием отбора, что и в основном запросе к базе данных
И именовать COUNT(*) не обязательно. Выбирать значение из массива можно по нулевому индексу (только используйте соответствующую mysqli-функцию) или просто как значение первого (единственного) элемента массива.
0
2 / 2 / 0
Регистрация: 05.07.2019
Сообщений: 60
17.07.2019, 20:30  [ТС] 18
Извините, пожалуйста, но на эту строчку (<a href="?page=15&form1=$_GET['form1']">15</a>)
ругается парсер - выдаёт синтаксическую ошибку "syntax error, unexpected '=' in C:\xampp\htdocs\My saits\My first websaits\search2.php on line 148" . У меня PHP 5.6.20.

У меня:

PHP
1
2
3
for ($i = 1; $i <= $pagesCount; $i++) {
echo "<a href="?page=$i&form1=$_GET['form1']">$i</a> ";
   }
0
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
17.07.2019, 20:51 19
Это вам для примера написали, а не для копипаста

У вас должна быть специальная функция для сборки адреса. Или начните хотя бы с использования стандартных функций. Конкретно в показанном коде может фигурных скобок не хватать. Но оно вам и не нужно. Шаблоны по-другому пишутся. Отделите обработку входных параметров и основную логику (включая выполнение запросов к базе данных) от шаблонов.
0
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
17.07.2019, 21:26 20
Serg019,
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
function pageUrl($page) {
    $components = parse_url($_SERVER['REQUEST_URI']);
    $query = $components['query'] ?: '';
    parse_str($query, $params);
    $params['page'] = $page;
    $query = http_build_query($params);
 
    return $components['path'] . '?' . $query;
}
 
?>
 
<?php foreach (range(1, 10) as $page): ?>
    <a href="<?= pageUrl($page) ?>"><?= $page ?></a>
<?php endforeach ?>
0
17.07.2019, 21:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2019, 21:26
Помогаю со студенческими работами здесь

Фильтрация поискового запроса
Как сделать чтобы значение $text вводилось в поле самостоятельно пользователем? &lt;? $text =...

Как сделать гибкий фильтр запроса. Или множественный запрос
В общем проблема такова, хочу чтобы при выборе Боевик и Военный выводились фильмы обоих жанров, а...

Получить результаты поискового запроса
Как получить результаты поиска на русском языке из гугла, яндекса и тд ? Дайте пример.

Получить изображение с поискового запроса
Как мне получить картинку, которая была бы первой в поисковом запросе? Т.е. я пишу какое либо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru