Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как организовать сессию?
 
 автор: nicksaint   (13.05.2006 в 14:16)   письмо автору
 
 

Имеется форма поиска:

   $query = "SELECT * FROM hotels 
            WHERE hide='show'
            ".$tmp1.$tmp2.$tmp3." 
            ORDER BY status, distance";
  $prt = mysql_query($query);
  if(!$prt) puterror("ERROR!");
  if (mysql_num_rows($prt)>0)
  {
    ?>

    <?
    
while($par mysql_fetch_array($prt))
    { 
      echo 
"<form name='".$par['hotel_name']."' action='../".$par['link']."' method=POST>";
      echo 
"<input type=hidden value='$city' name='city'>";
      echo 
"<input type=hidden value='$location' name='location'>";
      echo 
"<input type=hidden value='".$par['hotel_ID']."' name='prop_ID'>";
      echo 
"<input type=hidden value='".$par['hotel_name']."' name='hotel_name'>";
      echo 
"<input type=hidden value=$datea name=datea>";
      echo 
"<input type=hidden value=$dated name=dated>";
      echo
"<h3>".$par['hotel_name']."</h3>
                  <div class=status><img src=../
$status></div>
                  <div class=hotpic>
      <img class=hotpic  src=../"
.$par['photo'].">
      <p>Address: 
$country$city, ".$par['address']."<br>
      Nearest metro: "
.$par['metro']."<br>
      Distance: "
.$par['distance']."<br>   
  Hotel Note: <a class=hotelnote>"
.$par['note']."</a><br>
     <ul class=reserve>
     <li class=reserve><a href=../"
.$par['link']."></a></li>
   </ul></div>"
;
echo 
"<div class=reserve-button reserve><input type=image id=reserve-button src=../images/icons/learnmore.jpg>
        <input type=hidden name=search value=search></form></div>"
;
    }
  }
  else 
echo 
"<h3 class=required><img scr= width=16 height=16>Sorry, but there are no $status star hotels in that area of $city.</h3>";                                                    
  echo 
"<br>";
}
?>

После обработки запроса выводится ряд гостиниц с скрытыми параметрами. Если убрать HIDDEN FIELDS, то форма-обработчик не будет знать какую гостинецу надо отобразить. Как можно избавиться от скрытых полей прибегнув к сессии?

   
 
 автор: WebTech   (13.05.2006 в 16:19)   письмо автору
 
   для: nicksaint   (13.05.2006 в 14:16)
 


<?php
$query 
"SELECT * FROM hotels 
            WHERE hide='show' 
            "
.$tmp1.$tmp2.$tmp3.
            ORDER BY status, distance"

  
$prt mysql_query($query); 
  if(!
$prtputerror("ERROR!"); 
  if (
mysql_num_rows($prt)>0
  { 
    
?> 

    <? 
    session_start
();
    while(
$par mysql_fetch_array($prt)) 
    { 
      
$_SESSION['city'] = $city;
      
$_SESSION['location'] = $location;
      
$_SESSION['prop_ID'] = $hotel_ID;
      
$_SESSION['hotel_name'] = $hotel_name;
      
$_SESSION['datea'] = $datea;
      
$_SESSION['dated'] = $dated;
      echo
"<h3>".$par['hotel_name']."</h3> 
                  <div class=status><img src=../
$status></div> 
                  <div class=hotpic> 
      <img class=hotpic  src=../"
.$par['photo']."> 
      <p>Address: 
$country$city, ".$par['address']."<br> 
      Nearest metro: "
.$par['metro']."<br> 
      Distance: "
.$par['distance']."<br>    
  Hotel Note: <a class=hotelnote>"
.$par['note']."</a><br> 
     <ul class=reserve> 
     <li class=reserve><a href=../"
.$par['link']."></a></li> 
   </ul></div>"

echo 
"<div class=reserve-button reserve><input type=image id=reserve-button src=../images/icons/learnmore.jpg> 
        <input type=hidden name=search value=search></form></div>"

    } 
  } 
  else 
echo 
"<h3 class=required><img scr= width=16 height=16>Sorry, but there are no $status star hotels in that area of $city.</h3>";                                                     
  echo 
"<br>"

?>


Так вроде :-)

   
 
 автор: nicksaint   (14.05.2006 в 10:02)   письмо автору
 
   для: WebTech   (13.05.2006 в 16:19)
 

Большое спасибо за помощь. Немного подправил но сессия работает, но почему-то всегда передается только последний параметр.
И
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at z:\home\localhost\www\icon\util\top.php:8) in z:\home\localhost\www\icon\hotels\searcher.php on line 110


