Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

sajax и запоминание

271
21 февраля 2007 года
MrXaK
721 / / 31.12.2002
недавно решил переписать сайт, использую sajax... переписал всё прекрасно, но недавно стали поступать жалобы клиентов
не работает запоминание пароля
реализовано оно у меня так:
файлы имеют структуру
 
Код:
<?php
//header("Content-Type: text/html; charset=windows-1251");
session_start();
require_once("class.php");
$ns = new render($sql);
flush();
/* дальше уже работа со страницей */

class.php:
Код:
<?php
if( !defined('NO_GLOBALS_ERASE') )
{
    if( $_SESSION != NULL )
        foreach($_SESSION as $k => $value )
            unset($$k);
    if( $_COOKIE != NULL )
        foreach($_COOKIE as $k => $value )
            unset($$k);
    if( $_GET != NULL )
        foreach($_GET as $k => $value )
            unset($$k);
    /*if( $_POST != NULL )
        foreach($_POST as $k => $value )
            unset($$k);*/

}
require_once("config.inc.php");     // Include Config File

// Definitions
define("MCLASS","./class/");             // Set Path to classes
define("MTEMPLATE","./templates/");
//define("MFUNC","./functions/");
define("MSERV","./services/");
define("MGALLERY","./gallery/");

require_once(MCLASS."class.sql.php");     // Include SQL Class
require_once(MCLASS."class.render.php");      // Include Render Class
require_once(MCLASS."Sajax.php");     // Include Render Class
require_once(MCLASS."funcs.login.php");   // Include Render Class

$sql = new sql;
// Making a stability connection to DataBase
// it wil be used in all time of user works
$sql->mySQLerror = FALSE;
$sql->db_Connect($mySQLserver,$mySQLuser,$mySQLpassword,$mySQLdefaultdb);
/* дальше выборка конфига из бд, не интересно */
/* в старом методе авторизации было так::
if( (isset($_COOKIE['id'])) && (!isset($_SESSION['id'])) )
{
    $sql->db_Select("users", "*", " id = '".$_COOKIE['id']."'");
    $row = $sql->db_Fetch();
    if( $_COOKIE['ticket'] == $row['ticket'] )
    {
        $_SESSION['id'] = $row['id'];
        $_SESSION['access'] = $row['access'];
        $_SESSION['login'] = $row['login'];
    }
    else
    {
        setcookie("id");
        setcookie("ticket");
        setcookie("access");
        setcookie("login");
        unset($_COOKIE);
        session_destroy();
        unset($_SESSION);
    }
}
*/

?>


то есть подключаются либы для работы с sql, либа вывода, sajax, и описанные мной методы sajax

далее funcs.login.php
Код:
<?php                              
define('DATE_FORMAT', "d-m-Y  H:i");

// функция для рестарта сессии
function session_restart($expire)
{
   if (session_name()=='') {
       // Session not started yet
       session_set_cookie_params($expire);
       session_start();
   }
   else {
       $old = $_SESSION;
       // Session was started, so destroy
       session_destroy();

       // But we do want a session started for the next request
       session_set_cookie_params($expire);
       session_start();
       session_regenerate_id();
       $_SESSION = $old;

       // PHP < 4.3.3, since it does not put
       setcookie(session_name(), session_id(), $expire);
   }
}

function doExit()
{
/* выход работает */
}

function doLogin($login, $pass, $remember)
{
    global $mySQLserver,$mySQLuser,$mySQLpassword,$mySQLdefaultdb;
    $sql = new sql;
    $sql->mySQLerror = FALSE;
    $sql->db_Connect($mySQLserver,$mySQLuser,$mySQLpassword,$mySQLdefaultdb);
    $ns = new render($sql, FALSE);
    if( isset($login) && isset($pass) )
    {
        $login = trim($login);
        $login = iconv("utf-8", "windows-1251", $login);
        $login = addslashes($login);
        $pass = iconv("utf-8", "windows-1251", $pass);
        $password = md5($pass);
        $sql->db_Select("users", "*", " login = '".$login."' and password = '".$password."'");
        if( $sql->db_Rows() == 1 )
        {
            $row = $sql->db_Fetch();
            $_SESSION['id'] = $row['id'];
            $_SESSION['login'] = $row['login'];
            $_SESSION['access'] = $row['access'];
            $_SESSION['start'] = time();
            if( $remember == "yes" )
            {
                if( eregi("Opera", $_SERVER['HTTP_USER_AGENT']) )
                    $t = time() + 60*60*24*20;
                else
                    $t = 60*60*24*20;
                session_restart($t);
                flush();
            }
            else
            {
                session_restart(0);
            }

        }
        else
        {
            $tt = "<center><font color=#FF0000>Ошибка! Логин или пароль неверны</font></center>";
            $t = implode(file("templates/loginform.inc.php", "r"));
            $res['loginfrmtxt'] = $tt."\n<br />".$t;
        }
    }

    $ns->render_menu();
    $tl = $ns->menu_text;
    $res['login'] = $_SESSION['login'];
    $res['menuca'] = $tl[1];
    $res['menucb'] = $tl[2];
    $res['menucc'] = $tl[3];
    $res['menucd'] = $tl[4];
    return $res;
}


