Моя сессия php ведет себя странно - PullRequest
0 голосов
/ 05 мая 2011

Похоже, я до сих пор не понимаю сессий. Данные сеанса просто не будут доступны для включенных файлов или сохранятся при перезагрузке страницы.

У меня есть следующий код:

page1.php

<?php
/*
Template Name: Some template
*/

  session_start();  
  $_SESSION['start'] = 'start';
  print_r($_SESSION);

  if(some condition)      
    include('include1.php');
  else
    include('include2.php');
?>

include1.php

<?php
  /* Some comments here */

  $_SESSION['test'] = 'Test text';
  print_r($_SESSION);
?>

include2.php

<?php
  /* Some comments here */

  print_r($_SESSION);
?>

Page1 сначала включает include1.php, где я делаю кое-что. Затем я загружаю страницу 1, включая include2.php.

Результат вывода print_r():

Array ( [start] => start ) // From page 1
Array ( [start] => start [test] => Test text )  // From include 1
Array ( [start] => start ) // From include 2

Мой вопрос:
1) Почему [include] не выводится в page1.php в первый print_r() после перезагрузки?
2) Почему '[include] не выводится в include2.php?

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

UPDATE
Мой "actall" включает код:

  switch($action) {
    case 'a': include_once('include/include1.php'); break;
    case 'b': include_once('include/include2.php'); break;
    //default:  
  }
  print_r($_SESSION); // <- Here all registered session variables are outputed

Ответы [ 3 ]

0 голосов
/ 05 мая 2011

Мне кажется, что куки не сохраняются.Проверьте куки в вашем браузере на PHPSESSID или подобное.Если этот файл cookie никогда не устанавливается, скорее всего, потому, что вы пытаетесь запустить сеанс ПОСЛЕ отправления заголовков.Включение предупреждений покажет вам, что это так.

Заголовки будут отправляться PHP, как только вы начнете нормальный вывод.Таким образом, если в page1 у вас есть этот код:

<?php
    echo "<html>";

    // Session starts here...
?>

, тогда сеанс не может быть сохранен на стороне клиента и будет начинаться с нуля каждый раз, когда пользователь загружает страницу.Аналогичная ситуация возникает, если в файле есть пробелы до или после тегов PHP начала / конца.

0 голосов
/ 05 мая 2011

Код, который вы отображаете, работает так, как он должен:

Вы инициализировали сеансы - session_start()

Вы создали первый элемент в массиве - start

При первом включении вы добавили элемент массива в $ _SESSION, добавив ключ test

Когда вы выводите первое включение, оно включает и start и test

Во втором включении вы не добавили никаких элементов массива в $ _SESSION, поэтому он выводит только start

Указанный вами код включения вызывает только на первой или второй странице, но не на обеих.

0 голосов
/ 05 мая 2011

попробуйте использовать session_name и session_id

http://php.net/manual/en/function.session-name.php

http://php.net/manual/en/function.session-id.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...