Я установил свой сеанс так в моем PHP-коде: $_SESSION['user_id'] = $login;
и это, кажется, отлично работает, пока загружается на мой сервер и переносится на разные страницы, однако, когда я тестирую сайт на своей локальной машине, сеанс кажется немедленно отключенным после выхода из сценария, где он установлен.
Я тестирую свою локальную машину с помощью XAMPP и точно такого же кода.
Я не уверен, почему эта проблема возникает и будет очень признательна за любой полезный ответ.
$_SESSION['user_id'] = $login; echo '<META HTTP-EQUIV="refresh" content="0;URL=../home.php">';
Вот моя вся функция, в которую я вхожу (она входит в класс):
public function loggingIn(){ session_start(); $db = new Database('localhost','root','','userdata'); $userFunctions = new Users($db); $username = $_POST['usernameInput']; $password = $_POST['passwordInput']; if(empty($username) || empty($password)){ $this->errors['u&p'] = 'Please Enter Your Username AND Password'; $this->printE(); } elseif($userFunctions->user_exists($username)===false){ $this->errors['nm'] = 'That Username/Password Combination Is Not Valid'; $this->printE(); } else { $login = $userFunctions->login($username, $password); if($login === false){ $this->errors['nm'] = 'That Username/Password Combination Is Not Valid'; echo 'Login Failed!'; } else { if(!$userFunctions->economyTableExistsForUser($login)){ $userFunctions->createEconomyTableForUser($login); } if(!$userFunctions->schoolTableExistsForUser($login)) { $userFunctions->createSchoolTableForUser($login); } $_SESSION['user_id'] = $login; echo $_SESSION['user_id']; // working fine header('Location: ../home.php'); } } }
Предположим, что у вашей домашней машины нет:
session.autostart = On
в вашем php.ini , в то время как ваша другая машина, очевидно, есть.
Убедитесь, что вы установили в своем PHP-коде:
session_start();
PHP: session_start – Руководство
Если вы этого не сделаете, ваша сессия не будет запущена, если моя первая гипотеза не верна.
Кроме того, вы должны проверить версию PHP на своем локальном хосте и настройках в php.ini . Убедитесь, что каталог, в котором хранятся файлы сеанса, можно записывать, а файлы сеансов действительно существуют.
Вам лучше использовать PHP-решение для перенаправления:
header("Location: /"); exit();
PHP имеет функции, которые изменяют заголовки HTTP. Некоторые из них:
Линейные разрывы и пробелы могут быть проблемой, но есть также невидимые последовательности символов, которые могут вызвать Warning: Cannot modify header information
, например, спецификацию UTF-8 (знак байта-ордера) . Попробуйте повторно сохранить файл, убедившись, что он сохранен как UTF-8 (no BOM)
.
Чтобы правильно отладить ваш код, убедитесь, что PHP отображает все предупреждения и уведомления. Запустите его до начала сеанса:
ini_set('display_errors', -1);
Вы также должны проверить настройку session.gc_maxlifetime
:
session.gc_maxlifetime
session.gc_maxlifetime указывает количество секунд, после которых данные будут рассматриваться как «мусор» и очищены. Сбор мусора происходит во время начала сеанса.
Чтобы просмотреть пробелы в Sublime Text, отредактируйте настройки:
// Set to "none" to turn off drawing white space, "selection" to draw only the // white space within the selection, and "all" to draw all white space "draw_white_space": "selection",
Вы можете установить его в настройках-> Настройки по умолчанию. Если вы отредактируете свои пользовательские настройки «Настройки» – «Настройки» – «Пользователь» и добавьте строку, как показано ниже:
{ "font_size": 10, "draw_white_space": "all" }
Также убедитесь, что он показывает всем другим специальным символам, чтобы правильно отлаживать ваш код!
Наконец, попробуйте добавить session_write_close();
прямо перед перенаправлением.
Установите в своем PHP-файле до session_start();
, session.save_path = "/home/username/tmp";
директивы. Создайте tmp
dir вне public_html . Убедитесь, что tmp
dir имеет chmod 770 и создан с теми же привилегиями пользователя и группы. Запустите ls -lsa
в домашнем каталоге, чтобы проверить, имеет ли новый каталог тот же пользователь / группу, что и другие каталоги, например public_html . Если нет, убедитесь, что вы изменяете разрешения с правами root на tmp
, запустив chown username:groupname /home/username/tmp
.
Быстрое обновление по этому вопросу. Я нашел этот ответ очень полезным, однако, обратите внимание, что при установке XAMPP запись php.ini для session.autostart = On немного отличается. Я нашел следующее:
; Инициализировать сеанс при запуске запроса. ; http://php.net/session.auto-start session.auto_start = 0
Я изменил это на:
; Инициализировать сеанс при запуске запроса. ; http://php.net/session.auto-start session.auto_start = 1
Убедитесь, что файлы cookie сеансов включены в php.ini
( xamp\php\php.ini
).
session.use_cookies=1
В вашей проверке php.ini:
variables_order
содержит букву S
session.save_path
существует и доступен для записи пользователем, под которым работает PHP. Если вы используете PHP, встроенный в документы .htm / .html, вам необходимо убедиться, что Apache может их обработать соответствующим образом. Это делается путем редактирования httpd.conf и добавления строки
AddType application/x-httpd-php .html .htm
в раздел <IfModule mime_module>
Я боролся с этой проблемой, но решил …
В /opt/lampp/etc/php.ini
попробуйте изменить эту строку:
session.save_path = "/var/lib/php/session"
Для этого:
session.save_path = "/opt/lampp/var/session"
Примечание. Возможно, вам нужно создать папку «session» в /opt/lampp/var
Session Issue Fixed in Xampp 7.1.6 with following Changes in php.ini Line #1403 set: session.auto_start = 1
Включить файлы cookie сеанса в php.ini (C: \ xamp \ php \ php.ini).
ИЗМЕНЕНИЕ
session.use_cookies=0
К
session.use_cookies=1
И не забудьте перезапустить xampp