2012-01-23 5 views
12

У меня это написано в первой строке на каждой странице моего сайта.Сессия PHP не сохраняется

include("restd.php"); 

и restd.php содержит следующие строки:

@session_start(); 
if(isset($_SESSION['id'])) 
{ 
} 
else 
{ 
    header("location:index.php"); 
} 

Проблема я столкнулся в том, что когда-либо я нажимаю или сделать что-то на моем сайте. он выводит меня из системы и возвращает меня в index.php.

Я уверен, что это как-то связано с сеансом. ive попробовал каждую вещь, чтобы избежать этой проблемы, но я также использовал restd.php, потому что я не хочу, чтобы кто-то копировал URL-адрес кого-то и вставлял и попадал на сайт.

любой, кто только вошёл в систему, может просматривать другие страницы. если они не войдут в систему, они будут перенаправлены на index.php

EDIT: и ребята путают то, что все это отлично работает на моем тестовом сервере, который является easyPHP-5.3.8.0, но эта проблема подходит когда я загружаю все файлы на свой сервер.

+0

Вы можете разделить содержание страницы, которые вы в том числе «restd.php»? – Eray

+8

Зачем вам тишина session_start()? Удалите знак @ и проверьте, не возникла ли ошибка. Вы действительно не должны использовать знак @. –

+1

Вы устанавливаете $ _SESSION ['id'] где угодно? – drew010

ответ

37

Ваш Сесси в каталоге (возможно, /tmp/) не доступен для записи.

Обратитесь к session_save_path(), если это возможно для записи.

if (!is_writable(session_save_path())) { 
    echo 'Session path "'.session_save_path().'" is not writable for PHP!'; 
} 
+0

проблема в том, что все это отлично работает с моим тестером g, который является easyPHP, но все проблемы начинаются, когда я пытаюсь что-либо сделать на своем сервере. – Samir

+1

session_save_path определен в файле php.ini. Вероятно, на вашем тестовом сервере это папка, доступная для записи apache, но на вашем сервере это не так. Проверьте разрешения этой папки. – makriria

+0

Запустите эти три строки на своем сервере. Если он выведет уведомление, ваш сервер не сможет записать файлы сеанса в этот каталог! – powtac

5

ли вы на самом деле установить $ _SESSION [ «ID»] на странице ...

То, что вы пытаетесь сделать здесь:

  1. Начало сеанса и загрузите $ _SESSION от обработчик сеанса
  2. Проверка, если $ _SESSION содержит ключ 'идентификатор'
  3. Перенаправление на index.php, если $ _SESSION [ 'ID'] не установлено

Вы действительно делаете это в index.php?

session_start(); 
$_SESSION['id'] = something; 
+0

nope! не в index.php. Я делаю это в logged.php, который содержит код, который проверяет, зарегистрировано ли имя пользователя, которое входит в систему, и если он зарегистрирован, а затем session_start(); и его id равен $ uid = $ _SESSION ['id']; и затем заголовок ("location: home.php? $ uid"); – Samir

+0

Затем вы используете session_start() в logged.php перед сохранением $ uid в $ _SESSION ['id']? –

+0

да я. infact вот мой код logged.php: http://codepad.viper-7.com/rIvRLP – Samir

4

вам нужно объявить $_SESSION['id']:

file1.php

session_start(); 

$_SESSION['id'] = '123' 

file2.php

include 'file1.php' 

if(isset($_SESSION['id'])) 
{ 

} 
else 
{ 
    header("location:index.php"); 
} 
+0

в моем случае file1.php - logged.php, который проверяет, был ли зарегистрированный пользователь регистрации зарегистрирован или нет, а затем извлекает hisid из базы данных и назначает он в $ uid и затем запускает сеанс, а затем создает переменную $ uid = $ _SESSION ['id']; – Samir

+0

Трудно сказать, не видя ваш код вообще (restd.php и один файл, который включает restd.php), может быть, вы может опубликовать ваш код здесь или если ваш код слишком длинный, используйте codepad.viper-7.com –

+0

вот мой код для logged.php: http://codepad.viper-7.com/rIvRLP – Samir

0

пар вещи:

  1. ваш заголовочный файл не имеют <?php ?> тегов, так что содержание не будет оценен как PHP

  2. session_start должен вызываться перед началом вывода что-нибудь. Это так?

+0

Да, у нее есть теги . его просто, что я использую их здесь в вопросе :), и да, я включаю файл restd.php в первую строку каждого файла :) – Samir

+0

@SyedSamirUddin, стоит попробовать. Как насчет вашего кода выхода? Есть ли вероятность, что он может быть вызван, прежде чем вы перейдете на следующую страницу? Глядя на ваш logged.php (btw: исправить SQL-инъекции), что именно происходит, если логин не работает? одна возможная разница между тестовым сервером (windows?) и хостинговым пакетом Linux заключается в том, что mysql чувствителен к регистру в linux, но не в окнах. Поэтому, если ваше имя столбца было «PassWord», ваши запросы будут работать в Windows, но не будут работать в Linux. Это сложно, потому что linux может показывать «пароль» в phpmyadmin и все еще ожидать PassWord. – Sylverdrag

+0

код выхода имеет только session_destroy(); затем заголовок в index.php и в отношении чувствительных к регистру coloumns.Я не назвал таких coloumns. Я использую просто такие слова, как «пароль», не похожий на «passWord». coz, который позже создаст путаницу. – Samir

0

Вы по-прежнему даже не отвечаете, где вы устанавливаете $ _SESSION ['id']. $pid = $_SESSION['id'] не устанавливает переменную сеанса. session_start() подходит к НИЧЕГО сеанса, он не отображается перед включением.

+0

здесь код logged.php: http: //codepad.viper-7.com/rIvRLP – Samir

+0

ive не написано session_start(); потому что я включаю файл restd.php, у которого есть session_start(); в этом :) – Samir

0

У меня была такая же проблема, и я нашел для нее обход. Если кто-нибудь может объяснить, почему сеанс не читается, даже если файл 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]

Даже если куки был там, и я предотвращено начать новую сессию, сессия не был прочитан и запущен, поэтому никакие переменные сессии не были доступны. В этом случае я проверяю, был ли первый сеанс запущен (не используя session_status(), потому что он не существует в PHP 3.5, который по какой-то причине является наиболее распространенным среди хостов). Если в PHP не было запущено ни одного сеанса, я проверяю, было ли это ранее запущено, проверяя переменные cookie и GET. Если идентификатор сеанса был найден, сценарий возобновляет сеанс с этим идентификатором. Если идентификатор отсутствует, пользователь перенаправляется на индекс.

<?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(); 
} 
1

Я знаю, что это старая нить, но следующее помогло мне с той же проблемой после нескольких часов отчаяния. Найдено по: 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(); 
?> 

Надеюсь, это поможет вам сэкономить время.

0

Проверьте, может быть, ваш сеанс пути не существует так что вы можете сохранить PHP сеанса пути с помощью:

ini_set(' session.save_path','SOME WRITABLE PATH'); 
Смежные вопросы