Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сессии не приживаются. Проблема в скрипте авторизации 
V
    Опции темы
woin
Дата 22.4.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Пробовал написать скрипт авторизации на сессиях и MySQL.
Авторизация происходит, но при переходе на любую из ссылок она пропадает. :(
session_start();  запускаю,  и вроде всё верно делаю. Но не запоминаются сессии, хотя вообще сервер их поддерживает (со скриптом без MySQL проверял)
Вот код. Может получится найти ошибку?
Код

<?php
// if (isset($_REQUEST[session_name()])) session_start();  //запускаем сессию.
//include "conekt.php";
session_start();

if($bs=='quit')
{
    //$_SESSION=0;
}

?>

<?php

if(( $_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['blogin'] )) and ($_SESSION['sess_id']==0) )
  {
   if( empty( $_POST['name'] ) || empty( $_POST['pass'] ) )
   {$err_login = "Логин и/или пароль не введены";   }
     else
     {
     $names_user = substr($HTTP_POST_VARS["name"],0,16);
     $names_user = htmlspecialchars(stripslashes($names_user)); // обрабатываем имя
     $pas_user = substr($HTTP_POST_VARS["pass"],0,16);
     $pas_user = htmlspecialchars(stripslashes($pas_user)); // обрабатываем пароль
     connect();       //Подключаемся к БД
      // Ищем пользователя с указанным именем и паролем

       $result = mysql_query( 'SELECT * FROM auth_members WHERE name = \''.mysql_escape_string($names_user).'\' AND password = \''.md5($pas_user).'\' LIMIT 1');



      // Еслии пользователя с таким паролем нет, делаем предупреждение
      if( mysql_num_rows( $result ) == 0 )
      {  $err_login = "Пароль неверен";  }
      else
       {
        // Парсим полученную запись.
        $user = mysql_fetch_object( $result );
          session_start();
        /* Вставляем данные в сессию. */
        $_SESSION['sess_id'] = session_id();
        $_SESSION['sess_uid'] = $user->uid;
        $_SESSION['sess_name'] = $user->name;
        $_SESSION['sess_status'] = $user->status;
        $_SESSION['sess_pravo'] = $user->pravo;
        $mt = explode( " ", microtime() ); //Получаем текущее время
        $_SESSION['times']=$mt[1];
        $stat=$_SESSION['sess_id'];

        }
     }
  }

/* Проверка действительности сессии */
   if ($_SESSION['sess_id']>0)
    {
       $mt = explode( " ", microtime() ); //Получаем текущее время
     if    (($mt[1] - $_SESSION['times'])< 30*60)//если время не вышло то продлеваем действие
     {
        $_SESSION['times']=$mt[1];
        $login=2;
     }
     else     //а если время вышло, то зачищаем сессию и переходим к авторизации
     {
        //$_SESSION=0;
        $login=1;
     }

    }
    else
        {
        $login=1;
        }

    if ($login==1) //Если сессия не установлена
    { print  $err_login."<br> <form action='' method='POST'>
     Логин:<br> <input type=text name=name maxlength=16 value=".$name_user."><br>
     Пароль:<br> <input type=passwordq name=pass maxlength=16 value=".$pass_user."><br>
     <input type='Submit' name='blogin' value='Вход'>  <a href='?bs=reg&regi=1'>Регистрация</a><br>
     </form>
      ".$names_user." ".$pas_user." ".$pass_user." Проверка: ".$stat;
    }

if($login==2)
  {  print "Добро пожаловать, ".$_SESSION['sess_name'].".<br><a href='?bs=quit'>Выйти</a>  Проверка: ".$stat; }

?>


Это сообщение отредактировал(а) woin - 22.4.2007, 15:45
PM MAIL   Вверх
capitan
Дата 22.4.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Код

session_start();


Эта строчка должна быть на всех страницах куда идёт переход.
PM MAIL WWW ICQ   Вверх
woin
Дата 22.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Цитата(capitan @  22.4.2007,  16:29 Найти цитируемый пост)
Эта строчка должна быть на всех страницах куда идёт переход. 
 она там есть

Добавлено через 13 минут и 47 секунд
А сессия пропадает даже если перейти на этот же скрипт.
PM MAIL   Вверх
capitan
Дата 23.4.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Сделай вывод всех ошибок, сделай  var_dump($_SESSION); на каждом шаге. И смотри где идёт потеря.
PM MAIL WWW ICQ   Вверх
woin
Дата 23.4.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Теперь работает, не знаю в чём была ошибка, но  она исправлена.
 Другая проблема - если я логинюсь, то после принятия пароля для того чтоб всё начало действовать приходится перейти ещё раз(или обновить страничку).
Т.е. нажать вход, а потом ещё раз обновить. 
 У меня какая-то ошибка в структуре? Как правильнее разместить блоки и поставить условия выполнения для того чтобы срабатывало сразу?
 С выходом кстати те же проблемы.  smile  smile 
Код

