Редирект на страницу, если Header уже отправлен...

vanya

Новичок
Редирект на страницу, если Header уже отправлен...

Есть задача авторизации пользователя и, в случае правильного логина и пароля, редиректить его на соотв. страницу.
Условие: обязательное использование PEAR HTML_QuickForm.
Я делаю так:
PHP:
require_once('HTML/QuickForm.php');
ShowAdmin();
function ShowAdmin()
{
    <html>
    <head>
        <title>Вход ...</title>
    </head>
    <body onload="if(document.all.UserLogin)document.all.UserLogin.focus();">
    <center>

    $form = new HTML_QuickForm('frmUserLogin', 'get');
    $form->addElement('text', 'UserLogin', 'Логин (e-mail):');
    $form->addElement('password', 'UserPass', 'Пароль:');
    $form->addElement('reset', 'btnClear', 'Очистить');
    $form->addElement('submit', 'btnSubmit', 'Войти');
    
    $form->addRule('UserLogin', 'Введите, пожалуйста, логин.', 'required');
    $form->addRule('UserPass', 'Введите, пожалуйста, пароль.', 'required');

    if ($form->validate())
    {
        $form->process('ValidPass', false);
    }
    else
    {
        $form->display();
    }

    </center>
    </body>
    </html>
}

function ValidPass($values)
{
    // Здесь проверяется, введеный логин и пароль.
    // И, если они верны, то редиректить юзера на страницу info.php
}
Вопрос в том как его редиректить если Header() уже не будет работать (ведь он уже отправлен функцией ShowAdmin())?

P.S. Если делать без Квикформы, то все ясно.
По сабмиту страница выполняется повторно и проверяется переменая с именем кнопки Submit. Если она существует, то делаем редирект юзера.
 

hammet

Новичок
сначала обрабатывай пришедшие данные и в случае успеха делай редирект, а уже потом ShowAdmin()
 

vanya

Новичок
М-да уж, глупости (моей) нет предела:) Спасибо.

-~{}~ 16.02.08 14:03:

Только вот теперь вопрос такой появился.
Если в начале страницы index.php была стартована сессия.
PHP:
    ...
    HTTP_Session2::useCookies(true);
    HTTP_Session2::start('sess', uniqid('MyID'));

    HTTP_Session2::set('loggin', '');
    HTTP_Session2::set('password', '');

    if (isset($UserLogin) && $_GET['UserLogin'] != "" && isset($UserPass) && $_GET['UserPass'] != "")
    {
        HTTP_Session2::set('loggin', trim($_GET['UserLogin']));
        HTTP_Session2::set('password', trim($_GET['UserPass']));
        ValidPass();
    }
    else
    {
        ShowAdmin();
    }
    ...
    ValidPass()
    {
        ...
        HTTP::redirect($GLOBALS["home"]."info.php?".session_name()."=".session_id());
    }
А на странице info.php надо делать проверку:
PHP:
    HTTP_Session2::start('sess');

    if (($_SESSION["loggin"] != /*ЛОГИН_ЮЗЕРА*/) || ($_SESSION["password"] != /*ПАРОЛЬ_ЮЗЕРА*/))
    {
        HTTP_Session2::destroy();
        HTTP_Session2::set('out', null);
        header("Location:".$home);
        exit;
    }
Так вот вопрос в том, как узнать с какими ЛОГИН_ЮЗЕРА и ПАРОЛЬ_ЮЗЕРА вошел юзер?
 

Фанат

oncle terrible
Команда форума
ничего не понял.
у тебя на info.php юзер попадает из формы с логином и паролем? Если да, то из неё и узнаешь. Если нет, то они должны быть у тебя в сессии записаны.

и почему логин с паролем передаются гетом? чтобы лююбой желающий мог их посмотреть в хистори браузера?
 

vanya

Новичок
Сорри, с гетом протупил, уже заменил на пост.
На info.php юзер попадает следующим образом:
На странице index.php юзер вводит логин,пароль и нажимает Сабмит.
Страница перегружается и функция ValidPass() проверяет введеные Логин,Пароль (если они были введены).
Если Логин,Пароль правильные, то юзер редиректится на страницу info.php.
PHP:
HTTP::redirect($GLOBALS["home"]."info.php?".session_name()."=".session_id());
Т.е. переменные $_POST['UserLogin'] я уже посмотреть то не могу получается...?
А как, на странице info.php, узнать, что он вводил в форму?

Просто я хотел сделать проверку на соответствие того, что в переменных сессии тому что ввел юзер...
Типа такого
PHP:
if (($_SESSION["loggin"] != $_POST['UserLogin']) || ($_SESSION["password"] != $_POST['UserPass']))
{
    HTTP_Session2::destroy();
    HTTP_Session2::set('out', null);
    header("Location:".$home);
    exit;
}
Но $_POST[] уже не работает... я ж не прямо из формы попал на info.php.
Или, может, этого не надо делать?

-~{}~ 16.02.08 15:39:

А то получается двойная проверка одного и того же что-ли?
 

HraKK

Мудак
Команда форума
записывай в сессию что-то типа $_SESSION['auth_user']=1; если юзер прошел авторизацию, и(или) ид юзера.
 

Фанат

oncle terrible
Команда форума
Ванечка. Ты хочешь записать в сессию что-то вроде
$_SESSION["loggin"] и $_SESSION['UserLogin'], и потом их сравнивать? Очень, очень интеллектуальная задача.

-~{}~ 16.02.08 17:01:

Ага, догадался уже сам =)
 

vanya

Новичок
Автор оригинала: *****
Ванечка. Ты хочешь записать в сессию что-то вроде
$_SESSION["loggin"] и $_SESSION['UserLogin'], и потом их сравнивать? Очень, очень интеллектуальная задача.

-~{}~ 16.02.08 17:01:

Ага, догадался уже сам =)
:))) спасибо.... :)

У меня теперь еще один вопрос. Надеюсь примите.
Вопрос для общего развития (моего есно:)):
В чем принципиальная разница (меньше писать кода или доп. возможности) между встроенным механизмом сессий PHP и PEAR HTTP_Session2?
1. В ПЕАР, вроде, можно сессии в базе хранить без особого кодирования? (еще не пробовал)

А что еще, чтобы нужного и удобного есть в PEAR HTTP_Session2?

Ведь Назвать, стартануть, сетить переменные.... все, вроде, одинаково, только HTTP_Session2:: дописывай и все?
 

vanya

Новичок
Автор оригинала: StUV
http://www.phpfaq.ru/sessions

и ни какой "магии"...
Да, тут вроде, уже разобрался....
Автор оригинала: fixxxer
ты для начала без pear научись делать
И без pear сессии работают...

А вот, с этим PEAR HTTP_Session2 никак не получается правильно сделать...
Делаю так:
PHP:
HTTP_Session2::useCookies(true);
HTTP_Session2::start('NAME', uniqid('MyID'));
...
HTTP_Session2::set('loggin', 'USER_NAME');

//Удаление
HTTP_Session2::clear();
HTTP_Session2::destroy();
Только вот, раньше еще unset($_COOKIE[session_name()]); делал.

-~{}~ 17.02.08 12:14:

P.S. Лана, я лучше пока еще поразбираюсь.....
 
Сверху