$sajax_request_type = "POST";
sajax_init();
sajax_export("doExit");
sajax_export("doLogin");
sajax_handle_client_request();
?>


и вот это всё работало лично у меня в Опере 9.12, кука PHPSESSID переписывалась и всё было нормально... но клиенты жалуются что при поставленной галочке при любом переходе по странице авторизация слетает...
з.ы. если внутрь проверки запоминание поставить фрагмент старой авторизации
 
Код:
for( $len=8, $r=''; strlen($r) < $len; $r .= chr( !mt_rand(0,2)?mt_rand(48,57):(!mt_rand(0,1)?mt_rand(65,90):mt_rand(97,122))));
setcookie("id", $row['id'], $t);
setcookie("login", $row['login'], $t);
setcookie("access", $row['access'], $t);
setcookie("ticket", $r, $t);

то куки эти просто не ставятся, нету их...
13
21 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Ты думаешь кому-то будет охота вчитываться в такое количество кода?


ЗЫ А с каких пор последняя версия оперы у нас 9.12?
271
21 февраля 2007 года
MrXaK
721 / / 31.12.2002
ну я не говорил последняя) просто какая у меня стоит, в ней работает всё
ну можно имхо упростить... как я понял, у клиентов не работает:
Код:
function session_restart($expire)
{
   if (session_name()=='') {
       // Session not started yet
       session_set_cookie_params($expire);
       session_start();
   }
   else {
       $old = $_SESSION;
       // Session was started, so destroy
       session_destroy();

       // But we do want a session started for the next request
       session_set_cookie_params($expire);
       session_start();
       session_regenerate_id();
       $_SESSION = $old;

       // PHP < 4.3.3, since it does not put  
       setcookie(session_name(), session_id(), $expire);
   }
}

сессия просто уничтожается... хотя код с комментариев с php.net
весь код выложил чтобы подсказали, есть ли другие варианты решения задачи)
12
21 февраля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Mr.Hacker
ну я не говорил последняя


Ты не понял. Он это к тому, что самая последняя версия Оперы 9.10

271
21 февраля 2007 года
MrXaK
721 / / 31.12.2002
ну значит 9.02) перепутал)
точно глянул, 9.02, тока всё равно в принципе проблему не решает
13
21 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Есть старая мудрость, которой надо следовать иначе в будущем огребешь проблем: "Не плоди сущностей без надобности". Смысл в том, что если есть возможность обойтись без чего-либо - значит так и надо делать.

Твой код слишком намудрен на пустом месте. Слишком много мути в проверке сессии, установке кук и их параметров.
А это вообще надо в раздел юмор отправить:
 
Код:
$old = $_SESSION;  
       // Session was started, so destroy  
       session_destroy();  

       // But we do want a session started for the next request  
       session_set_cookie_params($expire);  
       session_start();  
       session_regenerate_id();  
       $_SESSION = $old;

зачем каждый раз уничтожать сессию и создавать заново????? Куки сами обновятся. Вместо всей этой мутной писанины достаточно поставить всего 2 (!!!) строчки:
 
Код:
session_set_cookie_params($expire);  
       session_start();
271
22 февраля 2007 года
MrXaK
721 / / 31.12.2002
дык если сессия уже стартовала до этого... а session_set_cookie_params(); ставится только до session_start()
поэтому и надо уничтожать
13
22 февраля 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Mr.Hacker
дык если сессия уже стартовала до этого... а session_set_cookie_params(); ставится только до session_start()
поэтому и надо уничтожать


Что за чушь? где вы такой бред прочитали? session_start() инициализирует сессию или создает новую если нет соотв. кук. RTFM

271
22 февраля 2007 года
MrXaK
721 / / 31.12.2002
ну я с этим не спорю...
только из мана http://ru.php.net/manual/ru/function.session-set-cookie-params.php
Цитата:
Thus, you need to call session_set_cookie_params() for every request and before session_start() is called.


поэтому и вызывал session_destroy() чтобы затем поменять session_set_cookie_params()
ибо код вида

 
Код:
session_start();
session_set_cookie_params($time);
session_start();

не работает... а к этому коду по сути приводит вызов моей sajax-функции авторизации если заменить session_restart() на то что вы написали выше...
а написанная выше функция session_restart() - есть чуток дополненная из комментариев того же мана
271
22 февраля 2007 года
MrXaK
721 / / 31.12.2002
возможно неправильно описал проблему, её можно ещё как-то решить) то что я выше выложил это как я пытался решить
суть была - написать авторизацию с использованием ajax... но что странно, то что внутри sajax-функции не ставятся куки, поэтому решил менять куку сессии, ибо сессия ставится нормально (но она и стартует у меня изначально до подключения всех либ)... при это вывода в браузер нету никакого... пробовал ob_end_clean() делать но тоже не помогает, кука просто не ставится, если устанавливаю её внутри sajax-функции (серверной в смысле)
271
24 февраля 2007 года
MrXaK
721 / / 31.12.2002
ап) пока отключил свои наработки, но тема открыта) хелп
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог