Php уничтожить переменную сессии

Работа с сессиями
Простая авторизация

$_SESSION — ассоциативный массив, содержащий переменные сессии, которые доступны для текущего скрипта. Это суперглобальная переменная , она доступна во всех контекстах скрипта.

Сессия — очень полезная возможность, которая позволяет, в том числе, передавать данные между страницами.

Это значит, коль $_SESSION — глобальный массив, то если мы запишем в него какие-то данные на одной странице, то эти данные будут доступны на другой странице на протяжении всей сессии (на протяжении всего сеанса), чего нет с любыми другими массивами. Конец сессии или сеанса — это закрытие браузера .

Для работы с сессиями существуют специальные функции: php.net

Наиболее полезные функции для работы с сессиями

session_start — открывает сессию, либо возобновляет ее, если файл сессии был найден.
session_unset — она удаляет все переменные текущей сессии.
session_destroy — уничтожает все данные, связанные с текущей сессией. Данная функция не удаляет какие-либо глобальные переменные, связанные с сессией и не удаляет сессионные cookie.
session_id — эта функция используется для получения или установки идентификатора текущей сессии.
session_name — возвращает имя текущей сессии. Если задан параметр name, session_name() обновит имя сессии и вернет старое имя сессии.

Открытие сессии

session_start — это та функция, которую мы должны выполнить, перед тем, как работать с сессиями. Данная функция запускает или открывает сессию и по сути, поскольку нам необходимо хранить данные, которые будут доступны между страницами, то сессия — это ничто иное как файл, который хранится во временной папке (эта папка будет хранится в папке: userdata/temp для Open Server ) В этот текстовый файл записываются все те данные, которые мы сохраняем в сессию. И когда мы запускаем на выполнение функцию session_start , то она создает такой файл либо обращается к нему, если файл уже был создан ранее. Причем этот файл индивидуален для каждой открытой сессии. Это значит, что если мы обратимся к одному и тому же скрипту из двух различных браузеров, то под каждый браузер, под каждого клиента будет открыт свой файл сессии и эти файлы никак друг с другом не пересекаются. Из этого следует, что с помощью сессий, мы можем организовать механизм аторизации пользователя, то есть получения доступа к какой-то закрытой части сайта.

Читайте также:  Remove all outlines css

Для того, чтобы понять, что данный файл принадлежит конкретному клиенту — делается это посредством куки .

Куки — это тот же самый файл, который хранится не на сервере, а на стороне клиента (в браузере), в нем содержится индификатор , который совпадает с идификатором файла , который лежит на сервере.

Запись и получение данных из сессии

Создадим простое приложение, с секретной страницей, доступ к которой будет иметь только пользователь, который введет правильные данные.

Для примера создадим три файла: sess1.php, sess2.php и secret.php

В файле sess1.php запишем в массив $_SESSION имя Андрей . При обновлении страницы в браузере это имя — выведится.

Функция session_start чувствительна к выводу — перед вызовом данной функции не должно быть никакого вывода в браузер . Если поставить перенос строки, который является выводом в браузер, то возникнет ошибка.

// здесь ничего не должно быть
session_start (); // открываем сессию

echo session_id (); // индификатор сессии, который равен значению куки

$_SESSION [ ‘name’ ]= ‘Андрей’; // запишем в массив имя
echo $_SESSION [ ‘name’ ]; // выводим $_SESSION[‘name’]

// выведет: Андрей
// в файле сессии будет записано: name|s:12:»Андрей»;
?>

После обновлении страницы получим:

sess1.png

В файле сессии будет сделана запись: name|s:12:»Андрей» — сериализованная строка — это один из способов хранения массивов данных, где:
— name — ключ
— s:12 — длина строки в байтах (в кодировке utf-8, буквы кирилицы равны двум байтам)
— Андрей — содержимое $_SESSION[‘name’]
Если закомментировать строку $_SESSION[‘name’]= ‘Андрей’ , то в браузере, при обнавлении все равно выведится имя Андрей, это значит, что в сессии эти данные были запомненны . В этом можно убедиться, открыв файл сессии.

В файле sess2.php откраваем сессию и получаем доступ, к тому, что лежит в сессии — к тому же $_SESSION[‘name’] .

