Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > тут фишка с сессиями


Автор: Onis 10.12.2005, 02:26
<<код в посте ниже>>

Практиковался с сессиями, вроде написал норм код для входа в сессию уже имеющимся в БД юзера.
Тут при входе высвечивает приветствие и кнопку "выход", при нажатии на нее страница обновляется, появляется запрос на пасс и логин но приветствие и кнопка выход тоже остаются smile. Что для выхода придется два раза кликать на "выход"?

Автор: -=Ustas=- 10.12.2005, 13:28
Слушай, тут у тебя вообще бред какой-то, а не авторизация. И где у тебя стартует сессия?

Автор: Onis 10.12.2005, 14:16
-=Ustas=-

Это была ночь я бредил не то выслал.

Вот... что-то похожее на правду:

Код

<?php
session_start();
$this_file="test_session.php";
function log_in($password,$login)
{
    session_register("member");
    $member=array('login'=>$login, 'password'=>$password);
    print("open session $member[login]");
};

function check_lp($password,$login)
{
    global $log_in;
    $log_in=true;
    include("connectToDBR.inc");
    $obj=mysql_query("SELECT * FROM members ORDER BY `login` DESC");
    while($row=mysql_fetch_object($obj))
    {
        if($row->login==$login&&$row->password==$password)
        {
            print("<tr><td>Здравствуй $row->login</td></tr>");
            return true;
        }
    }
    return false;
};

