Регистрация переменной сеанса PHP

Я пытаюсь создать простую форму входа. У меня есть session_start(); как первое, что загружается на страницу. У меня есть файл login.php, который содержит код входа в систему, который обрабатывается с помощью вызова ajax при нажатии кнопки входа. Это содержит:

if ($_GET['cemail']) {

$email = $_GET['cemail']; 
$password = md5($_GET['cpassword']); 
$sql = "select * from users where email='" . $email . "' and password='" . $password . "'";
$result = mysql_query($sql);
if (mysql_num_rows($result) >= 1) { 
    session_register("email");
}
else {
    echo "<span style='color:#ffffff;'>Invalid Email/Password</span><br>";
}

}

Когда я нажимаю кнопку «Войти», я получаю это предупреждение:

Предупреждение: session_register() [function.session-register]: невозможно отправить ограничитель кеша сеанса - заголовки уже отправлены (вывод начался в /home/clicker/public_html/hstrial-RBochner/login.php:1) в /home/clicker/public_html /hstrial-RBochner/login.php в строке 82

Строка 82 — это строка, в которой написано session_register("email");

Я также пытался создать кнопку выхода из системы, которая просто вызывает session_destroy(), но это дает мне следующее:

Предупреждение: session_destroy() [function.session-destroy]: попытка уничтожить неинициализированный сеанс в /home/clicker/public_html/hstrial-RBochner/login.php в строке 66.

Что я здесь делаю неправильно? Я пробовал размещать session_start() в разных местах. Любая помощь/идеи? Спасибо.


person Michelle    schedule 06.08.2011    source источник
comment
session_register устарел и планируется удалить из языка. Вы вообще не должны его использовать... если вы нашли это в каком-то туториале, вероятно, это было десятилетней давности.   -  person Dan Grossman    schedule 06.08.2011
comment
Это может быть самая распространенная проблема PHP. Ответ четко задокументирован везде. Пожалуйста, возьмите в привычку гуглить свое сообщение об ошибке и искать в SO существующие вопросы/ответы, прежде чем задавать новый вопрос. Руководство для session_start содержит десятки ответов.   -  person meagar    schedule 06.08.2011
comment
попробуйте поместить session_start() в первую строку вашего кода. и экземпляр: session_register(email); сделайте это: $_SESSION['email'] = 'baa';   -  person The Mask    schedule 06.08.2011
comment
Не то, о чем вы спрашивали, но вы, вероятно, хотите выполнить некоторую проверку этого $_GET['cemail']. Вы открываете себя для всех видов неприятных SQL-инъекций.   -  person Bill Heller    schedule 06.08.2011
comment
Как говорит @Bill Heller, подтвердите свой вклад!   -  person Cyclone    schedule 06.08.2011


Ответы (5)


тебе нужно:

  1. поместите session_start() в начало вашего кода
  2. не используйте session_register(), это устаревшая функция, замените на $_SESSION['foo'] = 'baa';
  3. уничтожить сеанс:

    session_start();
    session_destroy();

  4. ваше веб-приложение уязвимо для инъекций SQL. -check лучший способ остановить SQL-инъекцию в PHP

person The Mask    schedule 06.08.2011
comment
Я не согласен с вашим третьим пунктом - unset($_SESSION); неверно - php.net/manual/en/function.unset.php #77926 - person genesis; 06.08.2011
comment
Возможно, стоит указать, что если сеанс работает без session_start(), тогда session.auto_start следует отключить и запустить явно, иначе каждый запрос, который попадает в PHP, будет загружать (и блокировать) сеанс. - person Long Ears; 06.08.2011

о вашем вопросе о кнопке выхода. Вы должны сначала начать сеанс

<?php
//logout.php
session_start();
session_destroy();
echo "Logouted"

вместо

  session_register()

использовать только

   $_SESSION['email'] = ''; 
person genesis    schedule 06.08.2011

Я заставил его работать, поместив весь php-код в самое начало страницы.

person Michelle    schedule 06.08.2011

Из того, что я могу прочитать в документации по session_register() PHP (ссылка), кажется, что session_register() устарел и что $_SESSION["email"] = "[email protected]"; - это новый способ сделать это с PHP 4.1.0.

Тогда пример кода будет (я не уверен, что это работает, но он должен направить вас в правильном направлении);

<?php
    if ($_GET['cemail']) {
        $email = $_GET['cemail']; 
        $password = md5($_GET['cpassword']); 
        $sql = "select * from users where email='" . $email . "' and password='" . $password . "'";
        $result = mysql_query($sql);
        if (mysql_num_rows($result) >= 1) { 
            $_SESSION['email'] = $email;
        }
        else {
            echo "<span style='color:#ffffff;'>Invalid Email/Password</span><br>";
        }
    }
?>

Для выхода из системы вы должны сделать:

<?php
    session_start(); 
    session_destroy();
?>

or

<?php
    session_start();  
    if(isset($_SESSION['email']))
        unset($_SESSION['email']); 
?>
person Mrtn    schedule 06.08.2011

Переместите session_register перед выполнением печати или эха.

person corretge    schedule 06.08.2011