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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: session_start() стартует сессии при каждом переходе на другую страницу по линку. Что сделать?

Сообщения:  [1-9] 

 
 автор: gotbar   (27.08.2005 в 21:02)   письмо автору
 
   для: cheops   (27.08.2005 в 20:47)
 

Говорят, что в настройках сервера у них htaccess как конфигурационный файл разрешен, но мои настройки session.save_handler работает от фонаря, а флаг session.use_trans_sid вообще не могу отключить.

Верить им на слово? Или через пхп можно проверить, дано добро для htaccess или нет?

Да, еще - пхп на хосте скомпелирован как модуль апаче. А на нашей фирме как CGI.

   
 
 автор: cheops   (27.08.2005 в 20:47)   письмо автору
 
   для: gotbar   (27.08.2005 в 14:52)
 

Хм... а может просто не разрешено использовать в .htaccess директиву session.save_handler? Вы не спрашивали ещё об этом в тех поддержке хостинга?

   
 
 автор: gotbar   (27.08.2005 в 14:52)   письмо автору
 
   для: cheops   (27.08.2005 в 12:39)
 

Конечно, да.

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

Такое впечатление, что сервер на хосте при session_start проверяет наличие файла сессии, а не БД, а только потом "читает" установки в .htaccess

session.save_handler "user"

1. Может .htaccess лежит не в той директории? У меня он находится там , где скрипты обработчика и формы.
И в том случае, если я прямо обращаюсь к этим скриптам и залогинившись возвращаюсь на ту же страницу, все как раз работает даже на хосте.

Но в случае, если я гружу ту же форму как новое окно (скрипты лежат в другой директории и там стоит include моей формы) или уже залогинившись перехожу к другой странице, то сервер теряет сессию.

   
 
 автор: cheops   (27.08.2005 в 12:39)   письмо автору
 
   для: gotbar   (27.08.2005 в 04:49)
 

А понял... но для этого нужно, чтобы ses_id был проиндексирован как уникальный ключ - у вас имеется такая индексация в MySQL-таблице?

   
 
 автор: gotbar   (27.08.2005 в 04:49)   письмо автору
 
   для: cheops   (26.08.2005 в 21:47)
 

именно SID не проверяю. Но некоторое подобие проверки есть


 $session_sql = "INSERT INTO $sesTable (ses_id, ses_start, ses_time, ses_value) VALUES ('$sesID', '$strTime','".$ses_expiration."', '$data')"; 

        $session_resins = @mysql_query ($session_sql);  // Пишу новую сессию в БД
           if (!$session_resins) {   // Если запись в БД не состоялась, то делаем апдейт   существующей сессии
            $session_sql = "UPDATE  $sesTable SET ses_time='" . $ses_expiration   
                      . "', ses_value='$data' WHERE ses_id='$sesID'"; 


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

   
 
 автор: cheops   (26.08.2005 в 21:47)   письмо автору
 
   для: gotbar   (26.08.2005 в 15:19)
 

Если вы организуете собственный механизм хранения сессий - вам необходимо самостоятельно обрабатывать ситуацию поступления информации от сессии, которая уже имеется в базе данных. Не очень понятно как в обработчике s_write() проверяется существует сессия с таким SID или нет и проводится ли такая проверка?

   
 
 автор: gotbar   (26.08.2005 в 15:19)   письмо автору
 
   для: cheops   (26.08.2005 в 15:00)
 

да, передается.
это выглядит примерно так:
<area shape="rect" coords="120,141,260,231" href="Папка/Файл.htm?sessid=ad8d1afc8fb0503f72a6ab767a6559b6" target="mainFrame1">

Но при переходе по ссылке скрипт заносит в БД новый айди сеанса

   
 
 автор: cheops   (26.08.2005 в 15:00)   письмо автору
 
   для: gotbar   (26.08.2005 в 14:57)
 

session.use_trans_sid="On"

А SID через URL передаётся?

   
 
 автор: gotbar   (26.08.2005 в 14:57)   письмо автору
 
 

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


session_set_save_handler ("s_open", "s_close",  "s_read",  "s_write",  "s_destroy", "s_gc");
session_name('sessid'); 
         $sesTable= "sessions"; 
  
        $dbHost = "localhost";
        $dbDBase = "dbName"; 
        $dbUser = "dbUser";
        $dbPass = "PWD";
 /*Сессию открыть*/
    function s_open($path, $name) { 

     global  $dbHost,$dbDBase,$dbUser,$dbPass;
     $mysql_connect = mysql_connect($dbHost,$dbUser,$dbPass);  
     $mysql_db = mysql_select_db ($dbDBase); 
        if (!$mysql_connect || !$mysql_db) { 
            return FALSE; 
        } else { 
            return TRUE; 
        }//if 
    }//func
    /* Сессию закрыть*/ 
    function s_close() { 
        return TRUE; 
    } 

    /* данные сессии из ДБ */ 
    function s_read($sesID) { 
     global $sesTable;
        $session_sql = "SELECT * FROM $sesTable WHERE ses_id = '$sesID'"; 
        $session_res = mysql_query($session_sql) or die(mysql_error()); 
        if (!$session_res) { 
            return ''; 
        }//if
        $session_num = mysql_num_rows ($session_res); // Noch fraglich
        if ($session_num > 0) { 
            $session_row = mysql_fetch_assoc($session_res); 
            $ses_data = $session_row["ses_value"];  
            return $ses_data; 
        } else { 
            return ''; 
        }//if
    }//func 

    /* занести данные сессии в ДБ */ 
    function s_write($sesID, $data) { 
      global $sesTable;
      $this->data=$daten;
        $ses_life = get_cfg_var("session.gc_maxlifetime");        $ses_expiration = time() + $ses_life;
        $strTime = strftime("%H:%M:%S %d-%m-%Y",time()); 
                $session_sql = "INSERT INTO $sesTable (ses_id, ses_start, ses_time, ses_value) VALUES ('$sesID', '$strTime','".$ses_expiration."', '$data')"; 

        $session_resins = @mysql_query ($session_sql);
           if (!$session_resins) {  
            $session_sql = "UPDATE  $sesTable SET ses_time='" . $ses_expiration  
                      . "', ses_value='$data' WHERE ses_id='$sesID'"; 

               $session_resup = @mysql_query ($session_sql) ;
            if (!$session_resup && !$session_resins){ 
                return FALSE; 
               }//if
            elseif (mysql_affected_rows ()){ 
                return TRUE;
            } else { 
            return TRUE; }//elseif
        }//if
    }//func 

    /* данные сессии удалить*/
    function s_destroy($sesID) { 
      global $sesTable;

        $session_sql = "DELETE FROM $sesTable WHERE ses_id = '$sesID'"; 
        $session_resdel = mysql_query ($session_sql) ;
        mysql_query("OPTIMIZE TABLE $sesTable"); 
        if (!$session_resdel) { 
            return FALSE; 
        }         else { 
            return TRUE; 
        }//if 
    }//func 

    /* старые  сессии удалить*/  
    function s_gc($max_lifetime) { 
      global $sesTable;
echo "trace_6";
        $session_sql = "DELETE FROM $sesTable WHERE ses_time < " . time(); 
        $session_res = @mysql_query ($session_sql); 
        mysql_query("OPTIMIZE TABLE $sesTable"); 
        if (!$session_res) { 
            return FALSE; 
        }         else { 
            return TRUE; 
        }//if 
    }//func 



Установки у хостера и локал:
в .htaccess (лежит в папке со скриптом хандлера):
php_value session.save_handler "user"

в php.ini:

session.use_trans_sid="On"

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

Почему же она этого не делает?

   

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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