Titre de la page

How do check if a PHP session is empty? [duplicate]

array_key_exists is a nice alternative to using isset to check for keys:

session_start(); if(array_key_exists('blah',$_SESSION) && !empty($_SESSION['blah']))

Make sure you’re calling session_start before reading from or writing to the session array.

no need to use isset if you are already using empty. empty will also check if the variable exists, i.e. is not null/undefined

@knittl It’s good practice to actually make sure you have the variable before testing to see if it’s empty.

@knittl — but then we don’t know if it’s been set or not, whether it’s not set or empty true will be returned. I tend to use the above, but it might not always be needed.

Empty return false when not exist or null or «» or empty array. Why would you need to check if isset too? Read the help file : ca.php.net/empty

Use isset , empty or array_key_exists (especially for array keys) before accessing a variable whose existence you are not sure of. So change the order in your second example:

if (!isset($_SESSION['something']) || $_SESSION['something'] == '') 

you are looking for PHP’s empty() function

You could use the count() function to see how many entries there are in the $_SESSION array. This is not good practice. You should instead set the id of the user (or something similar) to check wheter the session was initialised or not.

if( !isset($_SESSION['uid']) ) die( "Login required." ); 

(Assuming you want to check if someone is logged in)

If you want to check whether sessions are available, you probably want to use the session_id() function:

session_id() returns the session id for the current session or the empty string («») if there is no current session (no current session id exists).

I know this is old, but I ran into an issue where I was running a function after checking if there was a session. It would throw an error everytime I tried loading the page after logging out, still worked just logged an error page. Make sure you use exit(); if you are running into the same problem.

 function sessionexists()< if(!empty($_SESSION))< return true; >else < return false; >> if (!sessionexists())< redirect("https://www.yoursite.com/"); exit(); >else

This question is in a collective: a subcommunity defined by tags with relevant content and experts.

Источник

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

$_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 , то она создает такой файл либо обращается к нему, если файл уже был создан ранее. Причем этот файл индивидуален для каждой открытой сессии. Это значит, что если мы обратимся к одному и тому же скрипту из двух различных браузеров, то под каждый браузер, под каждого клиента будет открыт свой файл сессии и эти файлы никак друг с другом не пересекаются. Из этого следует, что с помощью сессий, мы можем организовать механизм аторизации пользователя, то есть получения доступа к какой-то закрытой части сайта.

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

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

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

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

Для примера создадим три файла: 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») ).

Источник

‘Isset’ should avoid the execution of the code

I made many searchs about my problem but i’m finally asking you .. so thanks you to read 🙂 ! There is my code :

 if(empty($_POST['pseudo']) || empty($_POST['msg']) && isset($_POST['okbutton'])) < echo "Tu n'as pas rempli le pseudo ou le msg !"; var_dump(isset($_POST['okbutton'])); // TEST var_dump(isset($_POST['clearbutton'])); // TEST >elseif(!empty($_POST['pseudo']) && !empty($_POST['msg']))< $myfile = fopen('letxt.txt', 'a+') or die ("Unable to open file!"); $pseudo = $_POST['pseudo']; $msg = $_POST['msg']; fwrite($myfile, $pseudo); fwrite($myfile, ' : '); fwrite($myfile, $msg); fwrite($myfile, ' 
'); fclose($myfile); > $myfile = fopen('letxt.txt', 'r') or die("Unable to open file!"); if(filesize('letxt.txt') > 0) < echo fread($myfile, filesize('letxt.txt')); fclose($myfile); >else echo ".."; ?>

So everything works ( if you have ideas to make this code better, or easier, i’ll take! i’m a student. ) apart the fact that if i use the clearbutton , it also enter in the second condition and so tell me «tu n’as pas rempli le pseudo ou le msg!» and the two var_dumps. How can i avoid it ? If i press clearbutton , only the first if should be executed right ? Cause the var_dump ‘s tell me that okbutton is false when i press clearbutton Thanks you for your answers ! 😀

Источник

Читайте также:  Test
Оцените статью