Сессия PHP не сохраняет
У меня это написано в первой строке на каждой странице моего сайта.
include("restd.php");
и restd.php содержит следующие строки:
@session_start();
if(isset($_SESSION['id']))
{
}
else
{
header("location:index.php");
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю или что-то делаю на своем веб-сайте. он выводит меня из системы и возвращает меня в index.php.
im уверен, что это связано с сеансом. ive попробовал каждую вещь, чтобы избежать этой проблемы, но я использовал restd.php, потому что я не хочу, чтобы кто-то копировал URL-адрес кого-то и вставлял и попадал на веб-сайт.
любой, кто войдет в систему, сможет просматривать только другие страницы. если они не вошли в систему, они будут перенаправлены на index.php
EDIT: и ребята путают то, что все это отлично работает на моем тестовом сервере, который является easyPHP-5.3.8.0, но эта проблема возникает, когда я загружаю все файлы на свой сервер.
Ответы
Ответ 1
Каталог сеанса (возможно, /tmp/
) не доступен для записи.
Обратитесь к session_save_path()
, если он доступен для записи.
if (!is_writable(session_save_path())) {
echo 'Session path "'.session_save_path().'" is not writable for PHP!';
}
Ответ 2
Фактически вы задаете $_SESSION ['id'] на странице...
Что вы здесь делаете:
- Запустите сеанс и загрузите $_SESSION из обработчика сеанса
- Проверьте, содержит ли $_SESSION ключ 'id'
- Перенаправить на index.php, если $_SESSION ['id'] не установлен
Вы действительно делаете это в index.php?
session_start();
$_SESSION['id'] = something;
Ответ 3
вам нужно объявить $_SESSION['id']
:
file1.php
session_start();
$_SESSION['id'] = '123'
file2.php
include 'file1.php'
if(isset($_SESSION['id']))
{
}
else
{
header("location:index.php");
}
Ответ 4
Я знаю, что это старый поток, но следующее помогло мне с той же проблемой после нескольких часов отчаяния. Найдено по: http://php.net/manual/de/function.session-save-path.php
Я сделал папку рядом с общедоступной html-папкой и разместил эти строки в самой первой точке index.php
Расположение папки сеанса:
/домены/счета/сеанс
расположение index.php
/domains/account/public_html/index.php
Что я поместил в index.php в строке 0:
<?php
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
?>
Надеюсь, это сэкономит вам время.
Ответ 5
Пара вещей:
-
ваш файл include не имеет тегов <?php ?>
, поэтому контент не будет оцениваться как PHP
-
Session_start необходимо вызвать, прежде чем вы начнете выводить что-либо. Это тот случай?
Ответ 6
Вы все равно даже не отвечаете, где вы устанавливаете $_SESSION ['id']. $pid = $_SESSION['id']
не задает переменную сеанса. session_start()
предшествует ANYTHING session related, он не отображается перед включением.
Ответ 7
У меня была такая же проблема, и я нашел для нее обход. Если кто-нибудь может объяснить, почему сеанс не читается, даже если файл cookie существует, сообщите мне.
<?php
// logged.php
// The PHP session system will figure out whether to use cookies or URLs to pass the SID
if(!isset($_COOKIE['PHPSESSID']) && !isset($_GET['PHPSESSID']) && authenticationRoutine(/* Returns true if succesfully authenticated */) ) {
session_id(uniqid("User--"));
session_start();
$_SESSION['id']=session_id();
}
?>
<?php
// Insecure restd.php (The user can forge a stolen SID cookie or URL GET request, but that is inherent with PHP sessions)
if(!isset($_COOKIE['PHPSESSID']) && !isset($_GET['PHPSESSID']) {header('Location: index.php')}
?>
.
[EDIT]
Несмотря на то, что файл cookie был там, и я запретил запуск нового сеанса, сеанс не читался и не запускался, поэтому никаких переменных сеанса не было. В этом случае я проверяю, был ли сначала запущен сеанс (не используя session_status()
, потому что он не существует в PHP 3.5, который по какой-то причине является наиболее распространенным среди хостов). Если в PHP не было запущено ни одного сеанса, я проверяю, было ли это ранее запущено, проверяя переменные cookie и GET. Если идентификатор сеанса был найден, script возобновляет сеанс с этим идентификатором. Если идентификатор отсутствует, пользователь перенаправляется на индекс.
<?php
// restd.php
if(empty(session_id())) {
if(isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) {session_id($_COOKIE['PHPSESSID']);}
elseif(isset($_GET['PHPSESSID']) && !empty($_GET['PHPSESSID'])) {session_id($_GET['PHPSESSID']);}
else {header('Location: index.php'); exit(0);}
session_start();
}
Ответ 8
Проверьте, может быть, ваш путь сеанса не существует
поэтому вы можете сохранить путь к сеансу PHP, используя:
ini_set(' session.save_path','SOME WRITABLE PATH');