<?php
// if (isset($_REQUEST[session_name()])) session_start();  //запускаем сессию.
// include "conekt.php";
//session_start();
if($bs=='quit')
{
    session_destroy();
    $login=1;
}

?>

<?php

if(( $_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['blogin'] )) and ($_SESSION['sess_id']==0) )
  {
   if( empty( $_POST['name'] ) || empty( $_POST['pass'] ) )
   {$err_login = "Логин и/или пароль не введены";   }
     else
     {
     $names_user = substr($HTTP_POST_VARS["name"],0,16);
     $names_user = htmlspecialchars(stripslashes($names_user)); // обрабатываем имя
     $pas_user = substr($HTTP_POST_VARS["pass"],0,16);
     $pas_user = htmlspecialchars(stripslashes($pas_user)); // обрабатываем пароль
     connect();       //Подключаемся к БД
      // Ищем пользователя с указанным именем и паролем

       $result = mysql_query( 'SELECT * FROM auth_members WHERE name = \''.mysql_escape_string($names_user).'\' AND password = \''.md5($pas_user).'\' LIMIT 1');



      // Еслии пользователя с таким паролем нет, делаем предупреждение
      if( mysql_num_rows( $result ) == 0 )
      {  $err_login = "Пароль неверен";  }
      else
       {
        // Парсим полученную запись.
        $user = mysql_fetch_object( $result );
         // session_start();
        /* Вставляем данные в сессию. */
        $_SESSION['sess_id'] = session_id();
        $_SESSION['sess_uid'] = $user->uid;
        $_SESSION['sess_name'] = $user->name;
        $_SESSION['sess_status'] = $user->status;
        $_SESSION['sess_pravo'] = $user->pravo;
        $mt = explode( " ", microtime() ); //Получаем текущее время
        $_SESSION['times']=$mt[1];
        $stat=$_SESSION['sess_id'];

        }
     }
  }

/* Проверка действительности сессии */
   if (isset($sess_id))
    {
       $mt = explode( " ", microtime() ); //Получаем текущее время
     if    (($mt[1] - $_SESSION['times'])< 30*60)//если время не вышло то продлеваем действие
     {
        $_SESSION['times']=$mt[1];
        $login=2;
     }
     else     //а если время вышло, то зачищаем сессию и переходим к авторизации
     {
        session_destroy();
        $login=1;
     }

    }
    else
        {
        $login=1;
        }

    if ($login==1) //Если сессия не установлена
    { print  $err_login."<br> <form action='' method='POST'>
     Логин:<br> <input type=text name=name maxlength=16 value=".$name_user."><br>
     Пароль:<br> <input type=passwordq name=pass maxlength=16 value=".$pass_user."><br>
     <input type='Submit' name='blogin' value='Вход'>  <a href='?bs=reg&regi=1'>Регистрация</a><br>
     </form>
      ";
    }

if($login==2)
  {  print "Добро пожаловать, ".$_SESSION['sess_name'].".<br><a href='?bs=quit'>Выйти</a>  "; }

?>

PM MAIL   Вверх
woin
Дата 24.4.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Как мне кажется, если разделить на два файла, благо структура позволяет - то будет нормально.
 Но вот из-за чего "подвисает" с исполнением  smile 
PM MAIL   Вверх
woin
Дата 26.4.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Разделение файла на два не помогло, и так не могу понять почему сразу по авторизации не срабатывает вывод приветстия, а остаётся поле ввода  логина и пароля.
PM MAIL   Вверх
Goganchic
Дата 28.4.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Цитата(woin @  24.4.2007,  10:08 Найти цитируемый пост)
Но вот из-за чего "подвисает" с исполнением

Как я понимаю это выглядит так: страница открывается только через несколько секунд?
Если да - то у меня такая же проблема, сам не знаю что делать вот уже 3 дня бьюсь головой об стену  smile  и ничего
PM Jabber   Вверх
woin
Дата 28.4.2007, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Цитата(Goganchic @  28.4.2007,  09:11 Найти цитируемый пост)
Как я понимаю это выглядит так: страница открывается только через несколько секунд?

Нет. У меня проблема в другом. задержка с авторизацией.
 Впрочем проблему при входе я решил. 
 Теперь осталась только задержка при выходе.

 У меня  была медленная загрузка странички когда я в коде прописывал абсолютный путь
 подключаемых картинок и файлов, вроде: "http://tale.ru/portrait/5.gif", после изменения на "portrait/5.gif"  процесс пошёл быстрее.
 Возможно у тебя тоже из-за того, что  где-то идёт загрузка с других сайтов.
PM MAIL   Вверх
tolik777
Дата 28.4.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 19.6.2006

Репутация: нет
Всего: 2



Хммм. А разве для браузера есть разница откда картинки грузить с одного и того же сайта но по ссылке portrait/5.gif, или http://tale.ru/portrait/5.gif? Все равно запрос к картинке идет один и тот же.
PM MAIL WWW ICQ   Вверх
BuShaRt
Дата 28.4.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



tolik777, 

