Вы правы, состояние вашей заявки не переносится с запроса на запрос.
В отличие от настольных приложений, веб-приложения не останутся инициализированными, потому что для сервера каждый раз он может быть другим посетителем, желающим чего-то совершенно другого. Вы знаете, кто использует настольное приложение, но не обязательно знаете, кто запрашивает страницу. Представьте, что 10 пользователей делают разные вещи одновременно в вашем веб-приложении? Вы не сможете поддерживать работу всего приложения для каждого из этих посетителей. Вообразите с 10 000 посетителей ...
Хотя есть способы сохранить некоторые данные от запроса к запросу. Да, приложение будет каждый раз переинициализироваться, но затем вы сможете перезагрузить состояние того, что вы делали. Он всегда вращается вокруг одних и тех же общих методов:
Cookies; Файлы cookie - это небольшой файл, который хранится на стороне клиента и который будет доступен для вас при каждом запросе. В PHP это доступно с использованием переменной $ _ COOKIE . В любом случае, вы можете сериализовать экземпляры ваших классов и затем перезагрузить их. Проблема в том, что вы не захотите помещать туда конфиденциальные данные, поскольку любое (вредоносное) тело может их увидеть и изменить.
POST или GET; В каждом запросе вы передаете состояние в запросе $ _ GET (URL-адрес, такой как http://localhost/myscript.php?iamatstep=4. или через $ _ POST , например, с использованием скрытого поля ввода в форма. Эти данные могут быть зашифрованы и имеют смысл только для вас, но тем не менее, вы возвращаете конфиденциальные данные клиенту, и любой может возиться с этим.
База данных, диск; Или что-нибудь еще на сервере. Опять же, вы сериализуете свои данные в файле, например, в конце запроса, готового к повторному использованию для следующего запроса. Основным преимуществом является то, что он остается на вашем сервере. Недостатком является то, что на данный момент вы не знаете, какие данные извлекать для какого запроса, поскольку в вашем приложении одновременно может быть несколько пользователей ...
И здесь вступает в игру понятие $ _ SESSION . Это просто упакованный способ использования всего этого одновременно. Это не волшебство, как часто это воспринимается новичками. Когда вы используете сеанс, данные, помещенные в $ _SESSION, сохраняются где-то на сервере (обычно это файл во временном каталоге, хотя его можно изменить на что-то другое, например, в базу данных), и уникальный идентификатор присваивается этому сеансу и передается в файле cookie, который будет следовать за посетителем от запроса к запросу. Таким образом, единственное, что на стороне клиента - это большое число в куки. При следующем запросе браузер сообщает PHP на сервере, что это сеанс с номером 12345, загружает соответствующий файл, если он существует, и затем данные снова доступны для вас. Если куки не включены, их можно передать в GET или POST, хотя часто лучше туда не идти (см. Примечание session.use_trans_sid ).
Часто на каждой из ваших страниц вам требуется аутентификация.
<?php
// verify if we have a current session
if (isset($_SESSION['login'])) {
// get data in current session
$username = $_SESSION['login']['username'];
$isLoggedIn = $_SESSION['login']['isLoggedIn'];
} else {
$username = '';
$isLoggedIn = false;
}
// take care of the unauthorized users
if (!$isLoggedIn) {
// maybe a redirection here...
}
// do the things a logged in users has the permission to do
И чтобы установить сессию, она, вероятно, будет выглядеть так:
<?php
// handle the form post of your login page for example
if (isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// verify the username and password against a database
if ($everythingIsOkay) {
// we can consider this user logged in and create a session
$_SESSION['login']['username'] = $username;
$_SESSION['login']['isLoggedIn'] = true;
// and now maybe redirect the user to the correct page
}
}
// raise an error about an invalid login
И, наконец, может быть страница logout.php, которая будет делать что-то вроде этого:
<?php
unset($_SESSION['login']);
// redirect the user to the login page