Следующая страница должна получить нужное значение параиетра $_SESSION['prop_ID']. У каждого значения оно свое, а передается только последнее и если вернуться назад и сново кликнуть на ссылку то зночение вовсе теряется.

   
 
 автор: WebTech   (14.05.2006 в 11:19)   письмо автору
 
   для: nicksaint   (14.05.2006 в 10:02)
 

Сессия должна начинаться и переменные должны устанавливаться до вывода любой информации в браузер. Т.е.
session_start() и все $_SESSION надо поставить на самый верх скрипта.
Смотри на ошибку, у тебя происходит вывод чего-то в браузер в скрипте searcher.php в строке 110

А насчет последнего значения... У тебя же цикл, поэтому на следующую страницу попадает только последнее значение, которое получается в результате работы цикла. Надо придумать, как все значения передавать. Например, прибавлять номер к имени переменной, т.е.
$_SESSION['prop_ID_1'] при первом проходе цикла
$_SESSION['prop_ID_2'] при втором проходе и т.д.

   
 
 автор: nicksaint   (14.05.2006 в 11:39)   письмо автору
 
   для: WebTech   (14.05.2006 в 11:19)
 

Этот скрипт крепится к results.php (require_once "searcher.php";). Я перенес session_start(); в начало results.php и в начало searcher.php. Ошибка исчезла, но вроблема осталась - передается не та переменная, а песледняя.
Да, и ссылка с одним параметром на все гостиницы ведет на конкретную страницу, а вот там и нужен тот параметр по которому и происходит вывод нудной инфы.
Посмотрел в /tmp и там
city|N;location|N;hotel_ID|N;hotel_name|s:17:"Golden Ring Hotel";datea|N;dated|N;hotel_ID|i:0;status|N;
Почему только по одному отелю?

   
 
 автор: WebTech   (14.05.2006 в 13:11)   письмо автору
 
   для: nicksaint   (14.05.2006 в 11:39)
 

Т.е., для каждой гостиницы своя страница?
Ничего страшного. В цикле будут созданы все переменные, а затем на соответствующей странице выбрана необходимая переменная.
А что у тебя в /tmp? И в каком виде хранятся ссылки на страницы? $par['link']

   
 
 автор: nicksaint   (14.05.2006 в 13:30)   письмо автору
 
   для: WebTech   (14.05.2006 в 13:11)
 