session_start (); // открываем сессию
echo $_SESSION [ ‘name’ ]; // выводим $_SESSION[‘name’]
// выведет: Андрей
?>

Удаление данных из сессии

Если мы хотим удалить из сессии конкретное значени можно использовать функцию unset() , которая удаляет переменную — в данном случае нам надо удалить — $_SESSION[‘name’] . И удалив его, на какой то странице (на sess1.php), мы удаляем его целиком из сессии.

Если нам нужно удалить все значения сессии , то есть все переменные массива , можно использовать специальную функцию session_unset() которая удалит все сессионные переменные. Сессионый файл будет очищен.

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

session_start (); // открываем сессию

$_SESSION [ ‘name’ ]= ‘Андрей’ ; // запишем в массив имя
$_SESSION [ ‘login’ ]= ‘andrey’ ; // запишем в массив логин
echo $_SESSION [ ‘name’ ]; // выводим $_SESSION[‘name’]

// выведет: Андрей
// в файле сессии будет записано: name|s:12:»Андрей»;

unset ( $_SESSION [ ‘name’ ]); // удаляем из сессии конкретное значение
session_unset (); // удаляет из сессии все переменные
session_destroy (); // уничтожает сессию, включая и сам сессионный файл
?>

Простая авторизация

Создадим пункты меню и поместим их в каждый из файлов: sess1.php , sess2.php и secret.php . Наша задача — ограничить доступ к странице secret .

Что бы ограничить доступ к странице secret.php мы задаем простое условие (авторизация будет происходить по логину):

Если у нас не существует ( !isset ) в сессии ( $_SESSION ) элемент ( admin ) — мы завершим работу и выведем: «Вы не авторизованы!» ,

( die или exit — вывести сообщение и прекратить выполнение текущего скрипта)

если мы прошли проверку, то выведем: «Добро пожаловать, «

session_start() ; // открываем сессию

if ( ! isset ( $_SESSION [ ‘admin’ ])) die ( ‘Вы не авторизованы!’ );
echo «Добро пожаловать, < $_SESSION [ 'admin' ]>» ;
?>

На странице файл sess1.php создадим форму авторизации:
— action=»» — обработчик будет на этой же странице
— method=»post» — метод POST
— input type=»text» — поле ввода
— name=»login» — имя «login»
— type=»submit» — кнопка тип «submit»
— Login — надпись

Далее нам необходимо принять данные из формы: если не пуст ( !empty ) элемент с ключем login ( $_POST[‘login’] ), то мы должны сравнить, то что передал пользователь с каким-то нашим логином — с тем логином, который мы разрешаем для авторизации. Его определим в виде константы: имя константы — ADMIN , значение — строка admin — такой логин будет разрешен.

Далее проверяем: если у нас $_POST[‘login’] будет равен значению константы ADMIN , мы должны записать что-то в сессию, а именно создать сессионную переменную $_SESSION[‘admin’] = ADMIN , и выведем сообщение: «Вы успешно авторизовались!» .

В противном случае выведем: «Неверный логин» .

// определяем константу для сравнения с логином пользователя
define ( ‘ADMIN’ , ‘admin’ );

// открываем сессию
session_start();

// принимаем данные из формы
if (! empty ( $_POST [ ‘login’ ])) <
// создаем сессионную переменную
if ( $_POST [ ‘login’ ] === ADMIN ) <
$_SESSION [ ‘admin’ ] = ADMIN ;
echo ‘Вы успешно авторизовались!’ ;
> else echo ‘Неверный логин’ ;
>
>
?>

Избавление от проблемы F5

При обновлении страницы возникает проблема F5.

Чтобы избавиться от этой проблемы нам надо перезапросить страницу . Чтобы перезапросить страницу средствами PHP, мы можем сделать редирект : header(«location: sess1.php») . И для того, чтобы дальше ничего не выполнялось, мы должны завершить выполнение скрипта: die , а чтобы получить сообщение о регистрации его надо записать в сессию : $_SESSION[‘res’] = ‘Вы успешно авторизовались!’ и вывести: если у нас существует (if(isset)) в сессии $_SESSION элемент [‘res’] , то выведем его echo $_SESSION[‘res’] .

