3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
1

Пропадают POST-данные при постраничной навигации

06.10.2017, 11:06. Показов 1870. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

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

HTML5
1
2
3
4
5
6
<p>Выберите диапазон дат</p>
<form name="set_time" method="POST" class="inline-form">
    с <input type="text" id="datefrom" name="datefrom" value="<?echo $df;?>" size="10">
    по <input type="text" id="dateto" name="dateto" value="<?echo $dt;?>" size="10">
    <input type="submit" name="set" value="Выбрать"/>
</form>:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (isset($_POST['datefrom'])) {
    $df = $_POST['datefrom'];
    $start = date('Y-m-d', strtotime($_POST['datefrom'])) . ' 00:00:00';
    } 
    else {
        $df = date('d.m.Y');
        $start = date('Y-m-d') . ' 00:00:00';
    }
 
if (isset($_POST['dateto'])) {
    $dt = $_POST['dateto'];
    $end = date('Y-m-d', strtotime($_POST['dateto'])) . ' 23:59:59';
    } 
    else {
        $dt = date('d.m.Y');
        $end = date('Y-m-d') . ' 23:59:59';
    }
Можно конечно передавать данные GET-ом, но дата это не единственный фильтр, их ещё несколько, поэтому GET-ом будет неудобно.
Читал, что можно как-то работать с сессиями в таком случае, но ни разу их ещё не использовал. Уже второй день мучаюсь, не пойму логику, как написать, чтобы при переходе по страницам POST-данные не терялись. Прошу помощи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2017, 11:06
Ответы с готовыми решениями:

Реализация постраничной навигации при ЧПУ
Такая проблема, написал скрипт навигации, вывода постраничного новостей из базы данных, но вот на...

Сохранение выбранной сортировки при постраничной навигации
Как сохранить выбранную сортировку при постраничной навигации. Пока получается только выбрать...

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

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

24
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
06.10.2017, 11:24 2
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
session_start();
 
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
    if(isset($_POST['datefrom']))
        $_SESSION['datefrom'] = $_POST['datefrom'];
    else
        $_SESSION['datefrom'] = date('d.m.Y');
 
    if(isset($_POST['dateto']))
        $_SESSION['dateto'] = $_POST['dateto'];
    else
        $_SESSION['dateto'] = date('d.m.Y');
}
?>
<p>Выберите диапазон дат</p>
<form name="set_time" method="POST" class="inline-form">
    с <input type="text" id="datefrom" name="datefrom" value="<?=$_SESSION['datefrom']?>" size="10">
    по <input type="text" id="dateto" name="dateto" value="<?=$_SESSION['dateto'];?>" size="10">
    <input type="submit" name="set" value="Выбрать"/>
</form>:
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
06.10.2017, 11:35 3
Prtoy, не надо использовать пост для навигации, это не правильно.
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
06.10.2017, 11:44  [ТС] 4
Jewbacabra, так в навигации гет используется. Пост в форме.

Добавлено через 4 минуты
Jodah, не сработало...
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
06.10.2017, 11:54 5
Prtoy, покажите, как сделали.

У меня этот код работает. Отправил форму, затем перехожу по ссылкам, данные в форме не меняются.
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
06.10.2017, 12:11  [ТС] 6
Jodah,

PHP/HTML
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
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if(isset($_POST['datefrom'])) {
        $_SESSION['datefrom'] = $_POST['datefrom'];
        $df = $_SESSION['datefrom']; //Это подставляется в value формы
        $start = date('Y-m-d', strtotime($_SESSION['datefrom'])) . ' 00:00:00'; //Это подставляется в запрос к БД
    }
    else {
        $_SESSION['datefrom'] = date('d.m.Y');
        $df = $_SESSION['datefrom']; //Это подставляется в value формы
        $start = date('Y-m-d', strtotime($_SESSION['datefrom'])) . ' 00:00:00'; //Это подставляется в запрос к БД
    }
 
    if(isset($_POST['dateto'])) {
        $_SESSION['dateto'] = $_POST['dateto'];
        $dt = $_SESSION['dateto']; //Это подставляется в value формы
        $end = date('Y-m-d', strtotime($_SESSION['dateto'])) . ' 23:59:59'; //Это подставляется в запрос к БД
    }
    else {
        $_SESSION['dateto'] = date('d.m.Y');
        $dt = $_SESSION['dateto']; //Это подставляется в value формы
        $end = date('Y-m-d', strtotime($_SESSION['dateto'])) . ' 23:59:59'; //Это подставляется в запрос к БД
    }
}
?>
<form name="set_time" method="POST" class="inline-form">
    с <input type="text" id="datefrom" name="datefrom" value="<?echo $df;?>" size="10">
    по <input type="text" id="dateto" name="dateto" value="<?echo $dt;?>" size="10">
    <input type="submit" name="set" value="Выбрать"/>
