Jump to content
  • 0

Постраничный вывод


fiver
 Share

Question

Всем привет!

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

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

Состоит из 2 выпадающих списков и 8 полей input type=text.

Форма методам POST, после нажатия на кнопку, на эту же страницу передает условия для выборки из БД.

Например условие выборки из списка станций метро -

$tmp1 = " and metro='".$_POST['metro']."'";

Выборка прекрасно работает, но при постраничном выводе, при переходе на любую другую страницу

strnitsa.php?page=2

вся выборка сбрасывается, в итоге страница пустая.

Какие есть варианты решения проблемы?

Спасибо!

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0

И как записать в куки то что находиться в массиве POST?

каждое значение отдельно или использовать сериализацию

а можно сделать выпадающие списки активными и при изменении значения в любом из них передавать управление по ссылке

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

Я решил сделать сессиями.

И у меня возникли конкретные вопросы.

У меня есть переменная $poisk, которая содержит все условия по выборке из БД.

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

SELECT * FROM bd WHERE $poisk

Собственно мне надо сохранить переменную в сессию, $_SESSION['poisk'] = $poisk;

А при переходе на следующую страницу, просто оттуда извлечь.

К примеру $poisk = $_SESSION['poisk'];

Но вот засада, у меня эта переменная $poisk при переходе формируется заново.

и опять присваивается $_SESSION['poisk'] = $poisk;

Вот как сделать, что бы переменная $poisk формировалась только после нажатия на кнопку в форме, а так по умолчанию бралась из сессии?

Link to comment
Share on other sites

  • 0

If(isset ('имя_кнопки')){
$_SESSION['poisk'] = $poisk
}

?

Спасибо, сам уже сделал.

Как говорится, правильно заданный вопрос, уже половина ответа.

Все никак не мог реализовать, а пока описывал вопрос, уже понял как сделать.

Сделал так:


$pois = $_SESSION['poisk'];

if(isset($_POST['search']))
{$poisk = 'условия поиска из формы';}

$_SESSION['poisk'] = $poisk;

SELECT * FROM bd WHERE $_SESSION['poisk']

Может быть коряво, зато все стало работать. :)

Link to comment
Share on other sites

  • 0