То же самое мы можем сделать и для ошибки: $_SESSION[‘res’] = ‘Неверный логин’ , И редирект теперь нужен для любого случая, и в случае ошибки, и в случае успеха. Вынесем его за пределы условий.

Удалим ненужную переменную из сессии: unset($_SESSION[‘res’]) .

// открываем сессию
session_start ();

// определяем константу для сравнения с логином пользователя
define ( ‘ADMIN’ , ‘admin’ );

// принимаем данные из формы
// если у нас что-то пришло POST-ом
if ( ! empty ( $_POST [ ‘login’ ])) <
// и если это равно константе ADMIN
if ( $_POST [ ‘login’ ] === ADMIN ) <
// тогда мы создадим сессионную переменную,
// чтобы мы могли попасть на страницу secret
$_SESSION [ ‘admin’ ] = ADMIN ;

// записываем сообщение в сессию об успехе
$_SESSION [ ‘res’ ] = ‘Вы успешно авторизовались!’ ;

sess2.png

Механизм выхода из сессии

В файле secret.php реализуем механизм выхода. При его работе из сессии будет удалятся сессионная переменная $_SESSION[‘admin’] и пользователь без авторизации не получит сюда доступ.

Ссылка для выхода из сессии:

В результате в массиве GET ( в командной строке ) получим: secret.php?do=exit , то есть, у нас появится элемент do со значением exit .

Это значит, что мы можем добавить условие :

if ( isset ( $_GET [ ‘do’ ] && $_GET [ ‘do’ ] == ‘exit’ )) <
unset ( $_SESSION [ ‘admin’ ]); // удаляем сессионную переменную
header ( «Location: sess1.php» ); // делаем редирект
die ; // и завершаем выполнение скрипта
>

-если у нас существует в массиве $_GET элемент do и при этом $_GET[‘do’] равняется строке exit , то мы удалим сессионную переменную $_SESSION[‘admin’] .

Далее можно опять перезапросить страницу. (редирект: header(«location: sess1.php») ).

Источник

How to remove a variable from a PHP session array

I want to remove the variable that is shown in $list2 from the session array when the user chooses ‘Remove’. But when I unset, ALL the variables in the array are deleted. How I can delete just one variable?

7 Answers 7

Since $_SESSION[‘name’] is an array, you need to find the array key that points at the name value you’re interested in. The last line rearranges the index of the array for the next use.

To remove a specific variable from the session use:

session_unregister('variableName'); 
unset($_SESSION['variableName']); 

NOTE: session_unregister() has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.

If the variable you are trying to «drop»/»unset» is an array then the array will be removed. e.g. $_SESSION[‘myarray’] = array(‘key’=>val,’key2’=>val2); usnet($_SESSION[‘myarray’] will unset the array. but unset($_SESSION[‘myarray’][‘key2’] will remove the second array element — (key,value) pair

session_unregister() «This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.»

Is the $_SESSION[‘name’] variable an array? If you want to delete a specific key from within an array, you have to refer to that exact key in the unset() call, otherwise you delete the entire array, e.g.

$name = array(0 => 'a', 1 => 'b', 2 => 'c'); unset($name); // deletes the entire array unset($name[1]); // deletes only the 'b' entry 

Another minor problem with your snippet: You’re mixing GET query parameters in with a POST form. Is there any reason why you can’t do the forms with ‘name’ being passed in a hidden field? It’s best to not mix get and post variables, especially if you use $_REQUEST elsewhere. You can run into all kinds of fun trying to figure out why $_GET[‘name’] isn’t showing up the same as $_POST[‘name’], because the server’s got a differnt EGPCS order set in the ‘variables_order’ .ini setting.

 " /> 
)" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f2.5%2f" data-se-share-sheet-license-name="CC BY-SA 2.5" data-s-popover-placement="bottom-start">Share
)" title="">Improve this answer
answered Feb 9, 2010 at 20:13
Add a comment |
4

If you want to remove or unset all $_SESSION 's then try this

session_destroy(); 

If you want to remove specific $_SESSION['name'] then try this

Источник

Оцените статью