Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Запись GET в SESSION (https://javascript.ru/forum/server/70703-zapis-get-v-session.html)

Sonya 26.09.2017 20:02

Запись GET в SESSION
 
Здравствуйте! Нужна помощь. Набросала скрипт, но уверена, что он некорректен:
if ($_SESSION['code'] === null){
   if($_GET['code'] === null){
   $_SESSION['code'] = '796';
  }
   elseif($_GET['code'] !== null){
   $_SESSION['code'] = $_GET['code'];
  }
}else{
$code = $_SESSION['code'];	
}

Суть - через GET-запрос, записываю параметр в сессию. Т.к. страница в определенный момент обновляется, но уже без GET, параметр передается уже через сессию. Как сделать код корректным? Помогите, пожалуйста.

laimas 26.09.2017 20:31

$_GET - это суперглобалный массив, который всегда есть, но если не было запросов то пустой.

Если вывод предупреждений подавлен, то то к примеру $_GET['a'] вернет NULL, если такового запроса не было. А пустой массив возвращает false, и это даже не породит предупреждений:

if(!$_GET) массив пуст или наличие конкретной переменной в массиве при подавлении предупреждений - if(!$_GET['code']). Зачем же проверять заполнен ли массив или существование в нем ключа, то есть были GET запросы или нет, строгой проверкой да еще и на null? Что null, что false, что пустая строка вам вернет "ложь". А вот действительно проверка существования ключа в массиве, без проверки его значения, это if(!isset($_GET['code'])).

Тоже самое и с $_SESSION.

Sonya 26.09.2017 20:45

Пробовала до этого кода именно if(isset($_GET['code'])) только без логического отрицания, там у меня с логикой были проблемы. Страница обновляется и при обновлении, GET не передается (такое условие), поэтому записываю в сессию, которая при обновлении остается.

laimas 26.09.2017 20:53

Если я правильно понял, то нужно следующее:

if(isset($_GET['code']) && $code = (int)$_GET['code']) $_SESSION['code'] = $code;
$code = $_SESSION['code'] ?: 769;


Не помню в какой версии, но вот такое

$code = $_SESSION['code'] вызывало ошибку. В версиях начиная с 5 не наблюдал такого, хотя и не со всеми и работал, так что имейте ввиду если что.

Sonya 26.09.2017 21:05

Цитата:

Сообщение от laimas (Сообщение 465580)
$code = $_SESSION['code'] вызывало ошибку. В версиях начиная с 5 не наблюдал такого, хотя и не со всеми и работал, так что имейте ввиду если что.

Версия PHP 5.6.
При обновлении страницы уже не будет передан параметр GET, не передаст ли он NULL в сессию?

laimas 26.09.2017 21:10

Цитата:

Сообщение от Sonya
не передаст ли он NULL в сессию?

Каким образом? Условие записи в сессию какое?

С учетом ранее сказанного, при подавлении предупреждений, сократим код вообще для одного условия записи в сессию:

if($code = (int)$_GET['code']) $_SESSION['code'] = $code; //если не было GET запроса, чему будет равно $code и выполнится ли это условие? 
$code = $_SESSION['code'] ?: 769;


Проверьте.

Sonya 26.09.2017 21:17

Хорошо, сейчас попробую.

Sonya 26.09.2017 21:34

Работает! Спасибо. Тот код, что я показала в самом начале тоже срабатывал, но со второго раза. А этот работает превосходно. Сейчас попробую "прогнать" в разных вариациях.

Vlasenko Fedor 26.09.2017 23:49

$code = 769;
if (false === empty($_GET['code'])) {
    $code = (int)$_GET['code'];
    $_SESSION['code'] = $code;
}
так более читабельное и без нотисов

laimas 27.09.2017 05:56

Цитата:

Сообщение от Poznakomlus
if (false === empty($_GET['code'])) {
$code = (int)$_GET['code'];

Ой ли так? )

Vlasenko Fedor 27.09.2017 11:13

laimas,
че смутило строгое сравнение, оно немного быстрее работает, чем с далнейшим приведением типов
if (!empty($_GET['code']))
именно так, потому как код читается

laimas 27.09.2017 11:37

Цитата:

Сообщение от Poznakomlus
че смутило строгое сравнение, оно немного быстрее работает, чем с далнейшим приведением типов

Дело не в копеечном выигрыше, а в том, что проверяется есть ли значение, но не проверяется какое, а сценарий при этом ожидает число. Если запросом прислать "вот вам, нате", то ваш код схавает его и в сессию запишет 0, которым сценарий потом оперировать должен? Ноль в качестве идентификатора (не знаю что это, но к примеру), это только при очень богатой фантазии. )

Vlasenko Fedor 27.09.2017 11:46

Цитата:

