sajax и запоминание
не работает запоминание пароля
реализовано оно у меня так:
файлы имеют структуру
Код:
<?php
//header("Content-Type: text/html; charset=windows-1251");
session_start();
require_once("class.php");
$ns = new render($sql);
flush();
/* дальше уже работа со страницей */
//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);
}
}
*/
?>
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();
?>
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);
setcookie("id", $row['id'], $t);
setcookie("login", $row['login'], $t);
setcookie("access", $row['access'], $t);
setcookie("ticket", $r, $t);
то куки эти просто не ставятся, нету их...
ЗЫ А с каких пор последняя версия оперы у нас 9.12?
ну можно имхо упростить... как я понял, у клиентов не работает:
Код:
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);
}
}
{
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
весь код выложил чтобы подсказали, есть ли другие варианты решения задачи)
Цитата: Mr.Hacker
ну я не говорил последняя
Ты не понял. Он это к тому, что самая последняя версия Оперы 9.10
точно глянул, 9.02, тока всё равно в принципе проблему не решает
Твой код слишком намудрен на пустом месте. Слишком много мути в проверке сессии, установке кук и их параметров.
А это вообще надо в раздел юмор отправить:
Код:
$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;
// 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();
session_start();
поэтому и надо уничтожать
Цитата: Mr.Hacker
дык если сессия уже стартовала до этого... а session_set_cookie_params(); ставится только до session_start()
поэтому и надо уничтожать
поэтому и надо уничтожать
Что за чушь? где вы такой бред прочитали? session_start() инициализирует сессию или создает новую если нет соотв. кук. RTFM
только из мана 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();
session_set_cookie_params($time);
session_start();
не работает... а к этому коду по сути приводит вызов моей sajax-функции авторизации если заменить session_restart() на то что вы написали выше...
а написанная выше функция session_restart() - есть чуток дополненная из комментариев того же мана
суть была - написать авторизацию с использованием ajax... но что странно, то что внутри sajax-функции не ставятся куки, поэтому решил менять куку сессии, ибо сессия ставится нормально (но она и стартует у меня изначально до подключения всех либ)... при это вывода в браузер нету никакого... пробовал ob_end_clean() делать но тоже не помогает, кука просто не ставится, если устанавливаю её внутри sajax-функции (серверной в смысле)
ап) пока отключил свои наработки, но тема открыта) хелп