function log_out()
{
    $this_file="test_session.php";
    echo("<table border='0'>
    <tr><td align='right'><form action=$this_file method='post'><input type='submit' value='выход' name='exit'></form></td></tr></table>");
    if(isset($exit))
    {
        session_destroy();
    }
};


if((!isset($login)&&!isset($password))&&(!isset($member['login'])&&!isset($member['login'])))
{
?>
    <table border='0'>
    <form action=<?php print("$this_file"); ?> method='post'>
    <tr><td>Введите логин:<input type='text' name='login'></td></tr>
    <tr><td>Введите пароль:<input type='password' name='password'></td></tr>
    <tr><td align='right'><input type='submit' value='ok.' name='ok'></form></td><td></td></tr></table>
<?php
}
else
{
    if(check_lp($password,$login))
        log_in($password,$login);
    log_out();
}


?>

Добавлено @ 14:19
Ток я в сессиях неферштэйн нечета. Чето не пашет как должно... точнее как я хотел.

Должно было: если сессии нет должно высветить форму, при вводе данных в форму проверяет наличие такого юзера в БД и если он есть создает ссесию. Которая как я понял должна сохраниться и пока не уничтожиться сессия при входе на эту страничку она будет видна, и типа юзер будет... мммм... кроче не пашет. Я ламерок

Автор: -=Ustas=- 10.12.2005, 14:28
Это тоже бред, не лучше первого! Вот это что,
Код

$member=array('login'=>$login, 'password'=>$password);

Присваивание переменной сессии что ли? Найди два различия:
Код

$member;
$_SESSION['member'];

Массивы лучше в сессиях не хранить, лучше сделай две переменные - $_SESSION['login'] и $_SESSION['password'], хотя нафига пароль сохранять в сессии? Это небезопасно! Плюс пароль нужно хешировать - md5 или sha1.
Теперь, производить условие на наличие юзера надо в самом запросе, типа:
Код

$res = mysql_query("SELECT * FROM members WHERE login = '".$_POST['login']."' AND password = '".$_POST['password']."'");
if (mysql_num_rows($res) > 0) {
    // Есть такой юзер
} else {
    // Нет такого
}

Это будет оптимальней.

Автор: Onis 10.12.2005, 14:31
-=Ustas=-
Спасибо smile


Сам себе *вот видишь что бывает если пытаешься сам разобраться в чем-то*

Автор: Onis 10.12.2005, 14:51
И еще вопрос. А что разве сессия грохается после того как вышел со странички или зашел на нее заново(не обновил)?

Автор: -=Ustas=- 10.12.2005, 15:08
Цитата(Onis @ 10.12.2005, 14:51)
А что разве сессия грохается после того как вышел со странички или зашел на нее заново(не обновил)?

Она грохается когда браузер закрывается, т.е. при закрытии и открытии вновь создается другой id-ишник сессии.

Автор: Onis 10.12.2005, 15:23
-=Ustas=-
Еще раз извини. Но не можешь объяснить как сделать чтоб сайт помнил юзера во время его хождений по сайту, и как сделать так чтоб сайт при повторном захождении на сайт юзер его помнил.

Или мож дать ссылку туда где обсуждается эта тема.

Я поиск юзал, нашел кучу топов про сессии но того что мне нужно я не нашел smile((. Видимо руки кривые до [censored 6].

Я так-же смотрел FAQ вашем форуме но там авторизация описана с помощью куки... а я их не хочу юзать smile(

Автор: -=Ustas=- 10.12.2005, 15:52
Вот тут описано - http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=main_panel&article=2849, и ее можно перебить под сессии, ничего сложного там нет:
Цитата

Сам же скрипт, его смысл алгоритм не претерпит существенных изменений. Алгоритм его работа останется тем же, просто проверять надо буде не Куки, а сессии...

Автор: Onis 10.12.2005, 17:02
-=Ustas=-
Вот, часть скрипта из того что приведен в той ссылке.

Код

setcookie( "time" , $tm , time() + 900 , "/" );
setcookie( "name" , $user -> name , time() + 900 , "/" );


как создать тоже самое, сессиями?

Модет так:
Код

$_SESSION["time"] =array( $tm , time() + 900 , "/" );
$_SESSION["name"] =array($user -> name , time() + 900 , "/");
???

Иль опять я брежу?

Автор: -=Ustas=- 10.12.2005, 18:08
Я не пойму, зачем ты всё время в сессии пытаешься засунуть массивы?!
Код

$_SESSION["time"] = $tm;
$_SESSION["name"] = $user->name;

Автор: Onis 10.12.2005, 20:21
Моя плакаль... переделал (вродебы) тот скрипт на сессии, но вот при регистрации там вылетают ошибки, в которые я не оч врубаюсь.... сделал всё что только смог... нечерта.... smile
может мне убить сибя?

Код

<?php
    include("connectToDBW.inc");
    function check()
    {
      $result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_SESSION['name'] ) . "' LIMIT 1" );
    
      if( mysql_num_rows( $result ) == 0 )
        {  redirect( "not_auth" );  }
    
      $user = mysql_fetch_object( $result );
    
      $minutes = 15;
      $result = mysql_query( "SELECT `*` FROM `auth_sessions` WHERE `member` = " . $user -> id . " AND `hash` = '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $_SESSION['time'] ) . "' AND `time` > " . ( time() - ( $minutes * 60 ) ) . " LIMIT 1 " );
      print mysql_error();
    
      if( mysql_num_rows( $result ) == 0 )
       {  redirect( "not_auth" );  }
    
      if( isset( $_GET['quit'] ) )
       {
        mysql_query( "DELETE FROM `auth_session` WHERE `id` = " . $user -> id . " AND `hash` = '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $_SESSION['time'] ) . "'" );
    
         session_destroy();
    
        return FALSE;
       }
      else
       {
        mysql_query( "UPDATE `auth_session` SET `time` = " . time() . " WHERE `member` = " . $user -> id . " AND `hash` = '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $_SESSION['time'] ) . "'" );
    
        $_SESSION["time"] = $tm;
        $_SESSION["name"] = $user->name;
    
        return TRUE;
       }
    }

    
    function auth()
    {
        $result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' AND `password` = '" . md5( $_POST['pass'] ) . "' LIMIT 1" );

        if( mysql_num_rows( $result ) == 0 )
        {  redirect( "not_auth" );  }

        $user = mysql_fetch_object( $result );
    
        $tm = getmicrotime();
        mysql_query( "INSERT INTO `auth_sessions` VALUES( " . $user -> id . " , " . time() . " , '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $tm ) . "' )" );
    
        $_SESSION["time"] = $tm;
        $_SESSION["name"] = $user->name;
    
        redirect( "" );
    }

    function reg()
    {
        $result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' LIMIT 1" );

        if( mysql_num_rows( $result ) == 1 )
        {  redirect( "exists" );  }

    mysql_query( "INSERT INTO `auth_members` VALUES ( '' , '" . mysql_escape_string( $_POST['name'] ) . "' , '" . md5( $_POST['pass1'] ) . "' )" );
    $_POST['pass'] = $_POST['pass1'];

    auth();
    }

    function hash( $user , $user_agent , $user_ip )
    {  
        return md5( $user ) . md5( $user_agent ) . md5( $user_ip );
    }

    function get_ip()
    {
        if ($ip = getenv("HTTP_CLIENT_IP"))
        {  return $ip;  }
    
        if ($ip = getenv("HTTP_X_FORWARDED_FOR"))
        {
            if ($ip == '' || $ip == "unknown")
            {  $ip = getenv("REMOTE_ADDR");  }
    
            return $ip;
        }
        if ( $ip = getenv("REMOTE_ADDR") )
        {  return $ip;  }
    } 
    
    function getmicrotime()
    {
        $mt = explode( " ", microtime() );
        return ( (float)$mt[0] + (float)$mt[1] );
    }
    
    function redirect( $par )
    {
        header( "Location: qwe.php?task=" . $par );
        exit;
    }
?>

<?php

if( isset($_SESSION['member']['time'] ) && isset($_SESSION['member']['name'] ) && check()==TRUE )
 {  print "Welcome.<br><a href='?quit'>Выйти</a>";  }
else
 {
  if( ! empty( $_GET['task'] ) )
   {
    switch( $_GET['task'] )
     {
      case "nepass":   print "Пароли не совпадают";
           break;
      case "not_auth": print "Логин или пароль неверный.";
           break;
      case "fields":   print "Не заполнены все поля";
           break;
      case "exists":   print "Пользователь с таким именем уже существует";
           break;
     }

    print "<br><br>";
   }

?>
    Вход: <form action='' method='POST'>
    Логин: <input type='text' name='name' maxlength='127' value=''><br>
    Пароль: <input type='text' name='pass' maxlength='127' value=''><br>
    <input type='Submit' name='blogin' value='Вход'><br>
    </form>
    Регистрация: <form action='' method='POST'>
    Логин: <input type='text' name='name' maxlength='127' value=''><br>
    Пароль: <input type='text' name='pass1' maxlength='127' value=''><br>
    Повторите пароль: <input type='text' name='pass2' maxlength='127' value=''><br>
    <input type='Submit' name='breg' value='Вход'>
    </form>
<?php
 }

?>
<?php
    if( $_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['breg'] ) )
    {
    if( empty( $_POST['name'] ) || empty( $_POST['pass1'] ) || empty( $_POST['pass2'] ) )
    {  redirect( "fields" );  }

    if( md5( $_POST['pass1'] ) != md5( $_POST['pass2'] ) )
    {  redirect( "nepass" );  }

    reg();
    }
    
    if( $_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['blogin'] ) )
    {
    if( empty( $_POST['name'] ) || empty( $_POST['pass'] ) )
    {  redirect( "fields" );  }

    auth();
    }
    

    if( isset( $_SESSION['time'] ) && isset( $_SESSION['name'] ) && check() == TRUE )
    {  print "Welcome.<br><a href='?quit'>Выход.</a>";  }

    
?>


Ошибки:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\php\www\0.1_alpha\scripts\qwe.php on line 61

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\php\www\0.1_alpha\scripts\qwe.php on line 43

Warning:Cannot modify header information - headers already sent by (output started at z:\home\php\www\0.1_alpha\scripts\qwe.php:104) in z:\home\php\www\0.1_alpha\scripts\qwe.php on line 99

Автор: Mal Hack 10.12.2005, 22:33
Цитата(Onis @ 10.12.2005, 20:21)
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\php\www\0.1_alpha\scripts\qwe.php on line 61

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\php\www\0.1_alpha\scripts\qwe.php on line 43

Ну а вывести mysql_error и показать саму ошибку? Мы тут не телепаты.

Автор: Onis 11.12.2005, 21:31
Mal Hack
извините, или я нето делаю, или mySQL не ругается.

Да просто.... я не вижу в тех

Код

...
if( mysql_num_rows( $result ) == 0 )
...
if( mysql_num_rows( $result ) == 1 )


строках ошибок smile( smile

Автор: Mal Hack 11.12.2005, 21:45
Цитата(Onis @ 11.12.2005, 21:31)
строках ошибок smile( smile

Быть не может. Раз mysql_num_rows ругается, значит запрос корявый.

Автор: -=Ustas=- 11.12.2005, 22:43
Добавь к своим подобным запросам, or die(mysql_error()) типа такого:
Код

$result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_SESSION['name'] ) . "' LIMIT 1" ) or die(mysql_error());

Автор: Onis 11.12.2005, 23:56
Unknown column '*' in 'field list'

Автор: Mal Hack 12.12.2005, 00:08
Цитата(Onis @ 11.12.2005, 23:56)
Unknown column '*' in 'field list'

MySQL глючит.
Убирай `` вокруг *.

Автор: Onis 12.12.2005, 00:29
Осталось только

Warning: Cannot modify header information - headers already sent by (output started at z:\home\php\www\0.1_alpha\scripts\qwe.php:104) in z:\home\php\www\0.1_alpha\scripts\qwe.php on line 99

Нивижу где оно успело отослать... smile

Автор: Mal Hack 12.12.2005, 00:53
Цитата(Onis @ 12.12.2005, 00:29)
output started at z:\home\php\www\0.1_alpha\scripts\qwe.php:104


Цитата
?>
<?php

Вот он твой вывод.

Автор: Onis 12.12.2005, 00:55
Mal Hack
Огромное спасибо. Сидишь тут в час ночи ламеркам всяким помогаешь smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)