|
|
|
|
<?
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 | |
|
|
|
|
|
|
|
для: RV
(04.06.2005 в 22:38)
| | А вы выведите дамп $_SESSION и посмотрите что в нём?
<?php
print_r($_SESSION);
?>
|
| |
|
|
|
|
|
|
|
для: 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 )
|
т.е. как я и предпологал сессия стартует сначала. а должна продолжатся... | |
|
|
|
|
|
|
|
для: RV
(05.06.2005 в 07:28)
| | А поместите
<?php
print_r($_SESSION);
?>
|
под первым session_start - массив пустой? | |
|
|
|
|
|
|
|
для: cheops
(05.06.2005 в 12:35)
| | да. первый пуст
Array() | |
|
|
|
|
|
|
|
для: RV
(05.06.2005 в 12:55)
| | А версия PHP какая и если несложно приведите секцию [Session] файла php.ini. | |
|
|
|
|
|
|
|
для: 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"
|
| |
|
|
|
|
|
|
|
для: RV
(05.06.2005 в 13:19)
| | А в URL точно PHPSESSID= появляется? А почему через сессионные cookie не хотите SID отправлять? | |
|
|
|
|
|
|
|
для: 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 секунды к примеру?
и еще. если у юзера куки отключены, то сначала надо проверять сессию. если ее нет, то проверять куки. если и кук нет, то выдавать юзеру форму авторизации и после успешной авторизации пытатся ставить куки, а если это нельзя, то начинать сессии. как я понимаю | |
|
|
|
|
|
|
|
для: RV
(05.06.2005 в 14:29)
| | Переделал настройки на ваши - у меня всё работает... может у вас сессии на сервере не сохраняются... Попробуйте явно прописать в php.ini путь к папке, где будут хранится сессии
session.save_path = "C:/tmp"
|
и посмотрите - они там появляются или нет? | |
|
|
|
|
|
|
|
для: cheops
(05.06.2005 в 15:54)
| | вроде сессии сохраняются в C:\Temp (в винде настроена папка для верменных файлов через переменные окружения). много файлов типа sess_0j83mkmdmti1p4pujivt053r66.
изменил php.ini - save - reboot.
захожу на http://localhost/site/ - Стартуем новую сессию. давлю в бровзере Обновить - Стартуем новую сессию.
однако все ссылки с приставкой phpsessid=... и если нажать на ссылку http://localhost/site/?PHPSESSID=bgarg7iuv4ds9lfcmekv8ojv92 (перейти на главную) , то все ок. Продолжаем сессию. и если давить обновить, то тоже продолжаем сессию. а как сделать чтобы с первого рефреша в бровзере было продолжение сессии а не старт новой?? | |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(05.06.2005 в 16:47)
| | сессионные куки. а можно по подробнее? и включены ли они на хостинге (в большинстве)? иначе зачем их делать.
а если куки отключены у пользователя. будут ли работать сессионные куки? | |
|
|
|
|
|
|
|
для: RV
(05.06.2005 в 16:52)
| | На севере они будут включены практически 100%, сессионные куки, в отличие от обычных не сохраняются на жёстком диске пользователя, а хранятся в памяти, поэтому их отключают реже, да и обычные куки включены у 95-98 % посетителей, но если они отключены, то такая схема работать не будет. Иногда прибегают к следующему варианту - проверяют включены ли куки у посетителя и если включены то SID, через URL не передают, а если отключены, то передают SID, но это сильно усложняет код и увеличивает вероятность ошибки. | |
|
|
|
|
|
|
|
для: cheops
(05.06.2005 в 20:32)
| | а если session.use_cookies = 1
и session.use_only_cookies = 0
то если куки включены. сид передается в куках, а если куки выключены, то сид передается в урле. и все это php делает автоматом. разве нет? | |
|
|
|
|
|
|
|
для: RV
(05.06.2005 в 20:56)
| | Сейчас может и делает, раньше помоему в ручную писать нужно было SID в каждой ссылке... | |
|
|
|
|
|
|
|
для: cheops
(05.06.2005 в 21:03)
| | да нет. кажись делает. у меня ссылки простые. в коде никаких . $sid . нету. а переделываются когда куков нет | |
|
|
|
|
|
|
|
для: RV
(06.06.2005 в 03:48)
| | а как полностью убить сессию затереть все данные и все все все??
<?
session_start();
$num = "f";
if ($num === "f")
{
session_destroy();
echo "уничтожили сессию";
}
echo "<a href = ляля>линк</a>";
?>
|
сдесь при первом заходе линк будет с сидом. а если обновить страницу, то сид пропадет. а как убить сессию, чтобы сид вообще не появлялся? но сессию все равно надо стартовать, т.к. будет много if ....else | |
|
|
|
|
|
|
|
для: RV
(07.06.2005 в 14:25)
| | Чтобы SID вообще не появлялся у вас в скрипте не должна вызываться функция session_start() - поставьте какое-нибудь условие на вызов этой функции... | |
|
|
|
|
|
|
|
для: cheops
(07.06.2005 в 17:20)
| | т.е. полностью убить sid после старта сессии уже нельзя? | |
|
|
|
|
|
|
|
для: RV
(07.06.2005 в 17:42)
| | Нет почему можно, применяя функции session_destroy() и очищая суперглобальный массив $_SESSION при помощи функции unset()
<?php
unset($_SESSION);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.06.2005 в 17:48)
| |
<?
.....
{ unset($_SESSION);
session_destroy();
echo "уничтожили сессию";
}
....
?>
|
и наоборот пробовал. сид все равно остается | |
|
|
|
|
|
|
|
для: RV
(07.06.2005 в 18:01)
| | Попробуйте вместо unset применить к каждой переменной сессии функцию session_unregister() - чего-нибудь получается? | |
|
|
|
|
|
|
|
для: 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());
и так тоже нет | |
|
|
|
|
|
|
|
для: 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'];
}
?>
|
Странно, но у меня все ок. | |
|
|
|
|
|
|
|
для: 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: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");
?>
|
Все работает... | |
|
|
|
|
|
|
|
для: Akira
(07.06.2005 в 19:06)
| | Akira
у меня функция update возвращает тру или фолс (if ... return true else return false)
ну я так и проверяю.
а во вторых если скрипт работает и зенд не дает ошибок, то использую === вместо == | |
|
|
|
|
|
|
|
для: RV
(07.06.2005 в 19:19)
| | Вы бы воложили полный листинг.
Так можно было бы проверить как работает у других. | |
|
|
|
|
|
|
|
для: 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
(08.06.2005 в 09:09)
| | Ну дык как в линк сессию то убить?? | |
|
|
|
|
|
|
|
для: RV
(09.06.2005 в 16:40)
| | http://softtime.ru/forum/read.php?id_forum=1&id_theme=4520&page=1 | |
|
|
|
|
|
|
|
для: Akira
(09.06.2005 в 17:00)
| | session_destroy() не убивает сид. линк в первый раз идет с сидом. а если обновить страницу, то уже без сида. а надо чтоб сразу шел без сида. | |
|
|
|