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

Форум PHP

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

 

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

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

тема: Странный глюк с сессиями
 
 автор: aibolit   (13.10.2010 в 10:24)   письмо автору
 
 

помогите разобраться.
далаю автоирзацию на php. логика проста собираю сессию делаю ключ, записываю в бд, при следующем посещении проверяю существует ли совпадает ли ключ у пользователя.
возникла проблема при добавлении в бд - записавается 2 строки, одна текущей сессии та которая и нужна, и вторая непонятно откуда взявшаяся. начал копаться дальше слал использовать в место ключа просто session_id() в итоге тоже самое.

начал проверять файлы сессий, оказавается что при любом обращении к странице создается 2 файла sess_* первый с текущей сессией, второй еще одна только откуда она берется так и не понял.

такой глюк даже на самых простых скриптах типа этого http://softtime.ru/scripts/online.php, и этот глюк только в опере. ie, ff, хром все норм.

думал глючит апапач или винда перенес все на vps (сентос5) итория таже, при обращении к странице через оперу задваивается сессия и запись в бд

помогите люди добрые, я даж уже не знаю куда копать, незнаю даж в тот ли раздел написал, перенесите если не туда.

версия оперы последняя 10.63, webserver апач денвера php5/mysql5, ос win7 ultimate (64).

  Ответить  
 
 автор: sim5   (13.10.2010 в 10:26)   письмо автору
 
   для: aibolit   (13.10.2010 в 10:24)
 

Это не глюк сессий, а скорее вашего кода.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 10:30)   письмо автору
 
   для: sim5   (13.10.2010 в 10:26)
 

тогда почему этот же скрипт работает также http://softtime.ru/scripts/online.php ?
думаю разработчики этого сайта его бы не вылажили будь в нем такой глюк
и почему этот глюк только в браузере опера, почему его нет в ff например?

  Ответить  
 
 автор: sim5   (13.10.2010 в 11:00)   письмо автору
 
   для: aibolit   (13.10.2010 в 10:30)
 

Ага, чуть что, так сразу виноват РНР, браузеры и т.п.. Может сперва разберетесь в скрипте своем?

  Ответить  
 
 автор: aibolit   (13.10.2010 в 11:05)   письмо автору
 
   для: sim5   (13.10.2010 в 11:00)
 

http://softtime.ru/scripts/online.php вот тут код скрипта, подскажи где ошибка?

  Ответить  
 
 автор: sim5   (13.10.2010 в 11:11)   письмо автору
 
   для: aibolit   (13.10.2010 в 11:05)
 

Я знаю одно точно - сама по себе сессия не рождается, если ее не стартовать автоматически, а в остальном проверяйте логику своего скрипта. Как вы построили ее, так оно и будет работать.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 11:17)   письмо автору
 
   для: sim5   (13.10.2010 в 11:11)
 

ну я понимаю что ты это знаешь, но ты можешь ответить на конкретный вопрос:
вот ссылка на код которы опудлкован в разделе примеры скриптов на этом сайте

http://softtime.ru/scripts/online.php

откуда в нем такой глюк? при том что я его не писал а скопировал
или ты только флудить можешь о том какой ты крутой кодер а все остальные писать не умеют

  Ответить  
 
 автор: sim5   (13.10.2010 в 11:22)   письмо автору
 
   для: aibolit   (13.10.2010 в 11:17)
 

Я не знаю от куда у вас это проблема, и смотреть этот код мне некогда, но то что сама по себе, как по щучьему велению сессия не появится, в этом я уверен. Проверяйте и анализируйте работу своего сценария полностью, а не части кода, который вы где-то взяли.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 11:26)   письмо автору
 
   для: sim5   (13.10.2010 в 11:22)
 

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

  Ответить  
 
 автор: sim5   (13.10.2010 в 11:35)   письмо автору
 
   для: aibolit   (13.10.2010 в 11:26)
 

Значит так, у меня без вашего кода хватает работы. А вот вам лень проверять свое точно, анализировать, а тем более простой код. Уж 100% точно, что РНР и еже с ним, делает только то, чего вы от него просите, и ни грамма больше.
А почему мне бывает некогда, это уже мои заботы, и оправдываться перед вами я не обязан.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 12:01)   письмо автору
 
   для: sim5   (13.10.2010 в 11:35)
 

былобы некогда, и если бы внимательно читали, заметили бы что я проверял не только свой код, и не только на своем локальном ПО, и неписали бы попустусту

  Ответить  
 
 автор: sim5   (13.10.2010 в 12:14)   письмо автору
 
   для: aibolit   (13.10.2010 в 12:01)
 

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

  Ответить  
 
 автор: aibolit   (13.10.2010 в 12:27)   письмо автору
 
   для: sim5   (13.10.2010 в 12:14)
 

такой же глюк у меня в simpla, ls, webassyst в дефолтных версиях, без каких либо изменений в скриптах, с тем отличием что в них нет хранения сессий в БД но вотрой файл sess_* тоже создается. так что это не только мой скрипт

  Ответить  
 
 автор: sim5   (13.10.2010 в 13:03)   письмо автору
 
   для: aibolit   (13.10.2010 в 12:27)
 

По своей инициативе сессия создаваться не может, значит надо искать причину.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 13:35)   письмо автору
 
   для: 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 не меняется и соответственно второго инсерта нет

  Ответить  
 
 автор: sim5   (13.10.2010 в 14:55)   письмо автору
 
   для: 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 каталог. Проверьте заголовки браузера, чего он у вас отсылает.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 15:08)   письмо автору
 
   для: sim5   (13.10.2010 в 14:55)
 

попробовал твой код - тоже дергает второй SID и тоже только опера. и заглянув в temp также второй sess_* создается

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

  Ответить  
 
 автор: sim5   (13.10.2010 в 15:23)   письмо автору
 
   для: aibolit   (13.10.2010 в 15:08)
 

Объяснение только одно - теряется сессия. Надо заголовки проанализировать.

  Ответить  
 
 автор: aibolit   (13.10.2010 в 17:09)   письмо автору
 
   для: sim5   (13.10.2010 в 15:23)
 

РЕШЕНО : смотрим заголовки отправляемые оперой и вычисляем что их меняет, у меня антривить, конкретнее avast. Осталось разобраться что именнов в нем меняет заголовок браузера, и почему только оперы.

благодарю Sim5 что направил в нужное русло

  Ответить  
 
 автор: aibolit   (13.10.2010 в 15:22)   письмо автору
 
   для: sim5   (13.10.2010 в 14:55)
 

если смотреть переменные $_SERVER, $GLOBAL, то они всегда идентичные SID в них тот что нужно, а вот если сторонним по смотреть то пока не могу ибо на работе, и тут ниче подобного нет

  Ответить  
 
 автор: LLLLLL   (15.10.2010 в 22:57)   письмо автору
 
   для: aibolit   (13.10.2010 в 15:22)
 

ты заметил-ты 7 раз обьяснил одно и тоже,распинался,умолял,а в итоге тебе написали,типа "код кривой"...и молчат.

  Ответить  
 
 автор: makast   (16.10.2010 в 19:43)   письмо автору
 
   для: aibolit   (13.10.2010 в 10:24)
 

del*

  Ответить  
Rambler's Top100
вверх

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