За последние 24 часа нас посетили 19545 программистов и 1607 роботов. Сейчас ищут 919 программистов ...

сессии ведут себя очень странно

Тема в разделе "Прочие вопросы по PHP", создана пользователем staromand, 8 мар 2012.

  1. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    в общем есть такой файл, который проверяет при загрузке страницы "index.php", залогинен ли пользователь

    этот файл включен в "index.php"
    Код (PHP):
    1. <?php
    2. if (isset($_GET['out'])) {
    3.     unset($_SESSION['login']);
    4.     unset($_SESSION['id']);
    5.     setcookie("login", "", 100);
    6.     setcookie("id", "", 100);
    7. };
    8. if (!isset($_SESSION['login']) or !isset($_SESSION['id'])) {
    9.     unset($const_logined);
    10.     };
    11. if (empty($_SESSION['login']) or empty($_SESSION['id'])) {
    12.     $const_logined = FALSE;
    13. } else {
    14.     $const_logined = TRUE;
    15. };
    16. ?>
    а также есть файл, который проверяет при вводе логина с паролем валидность введенных данных и ищет по базе нужный "id"

    Код (PHP):
    1. <html>
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html" charset="windows-1251"/>
    4. <link rel="stylesheet" href="../style.css" type="text/css">
    5. <title>Добро пожаловать! - firstsite</title>
    6. </head>
    7. <body>
    8. <div id="ref">
    9. <?php
    10.  
    11. if (isset($_POST['login'])) {
    12.     $login = $_POST['login'];
    13.     if ($login == '') {
    14.         unset($login);
    15.     };
    16. };
    17.  
    18. if (isset($_POST['password'])) {
    19.     $password=$_POST['password'];
    20.     if ($password =='') {
    21.         unset($password);
    22.     };
    23. };
    24.  
    25. if (empty($login) or empty($password)) {
    26.     exit ("<div id=\"ref_err\">Вы ввели не всю информацию, вернитесь <a href='../index.php'>назад</a> и заполните все поля!</div>");
    27. };
    28.  
    29. include ("dbase.php");
    30.  
    31. $login = stripslashes($login);
    32. $login = mysql_escape_string($login);
    33. $login = htmlspecialchars($login);
    34. $login = trim($login);$password = stripslashes($password);
    35. $password = mysql_escape_string($password);
    36. $password = htmlspecialchars($password);
    37. $password = trim($password);
    38. $password = md5($password);
    39. $query = "
    40. SELECT `login`, `password`, `id`
    41. FROM `usersdb`
    42. WHERE `login` = '{$login}'
    43. ";
    44. $result = mysql_query($query, $db);
    45. $myrow = mysql_fetch_assoc($result);
    46. if (empty($myrow['password'])) {
    47.     exit ("<div id=\"ref_err\">Извините, введённое вами имя пользователя или пароль неверны. <a href='../index.php'>Главная страница</a></div>");
    48. } else {
    49.     if ($myrow['password']==$password) {
    50.         $_SESSION['login']=$myrow['login']; 
    51.         $_SESSION['id']=$myrow['id'];
    52.         if(isset($_POST['savelogin'])) {
    53.             //setcookie("login", $_SESSION['login'], time() + 60*60*24*30);
    54.             //setcookie("id", $_SESSION['id'], time() + 60*60*24*30);
    55.         };
    56.         header('Refresh: 3; URL=../index.php');
    57.         echo "<div id=\"ref_ok\">Вы вошли! Через 2 сек. вы будете перенаправлены на главную страницу.<br>Если Ваш браузер не поддерживает автоматическое перенаправление, перейдите по <a href=\"../index.php\">этой ссылке</a></div>";
    58.     } else {
    59.         exit ("<div id=\"ref_err\">Извините, введённый вами login или пароль неверный. <a href='../index.php'>Главная страница</a></div>");
    60.     };
    61. };
    62. ?>
    63. </div>
    64. </body>
    65. </html>
    при входе шаблон входа сменяется с такого вида:
    [​IMG]
    на такой:
    [​IMG]

    это наглядный индикатор того, вошел или нет

    вопрос - почему, когда сразу вхожу он работает на ура, а как только уже под сессией прохожу по какой-либо странице внутри сайта форма ввода показывается (как будто не залогинен)? вся мистика в том, что когда ЕЩЁ РАЗ прохожу по любой ссылке - формы нет. Видно, что я вошел на протяжении всей сессии вплоть до выхода.
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Толком не вникал в суть вопроса, как-то сразу попался на глаза такой момент:

    Код (PHP):
    1. <html>
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html" charset="windows-1251"/>
    4. <link rel="stylesheet" href="../style.css" type="text/css">
    5. <title>Добро пожаловать! - firstsite</title>
    6. </head>
    7. <body>
    8. <div id="ref">
    9. <?php
    В общем, приведённый выше фрагмент кода работать не должен. Функция session_start(), как и любая другая функция, работающая с HTTP-заголовками (например, setcookie()) должна вызываться ДО любого вывода в браузер.
     
  3. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    тут Вы правы, это знаю, тупанул
    я вывожу вообще HTML здесь для красоты, это типа страницы редиректа
    проблема не здесь
    если бы он не допускал сессии до вывода в браузер, то не допускал бы их сразу, а так - сначала работает, затем пропадают сессии, затем опять появляются

    сначала я HTML вообще не писал, всё так и функционировало криво
     
  4. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    прошу помощи у знающих людей
    уже перерыл весь код, не разберусь никак
    спасибо
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    куки тебе не нужны, родной. сессии хватит выше крыши. пляши от сессии и не парься.
     
  6. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    я куки и не использую
    setcookie() - это задел на будущее
    пока не реализовано
    прочитайте, пожалуйста, вопрос внимательно и станет понятно, в чем проблема
     
  7. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Ну приведи неработающий код, с учетом того что собачник тебе написал
     
  8. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    да причем здесь то, что собачник сказал?
    раньше HTML не было у меня на этих страницах вообще, работало также
    тоже самое, только сверху
    Код (Text):
    1. <?php session_start(); ?>
    работает также
     
  9. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    Если у вас там так дико сессии везде используются оградите свои
    session_name('имя');
    А вообще просто внутри в файле у вас нет где то вызова сессии и усе а сессия сохранена и поэтому при попадании на страницу там вызов есть она срабатывает..
    Либо на одном из файлов там что то до вызовы сессии в этом всем и копайте...
     
  10. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    сессии используются не дико, как обычно
    весь сайт начинается с index.php, где сессии сразу стартуют

    Код (PHP):
    1. <?php
    2. ini_set('display_errors',1);
    3.     error_reporting(E_ALL);
    4. require_once('system/config.php');
    5. require_once('system/logincheck.php');
    6. ?>
    7.  
    8. <html  xmlns="http://www.w3.org/1999/xhtml">
    9. ...
    10. ..
    11. .
    короче, вот видео

    снял, так даже попроще будет вам разобраться
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Если сессии действительно стартуют и куки ставятся - то по идее должно работать. Думаю, ошибка где-то в другом месте. Как, например, проверяется, залогинен ли пользователь (в том месте, в котором выводится либо форма авторизации либо кнопка "Выход")?

    И ещё: на превью к видео видны Warning-и и Notice-ы. Что там написано? Оно не имеет отношение к этой ошибке?
     
  12. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    куки пока не использую, это будет чекбокс "Запомнить меня"

    в общем есть такой файл, который проверяет при загрузке страницы "index.php", залогинен ли пользователь

    этот файл включен в "index.php"
    Код (PHP):
    1. <?php
    2. if (isset($_GET['out'])) {
    3.     unset($_SESSION['login']);
    4.     unset($_SESSION['id']);
    5.     setcookie("login", "", 100);
    6.     setcookie("id", "", 100);
    7. };
    8. if (!isset($_SESSION['login']) or !isset($_SESSION['id'])) {
    9.     unset($const_logined);
    10.     };
    11. if (empty($_SESSION['login']) or empty($_SESSION['id'])) {
    12.     $const_logined = FALSE;
    13. } else {
    14.     $const_logined = TRUE;
    15. };
    16. ?>
    а остальные подключенные скрипты используют уже переменную $const_logined как проверку авторизации

    Код (PHP):
    1. <?php
    2. if ($const_logined == TRUE) {
    3. include('system/auth/logined.php');
    4. } else {
    5. include('system/auth/unauth.php');
    6. };
    7. ?>
    ошибки и предупреждения на видео не имеют отношения к этой проблеме
    это там проверка одна недоработанная, но она не мешает
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Может ту страничку, на которую редирект идёт, браузер достаёт из кэша? Попробуй при редиректе добавь какую-нибудь лабуду типа

    "index.php?random=" . rand();
     
  14. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    это помогло, спасибо большое
    интересно, у меня GET-переменная-идентификатор контента на правой части сайта называется "id"
    когда вставляю при редиректе рэндомное значение именно в "id", то всё отлично получается
    а когда заменяю его на любое другое имя, то, естесственно, это имя нигде не обрабатывается и все случается как и раньше, как показано на видео

    поскольку не очень опытен ещё в PHP - не мог бы и додуматься до этого сам
    можете объяснить, почему так происходит?
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну тут даже не в PHP дело, а в браузере. Он просто "смотрит", что недавно заходил на страничку с адресом "index.php?id=main" и даже не делает запрос на сервер. Она же у него в памяти уже есть с таким адресом - он её же тебе снова и показывает. Браузер какой?
    Можно ставить специальные http-заголовки, чтобы запретить браузеру кэшировать ("запоминать") странички, чтобы он каждый раз заново делал запрос на сервер и отображал ответ.
     
  16. staromand

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

    С нами с:
    8 мар 2012
    Сообщения:
    10
    Симпатии:
    0
    chrome
    ок, с заголовками разберусь
    спасибо Вам и вашему форуму!
     
  17. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    так еще настроить надо. по умолчанию браузерам запрещено кешировать если есть данные GET или POST. в случае с пост - обязательна повторная отправка. в случае с GET - как минимум запрос из группы IF-*.
     
  18. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Я вот че думаю. Подход с видео мне понравился. Куда-то бы в топик о ламерстве добавить. :) Пусть остальные страждущие тоже фильмуют свою проблему на видео. А если девчонки - то снимать на камеру не код, а .... ну вы поняли :) [​IMG]
    Это существенно ускорит поиск проблемы)))