[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск + пагинация
Trialit
Ребят, вот уж не знаю сколько времени убил....ну не хватает меня на это:
Есть скрипт поиска:

$choise=$_POST['choise'];

$rt=$_POST['realty_type'];

$country=$_POST['country'];

$region=$_POST['region'];

$city=$_POST['city'];

$min_payment=$_POST['min_payment'];

$max_payment=$_POST['max_payment'];


if (!empty($choise))
{
$addstr.=" AND ra.type='".$choise."'";
}
if (!empty($rt))
{
$addstr.=" AND rety.id_value='".$rt."'";
}
if (!empty($country))
{
$addstr.=" AND ct.id='".$country."'";
}
if (!empty($region))
{
$addstr.=" AND rt.id='".$region."'";
}
if (!empty($city))
{
$addstr.=" AND cit.id='".$city."'";
}
if (!empty($min_payment))
{
$addstr.=" AND urp.min_payment>='".$min_payment."'";
}
if (!empty($max_payment))
{
$addstr.=" AND urp.max_payment<='".$max_payment."'";
}
$ads_numpage = GetSiteSettings("ads_num_page");
$page = (isset($_REQUEST["page"]) && intval($_REQUEST["page"]) > 0) ? intval($_REQUEST["page"]) : 1;
$lim_min = ($page-1)*$ads_numpage;
$lim_max = $ads_numpage;
$limit_str = " LIMIT ".$lim_min.", ".$lim_max;

$strSQL = " SELECT DISTINCT ra.id, ra.id_user, DATE_FORMAT(ra.movedate,'".$config["date_format"]."') as movedate, ra.type, ra.people_count, ra.room_type, ra.sold_leased_status, ra.status, ra.headline,
u.fname, u.phone, u.user_type,
urp.min_payment, urp.max_payment, urp.auction,
ct.name as country_name, rt.name as region_name, cit.name as city_name,
hlt.id_friend, blt.id_enemy,
url.id_region, url.adress as address, rnt.shpr,
ra.upload_path as slide_path, sp.order_id, sp.status as spstatus,
SUM(vst.visits_count) as visits, ft.id as featured, rety.id_value as rent_type
FROM "
.RENT_ADS_TABLE." ra
LEFT JOIN "
.USERS_RENT_LOCATION_TABLE." url ON url.id_ad=ra.id
LEFT JOIN "
.USERS_TABLE." u ON u.id=ra.id_user
LEFT JOIN `rent_prices` rnt ON ra.id=rnt.id_ad
LEFT JOIN `spr_rent_type_user` rety ON ra.id=rety.id_ad
LEFT JOIN "
.USERS_RENT_PAYS_TABLE." urp ON urp.id_ad=ra.id
LEFT JOIN "
.COUNTRY_TABLE." ct ON ct.id=url.id_country
LEFT JOIN "
.REGION_TABLE." rt ON rt.id=url.id_region
LEFT JOIN "
.CITY_TABLE." cit ON cit.id=url.id_city
LEFT JOIN "
.HOTLIST_TABLE." hlt on ra.id_user=hlt.id_friend and hlt.id_user='".$user[0]."'
LEFT JOIN "
.BLACKLIST_TABLE." blt on ra.id_user=blt.id_enemy and blt.id_user='".$user[0]."'
LEFT JOIN "
.SPONSORS_ADS_TABLE." sp ON sp.id_ad=ra.id
LEFT JOIN "
.RENT_AD_VISIT_TABLE." vst ON vst.id_ad=ra.id
LEFT JOIN "
.FEATURED_TABLE." ft ON ft.id_ad=ra.id
WHERE ra.id_user LIKE '%'"
.$addstr." GROUP BY ra.id ".$limit_str;
$rs = $dbconn->Execute($strSQL);



Постраничный вывод результатов поиска.... $limit_str собсно содержит ограничения на запрос.
Поиск осуществляет скрипт sale.php?sel=search
Постраничный вывод сделать не получается, т.к. при sale.php?sel=search&page=2 в $_POST у нас ничего нет и запрос не проходит верно, что логично. Т.е. - запрос к бд меняется от странице к странице, но нужно сохранить его части, отвечающие за параметры поиска.

Думал в сторону сессий. Возникает проблема с первой страницей.

Подскажите пожалуйста логику, как это осуществить? Не понимаю.
Заранее спасибо.



Спустя 7 минут, 36 секунд (15.06.2010 - 18:00) Trialit написал(а):
Добавлю также что форма поиска, передающая переменные в _POST находится на странице sale.php, вне зависимости от sel

Спустя 6 минут, 11 секунд (15.06.2010 - 18:06) Gabriel написал(а):
эмммм...
1. записать пост данные в сессию (незнаю вариант-ли и будет работать али нет).
2. сменить передачю параметров для поиска с $_POST на $_GET

Спустя 2 минуты, 12 секунд (15.06.2010 - 18:08) Trialit написал(а):
1. В сессия записывал - работает, но при переходе на первую страницу результатов надо очистить сессию. Т.е. - белиберда получается на первой странице.
2. Про второе догадался, спасибо, но хотелось бы сделать иначе. Может jquery пагинацию юзать?

Спустя 1 минута, 15 секунд (15.06.2010 - 18:09) tomash написал(а):
в $_REQUEST["page"] должна лежать ваша переменная! сделайте
print ($strSQL);
и покажите сюда

Спустя 8 минут, 14 секунд (15.06.2010 - 18:17) Trialit написал(а):
Спасибо, просьба не нервничать, в $_REQUEST["page"] лежит текущий номер страницы.
Показываю $strSQL
Это на первой странице:
SELECT DISTINCT ra.id, ra.id_user, DATE_FORMAT(ra.movedate,'%m.%d.%Y') as movedate, ra.type, ra.people_count, ra.room_type, ra.sold_leased_status, ra.status, ra.headline, u.fname, u.phone, u.user_type, urp.min_payment, urp.max_payment, urp.auction, ct.name as country_name, rt.name as region_name, cit.name as city_name, hlt.id_friend, blt.id_enemy, url.id_region, url.adress as address, rnt.shpr, ra.upload_path as slide_path, sp.order_id, sp.status as spstatus, SUM(vst.visits_count) as visits, ft.id as featured, rety.id_value as rent_type 
FROM rent_ads ra
LEFT JOIN user_rent_location url ON url.id_ad=ra.id
LEFT JOIN user u ON u.id=ra.id_user
LEFT JOIN `rent_prices` rnt ON ra.id=rnt.id_ad
LEFT JOIN `spr_rent_type_user` rety ON ra.id=rety.id_ad
LEFT JOIN user_rent_pays urp ON urp.id_ad=ra.id
LEFT JOIN country_spr ct ON ct.id=url.id_country
LEFT JOIN region_spr rt ON rt.id=url.id_region
LEFT JOIN city_spr cit ON cit.id=url.id_city
LEFT JOIN hotlist hlt on ra.id_user=hlt.id_friend and hlt.id_user='2'
LEFT JOIN blacklist blt on ra.id_user=blt.id_enemy and blt.id_user='2'
LEFT JOIN sponsors_ads sp ON sp.id_ad=ra.id
LEFT JOIN rent_ad_visit vst ON vst.id_ad=ra.id
LEFT JOIN featured ft ON ft.id_ad=ra.id
WHERE ra.id_user LIKE '%' AND ra.type='4' AND rety.id_value='9' AND ct.id='164' AND rt.id='2' AND cit.id='986221' GROUP BY ra.id LIMIT 0, 5

Это на второй - теряются параметры поиска:
SELECT DISTINCT ra.id, ra.id_user, DATE_FORMAT(ra.movedate,'%m.%d.%Y') as movedate, ra.type, ra.people_count, ra.room_type, ra.sold_leased_status, ra.status, ra.headline, u.fname, u.phone, u.user_type, urp.min_payment, urp.max_payment, urp.auction, ct.name as country_name, rt.name as region_name, cit.name as city_name, hlt.id_friend, blt.id_enemy, url.id_region, url.adress as address, rnt.shpr, ra.upload_path as slide_path, sp.order_id, sp.status as spstatus, SUM(vst.visits_count) as visits, ft.id as featured, rety.id_value as rent_type 
FROM rent_ads ra
LEFT JOIN user_rent_location url ON url.id_ad=ra.id
LEFT JOIN user u ON u.id=ra.id_user
LEFT JOIN `rent_prices` rnt ON ra.id=rnt.id_ad
LEFT JOIN `spr_rent_type_user` rety ON ra.id=rety.id_ad LEFT JOIN user_rent_pays urp ON urp.id_ad=ra.id
LEFT JOIN country_spr ct ON ct.id=url.id_country
LEFT JOIN region_spr rt ON rt.id=url.id_region
LEFT JOIN city_spr cit ON cit.id=url.id_city
LEFT JOIN hotlist hlt on ra.id_user=hlt.id_friend and hlt.id_user='2'
LEFT JOIN blacklist blt on ra.id_user=blt.id_enemy and blt.id_user='2'
LEFT JOIN sponsors_ads sp ON sp.id_ad=ra.id
LEFT JOIN rent_ad_visit vst ON vst.id_ad=ra.id
LEFT JOIN featured ft ON ft.id_ad=ra.id
WHERE ra.id_user LIKE '%' GROUP BY ra.id LIMIT 5, 5

Спустя 40 секунд (15.06.2010 - 18:18) Gabriel написал(а):
Trialit
этож что получится? 3 тысячи параметров выдернули и отдали юзверю, а далее разгребаем их у него на компе? помоему это жестоко.
P.S.можно пробовать при переходе по страницам передавать данные аяксом (включая уже существующие пост переменные+номер страницы), но это будет губительно влиять на индексцию поисковиками (наверное)

Спустя 3 минуты, 46 секунд (15.06.2010 - 18:22) Trialit написал(а):
Цитата (Gabriel @ 15.06.2010 - 18:18)
этож что получится? 3 тысячи параметров выдернули и отдали юзверю, а далее разгребаем их у него на компе? помоему это жестоко.

Прошу прощения....это вы о чем?

Спустя 2 минуты, 13 секунд (15.06.2010 - 18:24) tomash написал(а):
Если не хотите пользоваться сессией, то все переменные поиска возвращайте на страничку и прячьте в хиденах!

Спустя 5 минут, 37 секунд (15.06.2010 - 18:30) Trialit написал(а):
да я хочу пользоваться сессией, делал это, но ведь проблема с первой страницей будет, ибо согласитесь при новом поиске номер страницы=1 и мы очищаем unset сессию от параметров поиска, замкнутый круг какой-то получается(((

с hidden будет таже история. Продумайте(

Спустя 1 минута, 50 секунд (15.06.2010 - 18:31) tomash написал(а):
А зачем unset(), при page = 1 передавать в сессию начальные параметры!
Или я, что-то недопонял!

Нам же известны начальные параметры???

Спустя 10 минут, 37 секунд (15.06.2010 - 18:42) Trialit написал(а):
по шагам:
1. Страница sale.php?show=pr, на ней находится форма поиска. Заполняем параметры. Нажимаем Искать.
2. Страница sale.php?sel=search. Скрипт выводит первую страницу результатов, $page=1 На этом же шаге сессии присваиваем значения из формы ($_POST)
3. Дальше скрипт прекрасно ищет по данным сессии и переходит по страницам. Сессия жива.
4. Возвращаемся на страницу с номером 1, данные в пост у нас отсутствуют, сессии присваивается пустота, т.е. поиск происходит без учета заданных вначале параметров.

Спустя 2 минуты, 56 секунд (15.06.2010 - 18:45) tomash написал(а):
Ну так переходя на страницу 1 не убивайте сессию)))

Спустя 1 минута, 16 секунд (15.06.2010 - 18:46) tomash написал(а):
Проверяйте если сессия уже стартована то использовать параметры из нее, если нет стартуем сессию и тянем данные из поста!

Спустя 1 минута (15.06.2010 - 18:47) Trialit написал(а):
я и не писал в предыдущем посте что я её убивал, просто условие заполнения переменной сессии это - страница с номером 1..... вот и получается по кругу.

Спустя 2 минуты, 32 секунды (15.06.2010 - 18:50) Trialit написал(а):
Цитата (tomash @ 15.06.2010 - 18:46)
Проверяйте если сессия уже стартована то использовать параметры из нее, если нет стартуем сессию и тянем данные из поста!

Прошу прощения, если туплю, но как поступить если на второй или третьей странице, к примеру пользователь решит поменять параметры поиска...
сессия-то у нас не убита....


ЗЫ, какую проверку на стартованность сессии вы имеете ввиду?

Спустя 3 минуты, 4 секунды (15.06.2010 - 18:53) tomash написал(а):
При переходе на первую страницу перед заполнением сессии проверьте ее, если там что-то есть не заполнять... а использовать то что есть.

Спустя 4 минуты, 29 секунд (15.06.2010 - 18:57) Trialit написал(а):
понятно. тогда такая ситуация:
1. Пользователь ищет что-то прошел на вторую страницу, третью. В сессии есть параметры для поиска.
2. Он решает со второй или третьей страницы сменить данные для поиска, заполняет форму, которая у него вверху каждой из этих страниц висит.
3. Скрипт начинает выполнение и обнаруживает что в сессии что-то есть от старого поиска, и ищет по старым параметрам....

Спустя 1 минута, 2 секунды (15.06.2010 - 18:58) tomash написал(а):
Проверка для сессии например
if (!isset($_SESSION['какой-то параметр поиска']))
{
стартуем сессию и назначаем параметры
}

Если на второй и третьей странице решит поменять параметры поиска, то мы анализируем переменную $_POST и мы из нее пихаем в сессию

Спустя 4 минуты, 37 секунд (15.06.2010 - 19:03) Trialit написал(а):
Да, возможно я уже очень долго вожусь с этой проблемой.
Большое спасибо.
Сейчас попробую, напишу о результате.

Спустя 5 минут, 14 секунд (15.06.2010 - 19:08) tomash написал(а):
sale.php?show=pr

вот у Вас признак при котором можно убить старую сессию и стартовать новую! или старой просто переназначить параметры

Спустя 11 минут, 33 секунды (15.06.2010 - 19:20) Trialit написал(а):
согласен, но поиск может начаться и со страницы sale.php?sel=search&page=2 ((

Спустя 9 минут, 53 секунды (15.06.2010 - 19:30) tomash написал(а):
Ну а данные из формы??? если $_POST поступили, значит нужно начинать новый поиск или как? Я конечно могу ошибаться.... но по-моему в скрипт постом данные передаються только раз при начале поиска

Спустя 3 минуты, 41 секунда (15.06.2010 - 19:33) Trialit написал(а):
Вы правы.
Как всё-таки полезно пообщаться с умным человеком. Я потратил часов 17, не меньше, на разные эксперименты с сессиями. А вы мне объяснили на словах что я и сам, видимо, знал, но в упор видеть не хотел))
Очень помогло, ибо, как мне кажется получилось.
Сделал таким образом:
       if (isset($_POST['choise']) or isset($_POST['realty_type']) or isset($_POST['country']) or isset($_POST['region']) or isset($_POST['city']) or isset($_POST['min_payment']) or isset($_POST['max_payment']))
{
$_SESSION['search']['choise']=$_POST['choise'];
$choise=$_SESSION['search']['choise'];
$_SESSION['search']['realty_type']=$_POST['realty_type'];
$rt=$_SESSION['search']['realty_type'];
$_SESSION['search']['country']=$_POST['country'];
$country=$_SESSION['search']['country'];
$_SESSION['search']['region']=$_POST['region'];
$region=$_SESSION['search']['region'];
$_SESSION['search']['city']=$_POST['city'];
$city=$_SESSION['search']['city'];
$_SESSION['search']['min_payment']=$_POST['min_payment'];
$min_payment=$_SESSION['search']['min_payment'];
$_SESSION['search']['max_payment']=$_POST['max_payment'];
$max_payment=$_SESSION['search']['max_payment'];
}
if (isset($_SESSION['search']))
{
$choise=$_SESSION['search']['choise'];
$rt=$_SESSION['search']['realty_type'];
$country=$_SESSION['search']['country'];
$region=$_SESSION['search']['region'];
$city=$_SESSION['search']['city'];
$min_payment=$_SESSION['search']['min_payment'];
$max_payment=$_SESSION['search']['max_payment'];
}


Ещё раз спасибо вам.

Спустя 13 минут, 21 секунда (15.06.2010 - 19:47) Gabriel написал(а):
а если одна из переменных пост прийдет пустой разве не выдаст ошибку?
ЗЫ. возможно туплю.

Спустя 5 минут, 59 секунд (15.06.2010 - 19:53) Trialit написал(а):
нет, для потому что or, чтобы выдавал - надо and
Тут логика получилась такая - если что-то есть в пост, то мы забиваем это в сессию и ищем по этим данным (какими бы скудными они ни были) если же в пост ничего нет (при переходе на любую страницу результатов) то мы используем то что есть в сессии.
А при новом поиске сессия обновляется)

Спустя 1 час, 19 минут, 22 секунды (15.06.2010 - 21:12) tomash написал(а):
Только в условии у Вас OR и если какая то переменная $_POST пустая придет то в сессии соответствующая переменная обнулиться! Я бы выбрал какую-то одну (или добавил бы признак) по которой определял бы изменения в $_POST. А перед переопределением переменных сессии проверял бы $_POST переменные на наличие значений. Надеюсь я понятно объясняюсь... а то как то длинно получилось
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.