// получаем значение хоть от куда-нибудь
$poisk = (isset($_POST['search']) ? 'условия поиска из формы' : $_SESSION['poisk'];

// обезопасим себя от "инъекций"
$poisk = fValid($poisk);

SELECT * FROM bd WHERE $poisk;

// проверка данных на безопасность хоть
// элементарная, но должна быть
// это же данные идут от Клиента
function fValid($poisk){
// тут проверяем на соответствие
return $poisk;
}

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

// получаем значение хоть от куда-нибудь
$poisk = (isset($_POST['search']) ? 'условия поиска из формы' : $_SESSION['poisk'];

// обезопасим себя от "инъекций"
$poisk = fValid($poisk);

SELECT * FROM bd WHERE $poisk;

// проверка данных на безопасность хоть
// элементарная, но должна быть
// это же данные идут от Клиента
function fValid($poisk){
// тут проверяем на соответствие
return $poisk;
}

Да, с безопасностью у меня совсем худо.

У меня есть 2 выпадающих списка и 8 форм для ввода.

Можно маленький пример проверки на соответствие.

Хоть посмотреть что это такое.

Спасибо!

Link to comment
Share on other sites

  • 0

а какие у тебя значения в строке передаются? пример строк покажи

Кол-во параметров выборки от 2-х до 15.

Но все сводится к такой строке, т.е. $poisk = $_SESSION['poisk'] =

and status='arenda' and hide='show' and metro='Арбат' and hide='show' and price>=100 and price<=500 and rooms=2

ну и т.п.

Edited by fiver
Link to comment
Share on other sites

  • 0

ты не понял, строка типа

http://mysite.qqq/index.php?metro=arbat&room=23&pricemax=233

т.е.

metro - строка (название)

room - число

pricemax - число

для каждого свой обработчик

Например простое преобразование в число

$room = intval($room);

удаление тэгов из строки и лишних пробелов

$metro = trim(strip_tags($metro));

и так далее

могут быть условия "содержит только буквы" или "только русские буквы"....

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

ты не понял, строка типа

http://mysite.qqq/index.php?metro=arbat&room=23&pricemax=233

данные из формы передаются методом POST на эту же страницу и сразу загоняю их в сессию, для перехода по страницам.

Поэтому строка у меня сначала

 http://mysite.qqq/index.php

а потом


http://mysite.qqq/index.php?page=1
http://mysite.qqq/index.php?page=2
http://mysite.qqq/index.php?page=3

и т.д.

Надо что нибудь защищать?

Edited by fiver
Link to comment
Share on other sites

  • 0

да какая разница каким способом? Это я для наглядности.. Конечно нужно проверять что приходит от пользователя

вот кстати, "человеческим" языком объяснены азы чем опасно не проверять данные особенно если потом их использовать в запросах

http://ru.wikipedia.org/wiki/%C2%ED%E5%E4%F0%E5%ED%E8%E5_SQL-%EA%EE%E4%E0

http://www.securitylab.ru/contest/212083.php

Link to comment
Share on other sites

  • 0

Смотрите, у меня постраничный вывод организован следующим образом, на странице выводитмя 30 предложений.

А внизу, под предложениями слово СТРАНИЦЫ: и далее намера страниц через пробел.

СТРАНИЦЫ: 1 2 3 4 5 6 7 8 9 10 11 12 13 и т.д.

До 105 смотрелось еще нормально, 3 аккуратные строчки.

Но сейчас страниц более 500, и это уже убого.

Надо вывводить как то по другому.

Только вот как.

Может так:

СТРАНИЦЫ: 1 2 3 4 5 6 7 8 9 10 следущие 10 >>

СТРАНИЦЫ: <<предыдущие 10 11 12 13 14 15 16 17 18 19 20 следущие 10 >>

СТРАНИЦЫ: <<предыдущие 10 21 22 23 24 25 26 27 28 29 30 следущие 10 >>

Вообще как для пользователей удобнее всего будет?

Кто делал, поделитесь бесценным опытом.

Может так:

СТРАНИЦЫ: 1 2 3 4 5 6 7 8 9 10 ... 551 552 553 554 555

нажимаем на 10

СТРАНИЦЫ: 9 11 12 13 14 15 16 17 18 19 ... 551 552 553 554 555

Link to comment
Share on other sites

  • 0

Вообще как для пользователей удобнее всего будет?

Кто делал, поделитесь бесценным опытом.

Пейджер зло. Пересматривать 500 страниц будет только отважный, остальным надоест уже на 15й странице. Посему лучше всего сократить максимум страниц до 10 и предлагать уточнить поисковый запрос, чтобы не получать в ответ гору ненужного мусора.

Link to comment
Share on other sites

  • 0

И зачем метод POST для запроса на выборку? Фильтров настолько много, что не влезет в 2 кБ?

Это вы к чему? поясните пожалуйста.

Вообще как для пользователей удобнее всего будет?

Кто делал, поделитесь бесценным опытом.

Пейджер зло. Пересматривать 500 страниц будет только отважный, остальным надоест уже на 15й странице. Посему лучше всего сократить максимум страниц до 10 и предлагать уточнить поисковый запрос, чтобы не получать в ответ гору ненужного мусора.

Да я это понимаю, там и сортировка есть, и расширенный поиск по 15 параметрам.

Но надо сделать возможность постраничного вывода, а будут листать или нет это уже другой вопрос.

Так как поудобнее с точки зрения юзибилити?

Link to comment
Share on other sites

  • 0

Традиционно для поиска, выборки и т.п. принято использовать метод GET. Чтобы конкретный результат выборки можно было занести в закладки и т.п. (т.е. для юзабилити в том числе). Метод POST обычно используется для действий, меняющих состояние на сервере (залогиниться, добавить/отредактировать/удалить пост/коммент, отправить письмо через веб-интерфейс и т.д.).

Единственное, во что может упереться GET — в ограничение длины URL браузером (и то 2k знаков было актуально для ископаемых IE, современные браузеры держат десятки тысяч). Не думаю, что у вас параметров столько, что не впишется в этот лимит. Так зачем усложнять жизнь себе и пользователям?

Link to comment
Share on other sites

  • 0

Традиционно для поиска, выборки и т.п. принято использовать метод GET. Чтобы конкретный результат выборки можно было занести в закладки и т.п. (т.е. для юзабилити в том числе). Метод POST обычно используется для действий, меняющих состояние на сервере (залогиниться, добавить/отредактировать/удалить пост/коммент, отправить письмо через веб-интерфейс и т.д.).

Единственное, во что может упереться GET — в ограничение длины URL браузером (и то 2k знаков было актуально для ископаемых IE, современные браузеры держат десятки тысяч). Не думаю, что у вас параметров столько, что не впишется в этот лимит. Так зачем усложнять жизнь себе и пользователям?

Теперь понял о чем вы.

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

Но это дело прошлое.

Сейчас идет обсуждение вот этого:

Смотрите, у меня постраничный вывод организован следующим образом, на странице выводитмя 30 предложений.

А внизу, под предложениями слово СТРАНИЦЫ: и далее намера страниц через пробел.

СТРАНИЦЫ: 1 2 3 4 5 6 7 8 9 10 11 12 13 и т.д.

До 105 смотрелось еще нормально, 3 аккуратные строчки.

Но сейчас страниц более 500, и это уже убого.

Надо вывводить как то по другому.

Только вот как.

Может так:

СТРАНИЦЫ: 1 2 3 4 5 6 7 8 9 10 следущие 10 >>

СТРАНИЦЫ: <<предыдущие 10 11 12 13 14 15 16 17 18 19 20 следущие 10 >>

СТРАНИЦЫ: <<предыдущие 10 21 22 23 24 25 26 27 28 29 30 следущие 10 >>

Вообще как для пользователей удобнее всего будет?

Кто делал, поделитесь бесценным опытом.

Может так:

СТРАНИЦЫ: 1 2 3 4 5 6 7 8 9 10 ... 551 552 553 554 555

нажимаем на 10

СТРАНИЦЫ: 9 11 12 13 14 15 16 17 18 19 ... 551 552 553 554 555

Link to comment
Share on other sites

  • 0

если есть полноценная поисковая система, но просто нет смысла делать такой постраничный вывод.. особенно ... 551 552 553 554 555. Просто глупо :) достаточно так

Первая Предыдущая 1 2 3 ... Следующая Последняя

Первая Предыдущая ... 3 4 5 ... Следующая Последняя

Первая Предыдущая ... 553 554 555 Следующая Последняя

Link to comment
Share on other sites

  • 0

если есть полноценная поисковая система, но просто нет смысла делать такой постраничный вывод.. особенно ... 551 552 553 554 555. Просто глупо :) достаточно так