</form>
Если делаю так, то когда заходишь на страницу в форму дата не проставляется. Если сделать как у вас
HTML5
1
2
3
4
5
<form name="set_time" method="POST" class="inline-form">
    с <input type="text" id="datefrom" name="datefrom" value="<?=$_SESSION['datefrom']?>" size="10">
    по <input type="text" id="dateto" name="dateto" value="<?=$_SESSION['dateto'];?>" size="10">
    <input type="submit" name="set" value="Выбрать"/>
</form>
то даты подставляются, но при переходе по страницам всё равно теряются. Причём, если обновлять страницу без переотправки POST, то даты остаются ранее проставленные (из сессии), а надо чтобы возвращались к текущей дате.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
06.10.2017, 12:16 7
Prtoy, вот в этой форме и не надо использовать пост. Пост не для этого предназначен.
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
06.10.2017, 12:24  [ТС] 8
Jewbacabra, а как тогда? Если гетом передавать все используемые параметры, то ссылка получится громадная...
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
06.10.2017, 12:44 9
Prtoy, громадная ссылка это не проблема
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
06.10.2017, 13:00  [ТС] 10
Jewbacabra, но задача как раз избежать громадной ссылки...
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
06.10.2017, 13:25 11
Prtoy, так?
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
 
$df = date('d.m.Y');
$dt = date('d.m.Y');
 
if(isset($_POST['set']))
{
    $df = $_SESSION['datefrom'] = $_POST['datefrom'];
    $dt = $_SESSION['dateto'] = $_POST['dateto'];
}
?>
<p>Выберите диапазон дат</p>
<form name="set_time" method="POST" class="inline-form">
    с <input type="text" id="datefrom" name="datefrom" value="<?=$df?>" size="10">
    по <input type="text" id="dateto" name="dateto" value="<?=$dt?>" size="10">
    <input type="submit" name="set" value="Выбрать"/>
</form>:
0
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
06.10.2017, 13:27 12
Храните данные формы (POST) в сессии. При постраничной навигации используйте фильтры формы, сохраненные в сессии.
Все данные сессии хранятся в суперглобальном массиве $_SESSION. Советую сначала почитать и подучить работу с сессиями, чем пробовать что-то делать. Благо там учить нечего, за час-два должны справиться
0
15 / 15 / 7
Регистрация: 17.12.2016
Сообщений: 172
06.10.2017, 13:29 13
Prtoy, если коротко, форма с методом POST одноразовая.
А на сколько она громадная если будет в GET?
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
06.10.2017, 13:56  [ТС] 14
Jodah, да, так лучше. По страницам теперь даты сохраняются. Но при обновлении страницы без пост-запросов они тоже сохраняются, а хотелось бы их сбрасывать на date('d.m.Y'). Это возможно?

serj0110, Ну пока там 5 параметров (считая пагинацию). Потом возможно ещё будут добавляться. Но уже с 5-ю не очень комфортно.

Добавлено через 12 минут
Jodah, хотя нет, не сработало.

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
session_start();
 
$df = date('d.m.Y');
$dt = date('d.m.Y');
 
if(isset($_POST['set']))
{
    $df = $_SESSION['datefrom'] = $_POST['datefrom'];
    $dt = $_SESSION['dateto'] = $_POST['dateto'];
}
?>
<p>Выберите диапазон дат</p>
<form name="set_time" method="POST" class="inline-form">
    с <input type="text" id="datefrom" name="datefrom" value="<?=$_SESSION['datefrom']?>" size="10">
    по <input type="text" id="dateto" name="dateto" value="<?=$_SESSION['dateto']?>" size="10">
    <input type="submit" name="set" value="Выбрать"/>