Ну, вообще да, так он берет с localhost, а так как бы подгружает...

Может не совсем удачный пример, но сам посуди, тебе проще подумать о то, что бы взять кружку на столе, или на взять кружку, которая стоит на столе в твоей квартире, если по суте ты сидишь за этим столом? ;)
PM MAIL   Вверх
BuShaRt
Дата 28.4.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Кстате, по суте... 

1. Есть куча статей по написанию авторизации и даже готовых примеров, не пойму зачем мучаться... Если даже очень хочеться изобрести велосипед, то проще посмотреть как у других и сделать так же у себя ;)
В твоем случае все очень запутанно.. ооочень... 
Здаеться мне проблема где то тут 
Код

/* Проверка действительности сессии */
if (isset($sess_id)) {
    //Получаем текущее время
    $mt = explode( " ", microtime() ); 
    //если время не вышло то продлеваем действие
    if (($mt[1] - $_SESSION['times'])< 30*60) {
        $_SESSION['times']=$mt[1];
        $login=2;
    } else {
        session_destroy();
        $login=1;
    }
} else {
    $login=1;
}


sess_id -  у тебя переменная, или элимента массива $_SESSION?

2. по поводу блоков, попробуй сделать так

-Проверка на Post-запрос, если не было, то вывод страницы, без дальнейшей обработки скрипта
-Если POST запрос пришел, то выполняеться весь скрипт smile
и не надо кучи if and else, просто заглушка 

Код

if (empty ($_POST['indexform'])) {
    GoIndex ($page);    
}


Это сообщение отредактировал(а) BuShaRt - 28.4.2007, 11:42
PM MAIL   Вверх
woin
Дата 28.4.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Цитата(BuShaRt @  28.4.2007,  11:36 Найти цитируемый пост)
sess_id -  у тебя переменная, или элимента массива $_SESSION?
 в данном случае это без разницы. Такова особенность "$_SESSION"



Цитата(BuShaRt @  28.4.2007,  11:36 Найти цитируемый пост)
-Проверка на Post-запрос, если не было, то вывод страницы, без дальнейшей обработки скрипта
-Если POST запрос пришел, то выполняеться весь скрипт smile
и не надо кучи if and else, просто заглушка 

Там на сайте несколько форм. и не хотелось бы чтобы скрипт авторизации выполнялся при каждой отправке.

Вывод приветствия или сообщение об авторизации переделал. Приведя к виду:
Код

    if ($_SESSION['sess_uid']==0) //Если сессия не установлена
    //if ($login==1) //Если сессия не установлена
    { print  $err_login."<br> <form action='' method='POST'>
     Логин:<br> <input type=text name=name maxlength=16 value=".$name_user."><br>
     Пароль:<br> <input type=password name=pass maxlength=16 value=".$pass_user."><br>
     <input type='Submit' name='blogin' value='Вход'>  <a href='?bs=reg&regi=1'>Регистрация</a><br>
     </form>
      ";
    }
  else
  {
     print "<br>".$_SESSION['sess_name']."</b><br><a href='?bs=quit'>Выйти</a></center>  ";
  }

После чего  работает нормально.

В расмотреных мною скриптах было немного не то... или непонятно как что работало. А мне хотелось разобраться с сессиями.  smile 
 

Это сообщение отредактировал(а) woin - 28.4.2007, 18:18
PM MAIL   Вверх
BuShaRt
Дата 28.4.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(woin @  28.4.2007,  18:16 Найти цитируемый пост)
 в данном случае это без разницы. Такова особенность "$_SESSION"

Особенность? Просто кто-то не читал про regsiter_globals.


Цитата(woin @  28.4.2007,  18:16 Найти цитируемый пост)
Там на сайте несколько форм. и не хотелось бы чтобы скрипт авторизации выполнялся при каждой отправке.

Есть такой интересный момент. Если назначить кнопке submit поле name, то значение value т.е. надпись на кнопке педасться скрипту, надпись нас не интересует, но в массиве $_POST создаться элимент с идентичным именем кнопки. Что нам это дает?

Код

if (isset($_POST['submit_name'])) {
    //Действия по нажатию кнопки...
}


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

Вот пример, авторизации, разве что сессии не убивает smile

Код

<?php
include_once 'all_connect.php';

if (empty($page)){  
    $page='new';
}

if (empty ($_POST['indexform'])) {
    GoIndex ($page);    
}
    
$filter_obj->field_validator('Логин', $_POST['login'], 'alphanumeric', 4, 15);     
$filter_obj->field_validator('Пароль', $_POST['password'], 'string', 4, 15);
    
if (!($row = $mysql_obj->CheckPass ($_POST['login'], $_POST['password']))) {
    $filter_obj->messages[] = 'Логин - пароль не совпадают.';    
}     

if ($filter_obj->messages) {    
    GoIndex ($page);         
}

GreatMemberSession($row['login'], $row['password'], $row['lvl']);    
header('Location: index.php?'.session_name().'='.session_id().'&page=rule');     
    
?>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.