Есть скрипт поиска:
$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
1. записать пост данные в сессию (незнаю вариант-ли и будет работать али нет).
2. сменить передачю параметров для поиска с $_POST на $_GET
Спустя 2 минуты, 12 секунд (15.06.2010 - 18:08) Trialit написал(а):
1. В сессия записывал - работает, но при переходе на первую страницу результатов надо очистить сессию. Т.е. - белиберда получается на первой странице.
2. Про второе догадался, спасибо, но хотелось бы сделать иначе. Может jquery пагинацию юзать?
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
Это на первой странице:
Это на второй - теряются параметры поиска:
Показываю $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 тысячи параметров выдернули и отдали юзверю, а далее разгребаем их у него на компе? помоему это жестоко.
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 будет таже история. Продумайте(
с 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, данные в пост у нас отсутствуют, сессии присваивается пустота, т.е. поиск происходит без учета заданных вначале параметров.
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. Он решает со второй или третьей страницы сменить данные для поиска, заполняет форму, которая у него вверху каждой из этих страниц висит.
3. Скрипт начинает выполнение и обнаруживает что в сессии что-то есть от старого поиска, и ищет по старым параметрам....
Спустя 1 минута, 2 секунды (15.06.2010 - 18:58) tomash написал(а):
Проверка для сессии например
if (!isset($_SESSION['какой-то параметр поиска']))
{
стартуем сессию и назначаем параметры
}
Если на второй и третьей странице решит поменять параметры поиска, то мы анализируем переменную $_POST и мы из нее пихаем в сессию
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, не меньше, на разные эксперименты с сессиями. А вы мне объяснили на словах что я и сам, видимо, знал, но в упор видеть не хотел))
Очень помогло, ибо, как мне кажется получилось.
Сделал таким образом:
Ещё раз спасибо вам.
Как всё-таки полезно пообщаться с умным человеком. Я потратил часов 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 переменные на наличие значений. Надеюсь я понятно объясняюсь... а то как то длинно получилось