#php #html #web-deployment
#php #HTML #веб-развертывание
Вопрос:
В настоящее время я изучаю, как создать систему входа с использованием PHP. Сначала все казалось простым — я установил входные данные в качестве $_SESSION
переменных, а затем запустил сеанс на следующей странице, которую я открываю. Однако, когда я обновляю страницу, сеанс все еще работает, но данные переменной были удалены и не распознаны.
Вот мой php, который устанавливает переменные:
<?php
include ("connection.php"); //connects to the database.
if(isset($_POST['login']))
{
$user_name = $_POST['EMAIL'];
$password = $_POST['PASSWORD'];
// echo $user_name, " AND ", $password, "<br>";
$q = "SELECT * FROM ".$table." WHERE EMAIL='".$user_name."' AND PASSWORD= '".$password."' AND IS_ADMIN= 'YES';";
// echo "<br>",$q,"<br>";
$r = mysqli_query($conn, $q);
if(mysqli_num_rows($r) > 0)
{
if(session_id() == '' || !isset($_SESSION))
{
// session isn't started
session_start();
echo "<br>GREAT SUCCESS!!!<br>";
$_SESSION["SESSION_EMAIL"]= $user_name;
$_SESSION["SESSION_PASSWORD"]= $password;
echo $_SESSION["SESSION_EMAIL"], " ", $_SESSION["SESSION_PASSWORD"];
header("Refresh:0; url=website2.php");
}
}
else echo "<br>FAIL!!!<br>";
}
?>
Вот фрагмент, который я использую, чтобы проверить, что происходит на следующей странице:
<?php
session_start();
if (session_status() == PHP_SESSION_ACTIVE)
{
echo 'Session is active <br>';
} else echo"session is ded";
echo $_SESSION["SESSION_EMAIL"]; // it prints out an error if it screws up here
?>
Комментарии:
1. Ваш запрос подразумевает, что ваши пароли являются обычным текстом, я бы их хэшировал, а также использовал подготовленную инструкцию.
session_start
обычно находится наверху, независимо от того, где вы фактически используете сеансы. Вы можете использоватьLocation: page
вместоRefresh:
, если планируете сохранить его в0
. Вы должныexit()
после заголовка.2. Да, это сделано специально. Я просто хочу, чтобы это было в виде обычного текста, и я перейду к криптографии позже, когда узнаю больше о веб-дизайне и разработке.
3. Здесь что-то не так. При прочих равных условиях вы не можете вывести какое-либо содержимое до выполнения
header
вызова. Вы должны получать ошибки / предупреждения об этом.4. В коде, который задает переменные, попробуйте поместить ваши
session_start();
в самый верх файла сразу после<?php
.5. @waterloomatt, вероятно, сообщение об ошибке отключено.
Ответ №1:
Мне действительно неприятно это говорить, и я, честно говоря, чувствую, что мне следовало сделать это раньше, но после перезапуска моего сервера XAMPP и PHP, кажется, все исправилось само собой, и сеанс работает прямо сейчас. Теперь ничего не удаляется, и все переходы между страницами выполняются без усилий.
При всей его ценности я приношу извинения всем, кто размышлял над этим моим глупым вопросом, и я также хотел бы поблагодарить их за все их время и усилия, которые они потратили на ответ.
Еще раз, спасибо всем вам!
Ответ №2:
<?php
session_start();
include ("connection.php"); //connects to the database.
if(isset($_POST['login']))
{
$user_name = $_POST['EMAIL'];
$password = $_POST['PASSWORD'];
// echo $user_name, " AND ", $password, "<br>";
$q = "SELECT * FROM ".$table." WHERE EMAIL='".$user_name."' AND PASSWORD= '".$password."' AND IS_ADMIN= 'YES';";
// echo "<br>",$q,"<br>";
$r = mysqli_query($conn, $q);
if(mysqli_num_rows($r) > 0)
{
if(!isset($_SESSION["SESSION_EMAIL"]))
{
// session isn't started
echo "<br>GREAT SUCCESS!!!<br>";
$_SESSION["SESSION_EMAIL"]= $user_name;
$_SESSION["SESSION_PASSWORD"]= $password;
echo $_SESSION["SESSION_EMAIL"], " ", $_SESSION["SESSION_PASSWORD"];
header("Refresh:0; url=website2.php");
}
}
else echo "<br>FAIL!!!<br>";
}
?>
и на второй странице проверьте, нет ли чего-то подобного
<?php
session_start();
if (isset($_SESSION["SESSION_EMAIL"]))
{
echo 'Session is active <br>';
echo $_SESSION["SESSION_EMAIL"];
} else echo"session is ded";
// it prints out an error if it screws up here
?>
надеюсь, это поможет
или
Вы можете проверить наличие другой переменной сеанса
Комментарии:
1. Я бы также добавил !empty($_SESSION[‘SESSION_EMAIL’]) к проверке «Сеанс активен»
2. да, может быть, bt это может привести к появлению уведомления без определения SESSION_EMAIL, когда эта переменная не установлена…
3. Хорошо, я сделал то, что вы предложили, но это только подтверждает, что сеансы удаляются после обновления, хотя этого не должно быть.
4. Как вы можете прочитать ниже в моем ответе, я устранил проблему, просто перезапустив все конфигурации моего сервера. В знак благодарности я полагаю, что выбор вашего ответа будет подходящей наградой за ваши усилия и извинит мою глупость. Спасибо!