2014-02-08 11 views
0

У меня есть этот код в страницы индекса по умолчанию:Session_start не работает или Session_destroy не работает?

<?php 
$_SESSION['user'] = 'Bill'; 
print $_SESSION['user']; 

$_SESSION = array(); 
session_destroy(); 

$_SESSION['user'] = 'Andy'; 
print $_SESSION['user']; 
?> 

Выход является следующее:

Bill 
Warning: session_destroy(): Trying to destroy uninitialized session in C:\xampp\htdocs\DSP\index.php on line 15 
Andy 

Очевидно, что я должен инициализировать сессию session_start(), но это мои вопросы:

1) Однако почему я могу хранить сеанс без функции session_start()?

2) Теперь я поставил session_start() функции в верхней части кода:

<?php 
session_start(); 

$_SESSION['user'] = 'Bill'; 
print $_SESSION['user']; 

$_SESSION = array(); 
session_destroy(); 

$_SESSION['user'] = 'Andy'; 
print $_SESSION['user']; 
?> 

Теперь выход заключается в следующем:

Bill 
Andy 

Мой вопрос теперь:

3) Почему Энди напечатан на выходе? Почему компилятор НЕ дает мне ошибку, что сеанс должен быть запущен снова beacuse Я уничтожил его раньше командой session_destroy()?

Спасибо всем!

+0

Можете ли вы приготовить пищу без огня или любого источника энергии? Нет, вы не можете, потому что без этого вы не можете приготовить еду. Аналогично, если вы не запустите session_start(); ваш код ничего не знает о сеансе. –

+0

Я знаю это, но мой вопрос в том, почему сеансы в этом примере установлены, даже если session_start не существует. –

ответ

0

Однако, почему я могу хранить сессию без функции session_start()?

Потому что это обычный массив, к которому можно получить доступ как таковой. То же самое с $_POST, $_GET и другими супер-глобальными массивами. Однако сеанс создается только после вызова session_start(), поэтому пытается хранить информацию в массиве до инициализации сеанса бессмысленно.

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

<?php 
session_start(); 

$_SESSION['user'] = 'Bill';  
var_dump($_SESSION); 

$_SESSION = array(); 
session_destroy();  
var_dump($_SESSION); 

$_SESSION['user'] = 'Andy'; 
var_dump($_SESSION); 

Выход есть:

array(1) { 
    ["user"]=> 
    string(4) "Bill" 
} 

array(0) { 
} 

array(1) { 
    ["user"]=> 
    string(4) "Andy" 
} 

Это то, что происходит выше:

  • Сессия инициализируется с использованием session_start()
  • Строка Bill с ключ user добавлен в ассоциативный массив
  • session_destroy() уничтожает данные сеанса, которые хранятся в хранилище сеансов.($_SESSION теперь пустой)
  • Другая строка Andy с ключом user добавляется в ассоциативном массиве

Как и следовало ожидать, результат будет Andy. Я не вижу проблемы?

+0

Ах, ладно, большое спасибо Амала :) Но последние вопросы, как я могу действительно уничтожить сеанс? Правильно ли это, как я писал? –

+0

@ пользователь3124885: Да, это. [Этот пример из руководства PHP] (http://www.php.net/manual/en/function.session-destroy.php#example-4778) является * более правильным. (См. Также: [Лучший способ полностью уничтожить сеанс] (http://stackoverflow.com/questions/3948230/best-way-to-completely-destroy-a-session-even-if-the-browser-is- не закрыто)) –

+0

Спасибо большое Амаль: D –

0

Вы должны отключить сеанс перед попыткой его уничтожить.

session_unset(); 
session_destroy(); 

http://www.php.net/manual/en/function.session-unset.php

+0

session_unset() устарел, теперь он использует $ _SESSION = array(); –

+0

, чтобы удалить определенный элемент из массива, вы должны использовать 'unset ($ _SESSION ['varname']);'. Btw, я не могу видеть документацию для этой устаревшей функции, 'session_unregister()' был устарел, насколько мне известно. – Mutale

+0

В руководстве Php я прочел следующее: Осторожно: НЕ отмените всю $ _SESSION с unset ($ _ SESSION), так как это отключит регистрацию переменных сеанса через супергелбал $ _SESSION. –

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