Нет. Имеется страница XXX.php которая принимает параметр отеля ($_SESSION['hotel_ID']) из базы данных т.е. $_SESSION['hotel_ID']=$par['hotel_ID]. Исходя из того какой отель был выбран из списка - сессия должна переслать его ID странице XXX.php для дальнейшего вывода самого отеля.
$par['link']="XXX.php";

Инфо в /tmp постоянно меняется, но инфо только по отелю что последний по списку. Именно его ID и передается хотя должен другой!
city|s:6:"Moscow";location|s:2:"dt";status|s:26:"images/hotels/fivestar.gif";hotel_ID|s:1:"8";hotel_name|s:17:"Golden Ring Hotel";datea|s:10:"05/15/2006";dated|s:10:"05/17/2006";


Я попробывал посмотреть создаются ли вообще другие переменные путем прибавления к имени отеля той-самой переменной
echo"<h3>".$_SESSION['hotel_name']."/".$_SESSION['hotel_ID']."</h3>

К какждому имени отеля прибавилась нужная переменная. Но в /tmp они не заносятся. Значит мы где то рядом ходим.

   
 
 автор: nicksaint   (14.05.2006 в 16:21)   письмо автору
 
   для: nicksaint   (14.05.2006 в 13:30)
 

Кто-нибудь знает как это все должно работать?

   
 
 автор: WebTech   (14.05.2006 в 16:25)   письмо автору
 
   для: nicksaint   (14.05.2006 в 13:30)
 

Не

$_SESSION['hotel_name']."/".$_SESSION['hotel_ID']

а

$_SESSION['hotel_name'.$i]

где $i это счетчик или

$_SESSION['hotel_name'.$_SESSION['hotel_ID']]

но тогда придется $_SESSION['hotel_ID'] приписывать к каждому имени переменной. Попробуй так и у тебя в /tmp окажутся все переменные.

Так уж ли нужны сессии в данном случае?
У тебя выводится отдельная форма для каждой гостиницы. И получается, что каждой форме назначен отдельный обработчик. Нельзя в скрытом поле передавать только hotel_ID, а в обработчике извлекать из бд все остальные данные?
Чем тебе не нравятся скрытые поля?
В данном случае сессии не очень хорошо годятся, потому что все переменные сессии будут созданы кучей и их не очень удобно будет потом "разбирать".
И сессия существует до тех пор, пока открыт браузер. Если пользователь сохранит страницу с формами, потом закроет браузер, а потом эту страницу снова откроет, то данные сессии будут потеряны.

>Но в
>/tmp они не заносятся. Значит мы где то рядом ходим.

Заносится только последнее значение, потому что имена переменных одинаковые, а цикл проходит несколько раз. Остаются только значения после последнего прохода цикла.

   
 
 автор: nicksaint   (14.05.2006 в 16:29)   письмо автору
 
   для: WebTech   (14.05.2006 в 16:25)
 

C hidden fields все работает, но мне не очень хочется их использовать. Их можно изменить.

   
 
 автор: WebTech   (14.05.2006 в 19:12)   письмо автору
 
   для: nicksaint   (14.05.2006 в 16:29)
 

Ну и пусть изменяет. Это проблема пользователя, если он в результате подмены значения получит не то, что надо.
А если ты боишься SQL-injection, то надо просто подставляемые в запрос значения обрабатывать с помощью mysql_escape_string() и stripslashes().

   
 
 автор: nicksaint   (14.05.2006 в 19:33)   письмо автору
 
   для: WebTech   (14.05.2006 в 19:12)
 

А Вы правы. Я наверное оставлю и не стану усложнять. Спасибо за помощь.

   
 
 автор: WebTech   (14.05.2006 в 19:47)   письмо автору
 
   для: nicksaint   (14.05.2006 в 19:33)
 

Все-таки...
С помощью сессий - единственное, что пришло в голову, это вот что.

Если в $par['link'] хранится имя скрипта обработчика в виде xxx.php, то можно так.


<? 
    session_start
(); 
    
$i 0;
    while(
$par mysql_fetch_array($prt)) 
    { 
      
$i++;
      echo 
"<form name='".$par['hotel_name']."' action='../".$par['link']."' method=POST>";
      
$_SESSION['city'][$par['link']] = $city
      
$_SESSION['location'][$par['link']] = $location
      
$_SESSION['prop_ID'][$par['link']] = $par['hotel_ID']; 
      
$_SESSION['hotel_name'][$par['link']] = $par['hotel_name']; 
      
$_SESSION['datea'][$par['link']] = $datea
      
$_SESSION['dated'][$par['link']] = $dated
      . . .
      
// и т.д.
?>


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

<?php 
session_start
();
$city $_SESSION['city'][$_SERVER['PHP_SELF']]; 
$location $_SESSION['location'][$_SERVER['PHP_SELF']]; 
$prop_ID $_SESSION['prop_ID'][$_SERVER['PHP_SELF']]; 
$hotel_name $_SESSION['hotel_name'][$_SERVER['PHP_SELF']]; 
$datea $_SESSION['datea'][$_SERVER['PHP_SELF']]; 
$dated $_SESSION['dated'][$_SERVER['PHP_SELF']]; 
...
// и т.д.
?>

   
 
 автор: nicksaint   (14.05.2006 в 19:50)   письмо автору
 
   для: WebTech   (14.05.2006 в 19:47)
 

Надо и это попробывать. Потом отпишу что получилось.

   
 
 автор: WebTech   (14.05.2006 в 19:54)   письмо автору
 
   для: WebTech   (14.05.2006 в 19:47)
 

Меня смущает, что у тебя в форме стоит
action = $par['link']

Получается, что для каждой формы отдельный скрипт обработчик? Если так, то получается, что при добавлении нового отеля, нужно добавлять скрипт. Или в $par['link'] фиксированное значение, одинаковое для всех форм?

Хочется довести дело до конца :-)

   
 
 автор: nicksaint   (14.05.2006 в 19:59)   письмо автору
 
   для: WebTech   (14.05.2006 в 19:54)
 

Нет, как только hotel_ID падает на XXX.php происходит простой запрос:

$query = "SELECT hotel_name FROM hotels
          WHERE hotel_ID='".$_SESSION['hotel_ID']."'";
  $prt = mysql_query($query);
  if(!$prt) puterror("ERROR!");
  if (mysql_num_rows($prt)>0)
  {
    while($par = mysql_fetch_array($prt))
    {      
$property=$par['hotel_name']; и т.д.

И выводится инфо отеля.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования