Запись 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, параметр передается уже через сессию. Как сделать код корректным? Помогите, пожалуйста. |
$_GET - это суперглобалный массив, который всегда есть, но если не было запросов то пустой.
Если вывод предупреждений подавлен, то то к примеру $_GET['a'] вернет NULL, если такового запроса не было. А пустой массив возвращает false, и это даже не породит предупреждений: if(!$_GET) массив пуст или наличие конкретной переменной в массиве при подавлении предупреждений - if(!$_GET['code']). Зачем же проверять заполнен ли массив или существование в нем ключа, то есть были GET запросы или нет, строгой проверкой да еще и на null? Что null, что false, что пустая строка вам вернет "ложь". А вот действительно проверка существования ключа в массиве, без проверки его значения, это if(!isset($_GET['code'])). Тоже самое и с $_SESSION. |
Пробовала до этого кода именно if(isset($_GET['code'])) только без логического отрицания, там у меня с логикой были проблемы. Страница обновляется и при обновлении, GET не передается (такое условие), поэтому записываю в сессию, которая при обновлении остается.
|
Если я правильно понял, то нужно следующее:
if(isset($_GET['code']) && $code = (int)$_GET['code']) $_SESSION['code'] = $code; $code = $_SESSION['code'] ?: 769; Не помню в какой версии, но вот такое $code = $_SESSION['code'] вызывало ошибку. В версиях начиная с 5 не наблюдал такого, хотя и не со всеми и работал, так что имейте ввиду если что. |
Цитата:
При обновлении страницы уже не будет передан параметр GET, не передаст ли он NULL в сессию? |
Цитата:
С учетом ранее сказанного, при подавлении предупреждений, сократим код вообще для одного условия записи в сессию: if($code = (int)$_GET['code']) $_SESSION['code'] = $code; //если не было GET запроса, чему будет равно $code и выполнится ли это условие? $code = $_SESSION['code'] ?: 769; Проверьте. |
Хорошо, сейчас попробую.
|
Работает! Спасибо. Тот код, что я показала в самом начале тоже срабатывал, но со второго раза. А этот работает превосходно. Сейчас попробую "прогнать" в разных вариациях.
|
$code = 769;
if (false === empty($_GET['code'])) {
$code = (int)$_GET['code'];
$_SESSION['code'] = $code;
}
так более читабельное и без нотисов |
Цитата:
|
laimas,
че смутило строгое сравнение, оно немного быстрее работает, чем с далнейшим приведением типов if (!empty($_GET['code'])) именно так, потому как код читается |
Цитата:
|
Цитата:
Не в скорости дело, а в читаемости |
Цитата:
|
$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: |
Poznakomlus,
Это я знаю, но зачем, если гораздо проще if($a = (int)$_GET['key']) используем $a, ведь другого ничего и не ожидается? Об этом и был вопрос. ) |
$_GET['key'] - это ,будет Notice при отсутствии в адресной строке одноименного гет параметра
empty не генерит Notice, так же в php7 тернарный оператор не генерит |
Цитата:
Я не о empty разговор завел, а о том, что ваш код пропускает на сохранение ненужное сценарию значение, и причина не в empty, а в логике. Я сомневаюсь, что у автора темы есть метод/функция которой перенапраляется ввод, и которая делает проверки всех входных данных, используя при этом фильтры или нет. Просто в данном случае если уж вас так беспокоят нотайсы, то хватило бы isset() && (int). А то сперва "сомнительная забота о чем-то", а потом прицепом еще и фильтры. :) |
Цитата:
а затем скомпилить php без вывода ошибок и радоватся, так привыкнете говнокодить Цитата:
к примеру
if($code === 0){
echo 'параметр code должен быть числом';
}
:haha: |
Цитата:
Цитата:
Да елки палки, вот ваш код, запустите и посмотрите результат.
$_GET['code'] = 'text';
$code = 769;
if (false === empty($_GET['code'])) {
$code = (int)$_GET['code'];
$_SESSION['code'] = $code;
}
echo $_SESSION['code'];
|
Цитата:
я ведь не пишу, что вы здесь сессию забыли проверить, стартануть :)
ini_set('display_errors', 1);
error_reporting(E_ALL);
if($code = (int)$_GET['code']) $_SESSION['code'] = $code;
$code = $_SESSION['code'] ?: 769;
|
Poznakomlus,
Уверен, о старте сессии миледи прекрасно знает, иначе бы у нее вообще не работало. ) Ваш код при данных непотребных просто тупо запишет в сессию 0. И не надо меня стращать нотайсами. :) |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 16:15. |