Сообщение от laimas
есть ли значение, но не проверяется какое

проверку и валидацию типов получаемых значений, это к ТС http://php.net/manual/ru/filter.filters.validate.php
Не в скорости дело, а в читаемости

laimas 27.09.2017 12:01

Цитата:

Сообщение от Poznakomlus
Не в скорости дело, а в читаемости

Ну это дело вкуса, читаемо не читаемо. Ваш код схавает непотребное, а зачем?

Vlasenko Fedor 27.09.2017 12:32

$code = filter_input(INPUT_GET, 'code', FILTER_VALIDATE_INT);
if (false === empty($code)) 
{
	$_SESSION['code'] = $code;
}
else //$code 0, Null, false
{
	$code = 769;
}

$code = filter_input(INPUT_GET, 'code', FILTER_VALIDATE_INT);
if (empty($code))//$code 0, Null, false
{
	$code = 769;
}
else 
{
	$_SESSION['code'] = $code;
}

:victory:

laimas 27.09.2017 12:39

Poznakomlus,

Это я знаю, но зачем, если гораздо проще if($a = (int)$_GET['key']) используем $a, ведь другого ничего и не ожидается?

Об этом и был вопрос. )

Vlasenko Fedor 27.09.2017 13:04

$_GET['key'] - это ,будет Notice при отсутствии в адресной строке одноименного гет параметра
empty не генерит Notice, так же в php7 тернарный оператор не генерит

laimas 27.09.2017 13:10

Цитата:

Сообщение от Poznakomlus
$_GET['key'] - это ,будет Notice при отсутствии в адресной строке одноименного гет параметра

Об этом уже писалось, а на реальном сервере нотайсы нужно отключать, и коли разработчик контролирует ситуацию, то это не смертельно.

Я не о empty разговор завел, а о том, что ваш код пропускает на сохранение ненужное сценарию значение, и причина не в empty, а в логике.

Я сомневаюсь, что у автора темы есть метод/функция которой перенапраляется ввод, и которая делает проверки всех входных данных, используя при этом фильтры или нет. Просто в данном случае если уж вас так беспокоят нотайсы, то хватило бы isset() && (int). А то сперва "сомнительная забота о чем-то", а потом прицепом еще и фильтры. :)

Vlasenko Fedor 27.09.2017 13:44

Цитата:

Сообщение от laimas
то это не смертельно

то есть вы пердлагаете писать код не взирая на предупреждения, ошибки
а затем скомпилить php без вывода ошибок и радоватся, так привыкнете говнокодить
Цитата:

Сообщение от laimas
ваш код пропускает на сохранение ненужное сценарию значение

где этот сценарий узрели, это ваши домыслы так как вы не знаете как дальше работаю с $code
к примеру
if($code === 0){
	echo 'параметр code должен быть числом';
}
:haha:

laimas 27.09.2017 13:57

Цитата:

Сообщение от Poznakomlus
то есть вы пердлагаете писать код не взирая на предупреждения, ошибки

Предупреждения, это не ошибки, но могут быть предпосылками к ним, поэтому в режиме отладки вывод их включен, но и отладкой надо заниматься не на удаленном сервере. На удаленном же сервере вывод их должен быть подавлен. Так что "предлагаю писать не взирая ни на что" я и не писал, да и речь не об этом.


Цитата:

Сообщение от Poznakomlus
где этот сценарий узрели, это ваши домыслы


Да елки палки, вот ваш код, запустите и посмотрите результат.

$_GET['code'] = 'text';

$code = 769;
if (false === empty($_GET['code'])) {
    $code = (int)$_GET['code'];
    $_SESSION['code'] = $code;
}

echo $_SESSION['code'];

Vlasenko Fedor 27.09.2017 15:15

Цитата:

Сообщение от laimas
Да елки палки, вот ваш код, запустите и посмотрите результат.

я написал как надо, и как можно
я ведь не пишу, что вы здесь сессию забыли проверить, стартануть :)
ini_set('display_errors', 1);
error_reporting(E_ALL);
if($code = (int)$_GET['code']) $_SESSION['code'] = $code;
$code = $_SESSION['code'] ?: 769;

laimas 27.09.2017 16:05

Poznakomlus,
Уверен, о старте сессии миледи прекрасно знает, иначе бы у нее вообще не работало. )

Ваш код при данных непотребных просто тупо запишет в сессию 0. И не надо меня стращать нотайсами. :)

Vlasenko Fedor 27.09.2017 16:19

Цитата:

Сообщение от laimas
тупо запишет в сессию 0.

и, далее что?

laimas 27.09.2017 16:28

Цитата:

Сообщение от Poznakomlus
и, далее что?

Ничего, просто бессмыслица.


Часовой пояс GMT +3, время: 12:11.