</form>:
Работает вот так, но если заходить на страницу без сохранённой сессии, то даты не подставляются в форму...
0
15 / 15 / 7
Регистрация: 17.12.2016
Сообщений: 172
06.10.2017, 13:56 15
Цитата Сообщение от Prtoy Посмотреть сообщение
Но при обновлении страницы без пост-запросов они тоже сохраняются, а хотелось бы их сбрасывать на date('d.m.Y')
Как раз хотел сказать про это после магазина, что в сессии хранить не вариант, никак не определить когда нужно сбросить данные.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
06.10.2017, 14:35 16
Цитата Сообщение от Prtoy Посмотреть сообщение
хотя нет, не сработало.
Что именно не сработало?

Цитата Сообщение от Prtoy Посмотреть сообщение
если заходить на страницу без сохранённой сессии, то даты не подставляются в форму
Вы сказали, что брать данные из сессии не нужно, поэтому в моём примере система так и работает - если даты пришли из формы, то их и показываем, иначе показываем текущую дату. А в запрос к БД вы подставляете данные из сессии.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
06.10.2017, 14:36 17
Prtoy, а зачем избегать громадной ссылки? Выглядит как героическое решение надуманных проблем. Все равно что гвоздь забивать микроскопом вместо молотка, потому что молоток тяжелый.
Поисковые ссылки гугла не маленькие, это наоборот удобно, можно например скинуть ссылку в которой будут сразу все нужные параметры
0
3 / 3 / 3
Регистрация: 01.06.2016
Сообщений: 307
06.10.2017, 14:53  [ТС] 18
Jodah, не сработало сохранение дат при переходе на другие страницы.
Jewbacabra, ну во-первых, эстетически приятней (лично мне), когда ссылки не громоздкие. Во-вторых, когда появятся дополнительные параметры, например, фамилии и имена на кириллице, не все браузеры ещё умеют преобразовывать в адресной строке "%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2" в "Иванов". Согласен, вопрос больше принципиальный чем практически обоснованный, но хотелось бы в идеале всё-таки справиться с пост-запросами.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
06.10.2017, 14:58 19
Prtoy, мне гораздо приятенее видеть код соответствующий базовым принципам протокола http. Есть четкое обоснование когда использовать пост, когда гет, когда другие методы. Браузеры умеют рсскодировать юникод абсолютно все. А то что ссылки громоздкие всем все равно - браузеру, пользователю. Это именно тобой надуманная проблема.

PS. В одном из первых проектов мне доставшихся кто-то сделал навигацию постом. Какими словами я его не называл когда чинил это

Добавлено через 15 секунд
Prtoy, мне гораздо приятенее видеть код соответствующий базовым принципам протокола http. Есть четкое обоснование когда использовать пост, когда гет, когда другие методы. Браузеры умеют рсскодировать юникод абсолютно все. А то что ссылки громоздкие всем все равно - браузеру, пользователю. Это именно тобой надуманная проблема.

PS. В одном из первых проектов мне доставшихся кто-то сделал навигацию постом. Какими словами я его не называл когда чинил это
0
15 / 15 / 7
Регистрация: 17.12.2016
Сообщений: 172
06.10.2017, 14:59 20
Цитата Сообщение от Prtoy Посмотреть сообщение
Согласен, вопрос больше принципиальный чем практически обоснованный, но хотелось бы в идеале всё-таки справиться с пост-запросами.
Это будет настоящим извращение, если хочешь чтобы это была пагинация именно постом, делай на каждую кнопку отдельную форму, в которой будут передаваться данные(при этом, кроме кнопки перехода, остальные данные скрытые)
0
06.10.2017, 14:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2017, 14:59
Помогаю со студенческими работами здесь

Пропадают данные в POST
Вообще-то всё нормально, данные нормально подгружаются через пост и заносятся в бд, но лишь стоит...

Скрипт постраничной навигации
Здрасте всем!! Полазил по форуму и в поиске, нашел кучу всяких тем, но не одна не помогла, поэтому...

Многоточие в постраничной навигации
Здравствуйте. Есть небольшой скрипт игровой статы. Количество инфы увеличилось, и страниц стало так...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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