За последние 24 часа нас посетили 24453 программиста и 1656 роботов. Сейчас ищут 954 программиста ...

ErrorDocument 404 и сессии

Тема в разделе "PHP для новичков", создана пользователем kowapos, 12 фев 2013.

  1. kowapos

    kowapos Активный пользователь

    С нами с:
    18 янв 2013
    Сообщения:
    120
    Симпатии:
    0
    при наличии строки "ErrorDocument 404 /index.php" в файле .httacces
    сессия убивается, не знаю что делать.
    Может это из-за вида ссылок : /room/45156
    ____
    вот как работает сценарий:
    юзер нажимая на ссылку, попадает в файл, где скрипт дает ему подходящую ссылку, при этом назначая в переменную сессии его идентификатор (юзера), после этого всего, скрипт перенаправляет по ссылке, которую выдал. пользователь попадает по ней на страницу. на этой странице сессия еще работает, но если обновить, то сессия удаляется, и скрипт сообщает, что эта комната ему недоступна, так как идентификатор пуст.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    показывайте скрипты, чо. мож вы там криво с сессиями работаете.
     
  3. kowapos

    kowapos Активный пользователь

    С нами с:
    18 янв 2013
    Сообщения:
    120
    Симпатии:
    0
    ок, это в шапке
    Код (Text):
    1. session_start();
    2. session_name('sid');
    файл, где объявляются переменные сессии
    Код (Text):
    1. <?session_start();
    2. session_name('sid');
    3.  
    4. define('HOME', $_SERVER[DOCUMENT_ROOT]);
    5. include HOME.'/db.php';
    6.  
    7.  
    8.  
    9. $with = htmlspecialchars(trim($_GET["with"]));
    10.     switch ($with) {
    11.         case 'male':
    12.             $mysex = 'fame';
    13.             break;
    14.  
    15.         case 'fame':
    16.             $mysex = 'male';
    17.             break;
    18.        
    19.         default:
    20.             # code...
    21.             break;
    22.     }
    23.  
    24.     if(($with == 'male') || ($with == 'fame'))
    25.         {
    26.            
    27.             $time = time()-60*3;
    28.            
    29.             mysql_query  ("UPDATE `rooms` SET `status` = 'closed' WHERE `last_refresh_1` < $time");
    30.  
    31.                    
    32.  
    33.  
    34.             $query = mysql_query("SELECT `id_room` FROM `rooms` WHERE `creator` = '$with' and `status` = 'waiting'") or die (mysql_error());
    35.             $row = mysql_fetch_array($query);
    36.                 {
    37.                     if(isset($row["id_room"]))
    38.                         {
    39.                             $link = '/room/'.$row["id_room"];
    40.                             $_SESSION["id_user"] = rand(1,9999);
    41.                             $_SESSION["sex"] = $mysex;
    42.                             $_SESSION["persona"] = 'last_refresh_2';
    43.  
    44.  
    45.  
    46.                                 $id_room = $row["id_room"];
    47.                                 $id_user = $_SESSION["id_user"];
    48.  
    49.                             mysql_query  ("UPDATE `rooms` SET id_persona_2 = '$id_user', status = 'busy' WHERE `id_room` = $id_room");
    50.                            
    51.                         }
    52.                         else
    53.                             {
    54.                                 $new_room = rand(1,99999);
    55.                                 mysql_query("INSERT INTO `rooms`(creator, status, id_room)
    56.                                 VALUES ('$mysex', 'waiting', '$new_room')")or die("Invalid query: " . mysql_error());
    57.  
    58.                                 $query = mysql_query("SELECT `id_room` FROM `rooms` ORDER BY `id` DESC") or die (mysql_error());
    59.                                 $row = mysql_fetch_array($query);
    60.                                     {
    61.  
    62.                                         $link = '/room/'.$row["id_room"];
    63.                                         $_SESSION["id_user"] = rand(1,9999);
    64.                                         $_SESSION["sex"] = $mysex;
    65.                                         $_SESSION["persona"] = 'last_refresh_1';
    66.  
    67.  
    68.  
    69.  
    70.                                             $id_room = $row["id_room"];
    71.                                             $id_user = $_SESSION["id_user"];
    72.  
    73.                                         mysql_query  ("UPDATE `rooms` SET id_persona_1 = '$id_user' WHERE id_room = $id_room");
    74.                                     }
    75.                                
    76.                                                                                      
    77.                             }
    78.                 }
    79.         }
    80.  
    81.         header("Location: ".$link);?>
    это /index.php , главная страница, в ней убивается сессия
    Код (Text):
    1. session_destroy();
    2. $_SESSION["id_user"] = 'default';
    это все. в других файлах я просто использую эти переменные

    Добавлено спустя 4 минуты 30 секунд:
    Во втором куске кода, юзер получает ссылку комнаты "$link = '/room/'.$row["id_room"];" и с помощью редерикта переходит по ней, как только перешел сессия еще работает, но только стоит один раз обновить страницу, переменные обнуляются, и скрипт сообщает пользователю, что эта страница ему недоступна

    Добавлено спустя 6 минут 49 секунд:
    вот все манипуляции с переменными в файле комнаты, о котором я говорил выше
    Код (Text):
    1. $who_refresh = $_SESSION["persona"];
    2. $id_user = $_SESSION["id_user"];
    3. $sex = $_SESSION["sex"];
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    О, тут есть где поживиться )))
    session_name должен использоваться ДО session_start. значит у тебя он не работает, можно просто убрать.
    <?session_start(); это вообще может работать вот так, без пробела??? (у меня short_tags выключен по жизни и я не хочу и не буду перенастраивать) сделай
    <?php session_start(); хуже точно не будет
    Код (Text):
    1. session_destroy();
    2. $_SESSION["id_user"] = 'default';
    это тоже не будет работать. если надо поместить что-то в $_SESSION после дестроя, надо перед этим ЗАНОВО сделать session_start(), иначе не никуда не сохранится
     
  5. kowapos

    kowapos Активный пользователь

    С нами с:
    18 янв 2013
    Сообщения:
    120
    Симпатии:
    0
    сделал именно так, и выбило ошибку Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\blind\www\locations\head.php:25) in Z:\home\blind\www\index.php on line 6

    как я понял, из за того, что в шапке, то есть выше кода, уже была вызвана сессия?

    Добавлено спустя 11 минут 13 секунд:
    ну а если в шапке сделано услувие "если текущая страница равна главной то сессия не открывает в шапке" и вот что получилось Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in Z:\home\blind\www\index.php on line 5
    пытается уничтожить сессию, которой нет
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Нет. "headers already sent" говорит о том, что уже пошел вывод тела страницы и заголовки слать поздно. То есть сессию в этом месте не стартовать, а т.к. старая сессия уже уничтожена, то данные не сохранятся. Полный и безоговорочный п*ц!

    Добавлено спустя 2 минуты 49 секунд:
    Это ошибка проектирования. Когда формирование тела страницы вынесено в отдельное "представление", такого нагромождения ошибок не возникает.