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

Форум PHP

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

 

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

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

тема: опять сессии
 
 автор: RV   (04.06.2005 в 22:38)   письмо автору
 
 


<?
session_start
();
$client_ip $_SERVER['REMOTE_ADDR'];
$client_br $_SERVER['HTTP_USER_AGENT'];

if (
$_SESSION['set'] === "true"// проверяем установлена ли ранее сессия
{
    
    if ((
$client_ip === $_SESSION['client_ip']) AND ($client_br === $_SESSION['client_br'])) // если установлена то проверяем правильная ли она, т.е. не сделал ли ее юзер
    
{
        echo 
"продолжаем сессию";
    }
    else 
    {
        
session_destroy(); // сессия кривая, наверно юзер хакер
        
echo "сессия убита";
    }
}
else  
// если сессия не стоит, то начинаем
{
// проверяем куки, сверяемся с бд, если юзер опознан, то        
{
        if (
update($users_array['login']) === true// обновляем в бд время последнего посещения
        
{
            
session_destroy();
            
session_start(); // начинаем новую сессию и заводим переменные
            
$_SESSION['client_ip'] = $client_ip;
            
$_SESSION['client_br'] = $client_br;
            
$_SESION['set'] = "true";
        
        }
        else 
        {
            echo 
"Ошибка обновления даты";
        }
    }
    else 
    {
        
session_destroy();
        echo 
"Юзер гость сессия уничтожена";
    }        
}

?>


этот код я require на главной странице.
первый раз зашел на главную страницу, скрипт меня опознал, и добавил в базу время последнего посещения, т.е. now(). через какое то время (к примеру 3 секунды) давлю рефреш в бровзере, и скрипт опять обновляет дату последнего посещения, хотя теоретически не должен, т.к. сессия вроде есть. Почему так?
ps
в строке адреса появляется index.php?PHPSESSID=... т.е. сессия вроде как работает

php 5.0.4
session.gc_maxlifetime = 1440
session.cookie_lifetime = 0
session.auto_start = 0

   
 
 автор: cheops   (04.06.2005 в 23:31)   письмо автору
 
   для: RV   (04.06.2005 в 22:38)
 

А вы выведите дамп $_SESSION и посмотрите что в нём?
<?php
  print_r
($_SESSION);
?>

   
 
 автор: RV   (05.06.2005 в 07:28)   письмо автору
 
   для: cheops   (04.06.2005 в 23:31)
 

если изменить код и исправить опечатку $SESION на $_SESSION

<?
.....
session_start();
            
$_SESSION['client_ip'] = $client_ip;
            
$_SESSION['client_br'] = $client_br;
            
$_SESSION['set'] = "true";
            echo 
"стартовали новую сессию";
.....

то постоянно получаем

стартовали новую сессиюArray ( [client_ip] => 127.0.0.1 [client_br] => Mozilla/4.0 и т.д. [set] => true ) 

т.е. как я и предпологал сессия стартует сначала. а должна продолжатся...

   
 
 автор: cheops   (05.06.2005 в 12:35)   письмо автору
 
   для: RV   (05.06.2005 в 07:28)
 

А поместите
<?php 
  print_r
($_SESSION); 
?>

под первым session_start - массив пустой?

   
 
 автор: RV   (05.06.2005 в 12:55)   письмо автору
 
   для: cheops   (05.06.2005 в 12:35)
 

да. первый пуст
Array()

   
 
 автор: cheops   (05.06.2005 в 13:15)   письмо автору
 
   для: RV   (05.06.2005 в 12:55)
 

А версия PHP какая и если несложно приведите секцию [Session] файла php.ini.

   
 
 автор: RV   (05.06.2005 в 13:19)   письмо автору
 
   для: cheops   (05.06.2005 в 13:15)
 

php 5.0.4


[Session]
session.save_handler = files
session.use_cookies = 0
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor     = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 1
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

   
 
 автор: cheops   (05.06.2005 в 13:27)   письмо автору
 
   для: RV   (05.06.2005 в 13:19)
 

А в URL точно PHPSESSID= появляется? А почему через сессионные cookie не хотите SID отправлять?

   
 
 автор: RV   (05.06.2005 в 14:29)   письмо автору
 
   для: cheops   (05.06.2005 в 13:27)
 

уже не появляется :(
если просто перейти на localhost/site
то в строке адреса нету phpsessid и соответственно надпись Стартуем сессию.
если обновить страницу, нажимая на рефреш, то сессии нет. а вот ко всем линкам на странице приписывается id, и если нажать на http://localhost/site/?PHPSESSID=... то надпись сессия продолжается. код изменил так:

<?
// проверяем зареган ли юзер, т.е. проверяем у него куку,
if (($users_array !== "guest") AND ($access_array !== "guest")) // если кука норм и юзер зареган то
{
    
session_start();
    if (
$_SESSION['set'] === "true"// проверяем установлена ли сессия
    
{
        if ((
$_SESSION['client_ip'] === $client_ip) AND ($_SESSION['client_br'] === $client_br)) // если сессия установлена и юзер не сделал ее сам специально то
        
{
            echo 
"продолжаем сессию";
        }
        else 
        {
            
session_destroy(); // в противном случае юзер - хакер или одно из двух
            
echo "кривая сессия";
        }
    }
    else 
// если сессия не была установлена, то начинаем новую и регаем переменные
    
{
        
$_SESSION['set'] = "true";
        
$_SESSION['client_ip'] = $_SERVER['REMOTE_ADDR'];
        
$_SESSION['client_br'] = $_SERVER['HTTP_USER_AGENT'];
        echo 
"стартуем новую сессию";
    }
}
else 
{
    echo 
"юзер гость, сессия не нужна"// если у юзера не установлено кук или в бд его нет, то он гость и сессии ему не нужны
}
?>


собственно как обновить страницу в бровзере и не начинать новую сессию (если я обновляю страницу раз в 3 секунды к примеру?
и еще. если у юзера куки отключены, то сначала надо проверять сессию. если ее нет, то проверять куки. если и кук нет, то выдавать юзеру форму авторизации и после успешной авторизации пытатся ставить куки, а если это нельзя, то начинать сессии. как я понимаю

   
 
 автор: cheops   (05.06.2005 в 15:54)   письмо автору
 
   для: RV   (05.06.2005 в 14:29)
 

Переделал настройки на ваши - у меня всё работает... может у вас сессии на сервере не сохраняются... Попробуйте явно прописать в php.ini путь к папке, где будут хранится сессии
session.save_path = "C:/tmp"

и посмотрите - они там появляются или нет?

   
 
 автор: RV   (05.06.2005 в 16:41)   письмо автору
 
   для: cheops   (05.06.2005 в 15:54)
 

вроде сессии сохраняются в C:\Temp (в винде настроена папка для верменных файлов через переменные окружения). много файлов типа sess_0j83mkmdmti1p4pujivt053r66.
изменил php.ini - save - reboot.
захожу на http://localhost/site/ - Стартуем новую сессию. давлю в бровзере Обновить - Стартуем новую сессию.
однако все ссылки с приставкой phpsessid=... и если нажать на ссылку http://localhost/site/?PHPSESSID=bgarg7iuv4ds9lfcmekv8ojv92 (перейти на главную) , то все ок. Продолжаем сессию. и если давить обновить, то тоже продолжаем сессию. а как сделать чтобы с первого рефреша в бровзере было продолжение сессии а не старт новой??

   
 
 автор: cheops   (05.06.2005 в 16:47)   письмо автору
 
   для: RV   (05.06.2005 в 16:41)
 

А никак пожалуй... если сессионный куки не использовать, то пока у вас в URL не появится PHPSESSID=bgarg7iuv4ds9lfcmekv8ojv92, это будет приводить к новой сессии... можно при первой загрузке автоматически перегрузить страницу с передачей в параметре SID, который можно вернуть функцией session_id().
<?php
    
echo "<HTML><HEAD>
            <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.phpPHPSESSID="
.session_id()."?'>
            </HEAD></HTML>"
;
?>

   
 
 автор: RV   (05.06.2005 в 16:52)   письмо автору
 
   для: cheops   (05.06.2005 в 16:47)
 

сессионные куки. а можно по подробнее? и включены ли они на хостинге (в большинстве)? иначе зачем их делать.
а если куки отключены у пользователя. будут ли работать сессионные куки?

   
 
 автор: cheops   (05.06.2005 в 20:32)   письмо автору
 
   для: RV   (05.06.2005 в 16:52)
 

На севере они будут включены практически 100%, сессионные куки, в отличие от обычных не сохраняются на жёстком диске пользователя, а хранятся в памяти, поэтому их отключают реже, да и обычные куки включены у 95-98 % посетителей, но если они отключены, то такая схема работать не будет. Иногда прибегают к следующему варианту - проверяют включены ли куки у посетителя и если включены то SID, через URL не передают, а если отключены, то передают SID, но это сильно усложняет код и увеличивает вероятность ошибки.

   
 
 автор: RV   (05.06.2005 в 20:56)   письмо автору
 
   для: cheops   (05.06.2005 в 20:32)
 

а если session.use_cookies = 1
и session.use_only_cookies = 0
то если куки включены. сид передается в куках, а если куки выключены, то сид передается в урле. и все это php делает автоматом. разве нет?

   
 
 автор: cheops   (05.06.2005 в 21:03)   письмо автору
 
   для: RV   (05.06.2005 в 20:56)
 

Сейчас может и делает, раньше помоему в ручную писать нужно было SID в каждой ссылке...

   
 
 автор: RV   (06.06.2005 в 03:48)   письмо автору
 
   для: cheops   (05.06.2005 в 21:03)
 

да нет. кажись делает. у меня ссылки простые. в коде никаких . $sid . нету. а переделываются когда куков нет

   
 
 автор: RV   (07.06.2005 в 14:25)   письмо автору
 
   для: RV   (06.06.2005 в 03:48)
 

а как полностью убить сессию затереть все данные и все все все??

<?
session_start
();
$num "f";
if (
$num === "f")
{
    
session_destroy();
    echo 
"уничтожили сессию";
}
echo 
"<a href = ляля>линк</a>";
?>

сдесь при первом заходе линк будет с сидом. а если обновить страницу, то сид пропадет. а как убить сессию, чтобы сид вообще не появлялся? но сессию все равно надо стартовать, т.к. будет много if ....else

   
 
 автор: cheops   (07.06.2005 в 17:20)   письмо автору
 
   для: RV   (07.06.2005 в 14:25)
 

Чтобы SID вообще не появлялся у вас в скрипте не должна вызываться функция session_start() - поставьте какое-нибудь условие на вызов этой функции...

   
 
 автор: RV   (07.06.2005 в 17:42)   письмо автору
 
   для: cheops   (07.06.2005 в 17:20)
 

т.е. полностью убить sid после старта сессии уже нельзя?

   
 
 автор: cheops   (07.06.2005 в 17:48)   письмо автору
 
   для: RV   (07.06.2005 в 17:42)
 

Нет почему можно, применяя функции session_destroy() и очищая суперглобальный массив $_SESSION при помощи функции unset()
<?php
  
unset($_SESSION);
?>

   
 
 автор: RV   (07.06.2005 в 18:01)   письмо автору
 
   для: cheops   (07.06.2005 в 17:48)
 


<?
.....
{                                         unset(
$_SESSION); 
                         
session_destroy();
        echo 
"уничтожили сессию";
}
....
?>

и наоборот пробовал. сид все равно остается

   
 
 автор: cheops   (07.06.2005 в 18:06)   письмо автору
 
   для: RV   (07.06.2005 в 18:01)
 

Попробуйте вместо unset применить к каждой переменной сессии функцию session_unregister() - чего-нибудь получается?

   
 
 автор: RV   (07.06.2005 в 18:23)   письмо автору
 
   для: cheops   (07.06.2005 в 18:06)
 


session_start();
$num = "f";
if ($num === "f")
{        
    session_unregister(session_id()); 
    session_destroy();
    
    
}
echo "<a href = ляля>линк</a>";
?>

и так тоже показывает и наоборот
session_destroy();
session_unregister(session_id());
и так тоже нет

   
 
 автор: Akira   (07.06.2005 в 19:01)   письмо автору
 
   для: RV   (07.06.2005 в 18:23)
 


<?
if(session_start()) print 'Сессия успешно!!<br>';
if (empty(
$a) or empty($b))
    {
        
        if (
$_SESSION['a'] = "Это " AND $_SESSION['b'] = "Сессия") print 'Переменные зарегистрированы';
        print 
$_SESSION['a'].$_SESSION['b'];
    }
else
    {
        if(
session_destroy()) print 'Сессия успешно destroy!!';
        unset(
$_SESSION['a']);
        unset(
$_SESSION['b']);
        print 
$_SESSION['a'].$_SESSION['b'];
    }
?>

Странно, но у меня все ок.

   
 
 автор: Akira   (07.06.2005 в 19:01)   письмо автору
 
   для: RV   (07.06.2005 в 18:23)
 


<? 
session_start
(); 
$client_ip $_SERVER['REMOTE_ADDR']; 
$client_br $_SERVER['HTTP_USER_AGENT']; 

if (
$_SESSION['set'] === "true"// проверяем установлена ли ранее сессия 

     
    if ((
$client_ip === $_SESSION['client_ip']) AND ($client_br === $_SESSION['client_br'])) // если установлена то проверяем правильная ли она, т.е. не сделал ли ее юзер 
    

        echo 
"продолжаем сессию"
    } 
    else 
    { 
        
session_destroy(); // сессия кривая, наверно юзер хакер 
        
echo "сессия убита"
    } 

else  
// если сессия не стоит, то начинаем 

// проверяем куки, сверяемся с бд, если юзер опознан, то         

        if (
update($users_array['login']) === true// обновляем в бд время последнего посещения 
        

            
session_destroy(); 
            
session_start(); // начинаем новую сессию и заводим переменные 
            
$_SESSION['client_ip'] = $client_ip
            
$_SESSION['client_br'] = $client_br
            
$_SESION['set'] = "true"
         
        } 
        else 
        { 
            echo 
"Ошибка обновления даты"
        } 
    } 
    else 
    { 
        
session_destroy(); 
        echo 
"Юзер гость сессия уничтожена"
    }         


?>

А почему используеться такая проверка ? (update($users_array['login']) === true)
Мне казалось надо (update($users_array['login']) == true) или можно справить на
(if(update($users_array['login']))) ведь true булево значение...

   
 
 автор: Akira   (07.06.2005 в 19:06)   письмо автору
 
   для: Akira   (07.06.2005 в 19:01)
 

Вот , что я использовал для wap ONLINE.

<? 
include 'db/config.php';
@
session_start();
$id session_id();
if (empty(
$name)) $name 'Guest';
$query mysql_query("select count(*) FROM 'session' where 'id_session' like '".$id."'");
$otvet mysql_fetch_array($query);
if (
$otvet['count(*)'] == 1)
{
$query mysql_query("UPDATE 'session' SET 'date' = NOW(), 'user' = '".$name."' WHERE 'id_session' = '".$id."' LIMIT 1 ;");
}
else
{
$query mysql_query("INSERT INTO 'session' ( 'id_session' , 'user' , 'date' ) 
VALUES ('"
.$id."', '".$name."', NOW());");
}
$query mysql_query("DELETE FROM 'session' WHERE date < NOW( ) - INTERVAL '3' MINUTE LIMIT 1");

?>

Все работает...

   
 
 автор: RV   (07.06.2005 в 19:19)   письмо автору
 
   для: Akira   (07.06.2005 в 19:06)
 

Akira
у меня функция update возвращает тру или фолс (if ... return true else return false)
ну я так и проверяю.
а во вторых если скрипт работает и зенд не дает ошибок, то использую === вместо ==

   
 
 автор: Akira   (07.06.2005 в 19:37)   письмо автору
 
   для: RV   (07.06.2005 в 19:19)
 

Вы бы воложили полный листинг.
Так можно было бы проверить как работает у других.

   
 
 автор: RV   (08.06.2005 в 09:09)   письмо автору
 
   для: Akira   (07.06.2005 в 19:37)
 

стоп. а что с примером то?

<?
session_start
(); 
$num "f"
if (
$num === "f"
{         
    
session_unregister(session_id()); 
    
session_destroy(); 
     
     

echo 
"<a href = ляля>линк</a>"
?>

sid в линке так с первого раза и не убился

   
 
 автор: RV   (09.06.2005 в 16:40)   письмо автору
 
   для: RV   (08.06.2005 в 09:09)
 

Ну дык как в линк сессию то убить??

   
 
 автор: Akira   (09.06.2005 в 17:00)   письмо автору
 
   для: RV   (09.06.2005 в 16:40)
 

http://softtime.ru/forum/read.php?id_forum=1&id_theme=4520&page=1

   
 
 автор: RV   (09.06.2005 в 17:37)   письмо автору
 
   для: Akira   (09.06.2005 в 17:00)
 

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

   
Rambler's Top100
вверх

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