2015-05-08 4 views
1

Я работаю над школьным проектом, где мне нужны мои .php-страницы, сообщающие. У меня есть header.php, где я устанавливаю соединение с базой данных и запускаю сеанс. Для того, чтобы начать сеанс только один раз, я использовал это:

if(session_id() == '') { 
    session_start(); 
} 

PHP версия PHP 5.3.10-1 ubuntu3.18 с Suhosin-Patch (кли)

Я пытаюсь передать некоторые переменные $ _SESSION между страницами, но они остаются неустановленными, когда я пытаюсь использовать их на странице, которая их не задает. Я вижу, что многие люди жаловались на это, но я все еще не могу найти решение.

Логин-form.php

<?php 
     if (isset($_SESSION["login-error"])) { 
      echo '<p>'.$_SESSION["login-error"].'</p>'; 
     } 
    ?> 

login.php

$_SESSION["login-error"]= "Username or password incorrect"; 

Существует фрагмент кода, что не работает для меня. Спасибо

+1

Попробуйте добавить 'session_start();' в самом начале страницы? Это весь код, который у вас есть или есть больше? Получают ли вы какие-либо сообщения об ошибках? – Maximus2012

+0

У меня больше кода, и на всех страницах есть заголовок. поэтому, когда я помещаю его наверху, я получаю это сообщение: сеанс уже запущен » – ivanacorovic

+2

Вам не нужно условие. Вы не можете взаимодействовать с сеансом до тех пор, пока он не будет включен. –

ответ

0

Вы можете попробовать это.

В файле функции поместить этот

function is_session_started() 
{ 
    if (php_sapi_name() !== 'cli') { 
     if (version_compare(phpversion(), '5.4.0', '>=')) { 
      return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE; 
     } else { 
      return session_id() === '' ? FALSE : TRUE; 
     } 
    } 
    return FALSE; 
} 

Затем вы можете запустить на каждой странице, которую сессия началась

if (is_session_started() === FALSE) session_start(); 

С этим я думаю, вы должны быть хорошо идти о начале сеанса через страницы. Далее следует убедиться, что вы установили сеанс в значение. Если вы не уверены, что отключает сеансы, вы можете попробовать var_dump($_SESSION) в разных частях вашего кода, чтобы быть уверенным, в какой момент он сбрасывается, а затем знает, как с этим бороться.

+0

var_dump ($ _ SESSION) дает мне ошибку. – ivanacorovic

+0

Какая ошибка? Я надеюсь, что вы 'var_dump ($ _ SESSION);' или вы можете попробовать 'echo '

',print_r($_SESSION, true),'
';' – OmniPotens

+0

Эхо его работы, но все же переменные SESSION не сохраняются вообще между страницами – ivanacorovic

0

Переменные, вероятно, не установлены, поскольку вы не активируете переменные сеанса с помощью session_start().

session_id() == '' не является правильным условным. Вместо этого используйте:

if (!isset($_SESSION)) { session_start();} 

если вы сессия началась, то вы можете установить сеанс переменной

if (!isset($_SESSION["login-error"])) { $_SESSION["login-error"]= "Username or password incorrect";} 

Перед тем, как вызвать $ _SESSION [ «Вход-ошибка»], тип session_start(), только для тестирования, чтобы найти, когда отсутствует сигнал сеанса. Вы сказали, что

PHP переменные $ _SESSION не передается между страницами

session_start() и переменные сессии должны быть включены в начале каждой страницы или в том месте, где переменные сессии в настоящее время называется (через общий файл, bootstrap, config или sth) в начале каждой страницы. т.е. требуется команда для чтения этих данных с сервера.

+0

Нет, сеанс запущен, я могу получить session_id(), но остальные этого не делают. – ivanacorovic

+0

обновил ответ –

0

Поскольку мой файл header.php включен «соединение.файл PHP», я поставил

session_start(); 

в начале connection.php и удалил его из header.php файл. Теперь он работает отлично. Спасибо всем за помощь!

0

PHP сессий полагаться на компоненты HTTP, как и Cookies, и GET-переменные, которые явно недоступны при вызове сценария через CLI. Вы можете попробовать подделывать записи в суперглобальных файлах PHP, но это совершенно нецелесообразно. Вместо этого самостоятельно реализуйте основной кеш.

<?php 
class MyCache implements ArrayAccess { 
    protected $cacheDir, $cacheKey, $cacheFile, $cache; 

    public function __construct($cacheDir, $cacheKey) { 
     if(! is_dir($cacheDir)) { throw new Exception('Cache directory does not exist: '.$cacheDir); } 
     $this->cacheDir = $cacheDir; 
     $this->cacheKey = $cacheKey; 
     $this->cacheFile = $this->cacheDir . md5($this->cacheKey) . '.cache'; 

     // get the cache if there already is one 
     if(file_exists($this->cacheFile)) { 
      $this->cache = unserialize(file_get_contents($this->cacheFile)); 
     } else { 
      $this->cache = []; 
     } 
    } 

    // save the cache when the object is destructed 
    public function __destruct() { 
     file_put_contents($this->cacheFile, serialize($this->cache)); 
    } 

    // ArrayAccess functions 
    public function offsetExists($offset) { return isset($this->cache[$offset]); } 
    public function offsetGet($offset) { return $this->cache[$offset]; } 
    public function offsetSet($offset, $value) { $this->cache[$offset] = $value; } 
    public function offsetUnset($offset) { unset($this->cache[$offset]); } 
} 

$username = exec('whoami'); 
$c = new MyCache('./cache/', $username); 

if(isset($c['foo'])) { 
    printf("Foo is: %s\n", $c['foo']); 
} else { 
    $c['foo'] = md5(rand()); 
    printf("Set Foo to %s", $c['foo']); 
} 

Примеры прогона:

# php cache.php 
Set Foo to e4be2bd956fd81f3c78b621c2f4bed47 

# php cache.php 
Foo is: e4be2bd956fd81f3c78b621c2f4bed47 

Это довольно много сеансов все РНР сделать, за исключением случайного кэша ключи генерируются [ака PHPSESSID] и устанавливаются как куки, и каталог кэша session.save_path из php.ini.

Смежные вопросы