Первая Предыдущая 1 2 3 ... Следующая Последняя

Первая Предыдущая ... 3 4 5 ... Следующая Последняя

Первая Предыдущая ... 553 554 555 Следующая Последняя

В общем я решил так, в яндекс сидят не дураки, и я взял их идею листания, как внизу поисковых страниц.

И как ты и написал, добавил переход на первую и на последнюю.

СТРАНИЦЫ: |< ... 13 14 15 16 17 18 19 20 21 22 23 24 25 ... >|

Как то так. ... - переход на следующие 15 страниц , >| - к последней.

Link to comment
Share on other sites

  • 0

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

СТРАНИЦЫ: |< ... 13 14 15 ... >|

СТРАНИЦЫ: |< ... 13 14 15 16 17 18 19 ... >|

СТРАНИЦЫ: |< ... 13 14 15 16 17 18 19 20 21 22 23 24 25 ... >|

Link to comment
Share on other sites

  • 0
и мне не хочется делать киллометровую строку в браузере

Сделайте свой собственный сокращатор ссылок :)

Мой собственный сокращатор метод POST.

Сильнее уже не сократить :)

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

СТРАНИЦЫ: |< ... 13 14 15 ... >|

СТРАНИЦЫ: |< ... 13 14 15 16 17 18 19 ... >|

СТРАНИЦЫ: |< ... 13 14 15 16 17 18 19 20 21 22 23 24 25 ... >|

Как в анекдоте про генерала, которому лизали яйца.

Ну это уже лишнее ...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy