|
|
|
| помогите разобраться.
далаю автоирзацию на php. логика проста собираю сессию делаю ключ, записываю в бд, при следующем посещении проверяю существует ли совпадает ли ключ у пользователя.
возникла проблема при добавлении в бд - записавается 2 строки, одна текущей сессии та которая и нужна, и вторая непонятно откуда взявшаяся. начал копаться дальше слал использовать в место ключа просто session_id() в итоге тоже самое.
начал проверять файлы сессий, оказавается что при любом обращении к странице создается 2 файла sess_* первый с текущей сессией, второй еще одна только откуда она берется так и не понял.
такой глюк даже на самых простых скриптах типа этого http://softtime.ru/scripts/online.php, и этот глюк только в опере. ie, ff, хром все норм.
думал глючит апапач или винда перенес все на vps (сентос5) итория таже, при обращении к странице через оперу задваивается сессия и запись в бд
помогите люди добрые, я даж уже не знаю куда копать, незнаю даж в тот ли раздел написал, перенесите если не туда.
версия оперы последняя 10.63, webserver апач денвера php5/mysql5, ос win7 ultimate (64). | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 10:24)
| | Это не глюк сессий, а скорее вашего кода. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 10:26)
| | тогда почему этот же скрипт работает также http://softtime.ru/scripts/online.php ?
думаю разработчики этого сайта его бы не вылажили будь в нем такой глюк
и почему этот глюк только в браузере опера, почему его нет в ff например? | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 10:30)
| | Ага, чуть что, так сразу виноват РНР, браузеры и т.п.. Может сперва разберетесь в скрипте своем? | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 11:00)
| | http://softtime.ru/scripts/online.php вот тут код скрипта, подскажи где ошибка? | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 11:05)
| | Я знаю одно точно - сама по себе сессия не рождается, если ее не стартовать автоматически, а в остальном проверяйте логику своего скрипта. Как вы построили ее, так оно и будет работать. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 11:11)
| | ну я понимаю что ты это знаешь, но ты можешь ответить на конкретный вопрос:
вот ссылка на код которы опудлкован в разделе примеры скриптов на этом сайте
http://softtime.ru/scripts/online.php
откуда в нем такой глюк? при том что я его не писал а скопировал
или ты только флудить можешь о том какой ты крутой кодер а все остальные писать не умеют | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 11:17)
| | Я не знаю от куда у вас это проблема, и смотреть этот код мне некогда, но то что сама по себе, как по щучьему велению сессия не появится, в этом я уверен. Проверяйте и анализируйте работу своего сценария полностью, а не части кода, который вы где-то взяли. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 11:22)
| | ну так если незнаете и лень лень открыть ссылку посмотреть простой код, так и не флудите попусту. я же не писал что только мой скрипт глючит, а привел сразу пример и друго кода который по сути делает тоже самое и полусает такой глюк | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 11:26)
| | Значит так, у меня без вашего кода хватает работы. А вот вам лень проверять свое точно, анализировать, а тем более простой код. Уж 100% точно, что РНР и еже с ним, делает только то, чего вы от него просите, и ни грамма больше.
А почему мне бывает некогда, это уже мои заботы, и оправдываться перед вами я не обязан. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 11:35)
| | былобы некогда, и если бы внимательно читали, заметили бы что я проверял не только свой код, и не только на своем локальном ПО, и неписали бы попустусту | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 12:01)
| | Значит не все проверили, ибо не могут быть глюки сессии как таковой, могут быть глюки только в коде (вашем, чужом) самом или общей логике работы всего сценария. Чего я вам и сказал. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 12:14)
| | такой же глюк у меня в simpla, ls, webassyst в дефолтных версиях, без каких либо изменений в скриптах, с тем отличием что в них нет хранения сессий в БД но вотрой файл sess_* тоже создается. так что это не только мой скрипт | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 12:27)
| | По своей инициативе сессия создаваться не может, значит надо искать причину. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 13:03)
| | ну вот скрипт который тут выложен в разделе примеры:
<?PHP
// Начинаем сессию
session_start();
include "config.php";
// Получаем уникальный id сессии
echo $id_session = session_id();
// Устанавливаем соединение с базой данных
// Проверяем, присутствует ли такой id в базе данных
$query = "SELECT * FROM session
WHERE id_session = '$id_session'";
$ses = mysql_query($query);
if(!$ses) exit("<p>Ошибка в запросе к таблице сессий</p>");
// Если сессия с таким номером уже существует,
// значит пользователь online - обновляем время его
// последнего посещения
if(mysql_num_rows($ses)>0)
{
$query = "UPDATE session SET putdate = NOW(),
user = '$_SESSION[user]'
WHERE id_session = '$id_session'";
mysql_query($query);
}
// Иначе, если такого номера нет - посетитель только что
// вошёл - помещаем в таблицу нового посетителя
else
{
$query = "INSERT INTO session
VALUES('$id_session', NOW(), '$_SESSION[user]')";
if(!mysql_query($query))
{
echo $query."<br>";
echo "<p>Ошибка при добавлении пользователя</p>";
exit();
}
}
// Будем считать, что пользователи, которые отсутствовали
// в течении 20 минут - покинули ресурс - удаляем их
// id_session из базы данных
$query = "DELETE FROM session
WHERE putdate < NOW() - INTERVAL '20' MINUTE";
mysql_query($query);
// Устанавливаем соединение с базой данных
include "config.php";
// Выводим имена всех посетителей, записи о которых имеются
// в таблице session
$query = "SELECT * FROM session";
$ath = mysql_query($query);
if(!$ath) exit("<p>Ошибка в запросе к таблице сессий</p>");
// Если хоть кто-то есть - выводим таблицу
if(mysql_num_rows($ath)>0)
{
echo "<table>";
while($author = mysql_fetch_array($ath))
{
// Если посетитель не зарегистрирован
// выводим вместо его имени - "аноним"
if(empty($author['user'])) echo "<tr><td>аноним</td></tr>";
else echo "<tr><td>".$author['user']."</td></tr>";
}
echo "</table>";
}
?>
|
по коду ни второго вызова сессии ни второго вызова inserta нет.
а вот в логе mysql есть
Time Id Command Argument
101013 13:15:41 1 Connect root@localhost on
1 Init DB upbaseru
1 Query SELECT VERSION()
1 Query SET NAMES 'cp1251'
/*первый раз смотрит сессию в бд */
1 Query SELECT * FROM session
WHERE id_session = '55fd38c5c8b788b23969df7eb8e0a13f'
/*и добавляет запись если таковой нет */
1 Query INSERT INTO session
VALUES('55fd38c5c8b788b23969df7eb8e0a13f', NOW(), '')
1 Query DELETE FROM session
WHERE putdate < NOW() - INTERVAL '20' MINUTE
1 Init DB upbaseru
1 Query SELECT VERSION()
1 Query SET NAMES 'cp1251'
1 Query SELECT * FROM session
1 Quit
2 Connect root@localhost on
2 Init DB upbaseru
2 Query SELECT VERSION()
2 Query SET NAMES 'cp1251'
/* ворой раз смотрит сессию НО УЖЕ С ДРУГИМ ID хотя по коду скрипта ид неменяется */
2 Query SELECT * FROM session
WHERE id_session = 'e5680d18fe94d4067cf22eecfbd04e3f'
/* и добавляет его ХОТЯ второго инсерта в скрипте тоже нет */
2 Query INSERT INTO session
VALUES('e5680d18fe94d4067cf22eecfbd04e3f', NOW(), '')
2 Query DELETE FROM session
WHERE putdate < NOW() - INTERVAL '20' MINUTE
2 Init DB upbaseru
2 Query SELECT VERSION()
2 Query SET NAMES 'cp1251'
2 Query SELECT * FROM session
2 Quit
|
откуда берется этот второй SID и второй интсерт
а вот лог если листать страницы IE
101013 13:30:22 29 Connect root@localhost on
29 Init DB upbaseru
29 Query SELECT VERSION()
29 Query SET NAMES 'cp1251'
29 Query SELECT * FROM session
WHERE id_session = '97d94e98600f10597a28ff8d1063c5c7'
29 Query UPDATE session SET putdate = NOW(),
user = 'ololo'
WHERE id_session = '97d94e98600f10597a28ff8d1063c5c7'
29 Query DELETE FROM session
WHERE putdate < NOW() - INTERVAL '20' MINUTE
29 Init DB upbaseru
29 Query SELECT VERSION()
29 Query SET NAMES 'cp1251'
29 Query SELECT * FROM session
29 Quit
101013 13:49:02 30 Connect root@localhost on
30 Init DB upbaseru
30 Query SELECT VERSION()
30 Query SET NAMES 'cp1251'
30 Query SELECT * FROM session
WHERE id_session = '97d94e98600f10597a28ff8d1063c5c7'
30 Query UPDATE session SET putdate = NOW(),
user = 'ololo'
WHERE id_session = '97d94e98600f10597a28ff8d1063c5c7'
30 Query DELETE FROM session
WHERE putdate < NOW() - INTERVAL '20' MINUTE
30 Init DB upbaseru
30 Query SELECT VERSION()
30 Query SET NAMES 'cp1251'
30 Query SELECT * FROM session
|
и в нем id не меняется и соответственно второго инсерта нет | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 13:35)
| | Вот это, с выброшенным второстепенным, во всех браузерах, включая и Опера конечно, работает без добавления лишней сессии.
<?
session_start();
$id_session = session_id();
$ses = mysql_query("SELECT * FROM session WHERE id_session = '$id_session'");
if(mysql_num_rows($ses)) echo "Yes<br>";
else mysql_query("INSERT INTO session VALUES('$id_session')");
$ath = mysql_query("SELECT * FROM session");
if(mysql_num_rows($ath)) {
while($author = mysql_fetch_assoc($ath)) echo $author['id_session'] . "<br>";
}
|
Если запись новой, значит прерывается старая и создается новая, которую можно проверить, заглянув в temp каталог. Проверьте заголовки браузера, чего он у вас отсылает. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 14:55)
| | попробовал твой код - тоже дергает второй SID и тоже только опера. и заглянув в temp также второй sess_* создается
в принципе я у себя решил проблему, слелал куками, и генерю ей SID скриптом, вот просто интересно что дергает и меняет SID, и почему только опера. | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 15:08)
| | Объяснение только одно - теряется сессия. Надо заголовки проанализировать. | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 15:23)
| | РЕШЕНО : смотрим заголовки отправляемые оперой и вычисляем что их меняет, у меня антривить, конкретнее avast. Осталось разобраться что именнов в нем меняет заголовок браузера, и почему только оперы.
благодарю Sim5 что направил в нужное русло | |
|
|
|
|
|
|
|
для: sim5
(13.10.2010 в 14:55)
| | если смотреть переменные $_SERVER, $GLOBAL, то они всегда идентичные SID в них тот что нужно, а вот если сторонним по смотреть то пока не могу ибо на работе, и тут ниче подобного нет | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 15:22)
| | ты заметил-ты 7 раз обьяснил одно и тоже,распинался,умолял,а в итоге тебе написали,типа "код кривой"...и молчат. | |
|
|
|
|
|
|
|
для: aibolit
(13.10.2010 в 10:24)
| | del* | |
|
|
|