$ _SESSION равно значению из базы данных? - PullRequest
0 голосов
/ 02 декабря 2011

когда человек заходит на мой сайт, мне нужно проверить значение в базе данных для его roleid, и в зависимости от этого мне нужно разрешить / запретить доступ к странице.

У меня есть этот код, но онговорит, что переменная $ _SESION 'Access' не определена, я не понимаю, почему?

            $email = mysql_real_escape_string($_POST['email']);
            $password = md5(mysql_real_escape_string($_POST['password']));

            $checklogin = mysql_query("SELECT * FROM person WHERE email = '" . $email . "' AND password2 = '" . $password . "'");

            if (mysql_num_rows($checklogin) == 1) {
                $row = mysql_fetch_array($checklogin);
                $roleid = $row['roleid'];

                $_SESSION['Email'] = $email;
                $_SESSION['LoggedIn'] = 1;
                $_SESSION['Access'] = $roleid;

                echo "<h1>Success</h1>";
                echo "<p>We are now redirecting you to the member area.</p>";
                echo "<meta http-equiv='refresh' content='2;index.php' />";
            } 

            else {
                echo "<h1>Error</h1>";
                echo "<p>Sorry, your account could not be found. Please <a href=\"index.php\">click here to try again</a>.</p>";
            }
        } 

Это оператор if, который говорит о сеансе в undefined:

if (!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Email']) && $_SESSION['Access'] == '2')

РЕДАКТИРОВАТЬ Извините, должен был упомянуть, session_start () вызывается в моем файле base.php, который включен в этот файл.

РЕДАКТИРОВАТЬ

ДонНе знаю, в чем проблема, я могу назначить переменную $ email другой переменной сеанса и показать, чтобы пользователь мог видеть, как они вошли в систему как?

У кого-нибудь есть какие-либо предложения?Обе другие переменные сеанса работают нормально.

Ответы [ 4 ]

7 голосов
/ 02 декабря 2011

Из кода, который вы опубликовали, вы пропускаете session_start()

Если это не входит в структуру, которая выполняет это для вас, его необходимо вызывать на каждой странице, которая будет использовать сеанс перед любым сеансомвыполняются вызовы.

Я предполагаю, что ошибка происходит после перенаправления, в вашей логике, которая проверяет это, используя isset() или empty().Добавьте session_start() на обе страницы перед выполнением любой логики сеанса.

РЕДАКТИРОВАТЬ :

Хорошо, у вас есть session_start().Можете ли вы print_r() ваш $_SESSION и проверить вывод?

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

Перед выполнением любых условий empty() убедитесь, что вы также запускаете isset().Empty не проверяет наличие ключа.

EDIT AGAIN :

Возможно ли, что ваше значение для $y не выходит из базы данных какодно значение?Вы можете die() в этот момент, просто распечатав значение $y, чтобы увидеть, что выводится?

0 голосов
/ 02 декабря 2011

Возможно, это не связано с вашей проблемой, но я думаю, что стоит упомянуть: ваш оператор SQL для имени пользователя / пароля может быть опасным. Хотя вы избегаете входных переменных, обычно лучше сделать это следующим образом:

$checklogin = mysql_query("SELECT * FROM person WHERE email='".$email."'");
$row = mysql_fetch_array ($checklogin, MYSQL_ASSOC);

if (mysql_num_rows ($checklogin) == 1 && $row['password'] == $password)
{
 // you are logged in
}
else
{
 // wrong email or password
}

Причина в том, что ваш текущий оператор должен возвращать ЛЮБУЮ строку в вашей таблице, тогда как этот оператор должен возвращать одну конкретную строку в таблице.

0 голосов
/ 02 декабря 2011

Проверьте правильность написания $ row ['roleid']. Имя поля в таблице базы данных точно так же, как оно?

Изменение

ВЫБРАТЬ * ОТ ЛИЦА, ГДЕ

до

ВЫБЕРИТЕ ролевых от человека, ГДЕ

посмотрим, сломается ли ...: -)

0 голосов
/ 02 декабря 2011

Просто добавьте еще одну проверку в ваше заявление if, !empty($_SESSION['Access'])

if (!empty($_SESSION['LoggedIn']) 
   && !empty($_SESSION['Email']) 
   && !empty($_SESSION['Access']) 
   && $_SESSION['Access'] == '2')
...