nepster-web
@nepster-web

Необъявленные переменные по умолчанию в php?

Наткнулся у хостера на такую проблему.

К примеру приходят данные из формы, и идет их обработка.
Например user_id, news_id и др.

И вот есть из формы не придет по какой-то причине нужные данные и $user_id не буде существовать будет ошибка.

Подскажите пожалуйста как можно дать значение по умолчанию необъявленным переменным. К примеру:

$user = 10;
unset($user); // юзера больше нет 

echo $user; // и вот тут нужно что бы было false или null
  • Вопрос задан
  • 4031 просмотр
Решения вопроса 1
Объявите все необходимые поля и объедините массивы POST и ваших объявленных полей:

$neededFields = array(
    'user_id' => null,
    'news_id' => null 
);

$_POST = array_merge($neededFields, $_POST);


В итоге значения тех полей, которые не пришли в запросе будут равны значениям из $neededFields.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
GeneMoss
@GeneMoss
void
$user_id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT);

Если user_id передан и является целым числом, тогда $user_id будет содержать это число.
Если user_id передан и не является числом, тогда $user_id будет содержать false.
Если user_id не передан, тогда $user_id будет содержать null.

Подробнее: www.php.net/manual/ru/function.filter-input.php
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
if (!isset($user))
    $user = false;
Ответ написан
Комментировать
reaferon
@reaferon
Есть еще одна "бэд прэктис": поставить символ @ перед переменной, в этом случае
echo @$user;
ошибку не вызовет.
Ответ написан
zBit
@zBit
Full stack web developer
Попытка работать с переменной, которая не была объявлена в PHP вызовет ошибку уровня E_NOTICE.
Если не хотите забивать лог подобными ошибками, то вам в помощь @, этот символ подавит ошибку. Но многие говорят, что это плохо.

Ответ на вопрос:
Подскажите пожалуйста как можно дать значение по умолчанию необъявленным переменным.

Надо их объявлять сначала, до того как зададите им значение.
Например
$user_id = $user_login = $user_pass = null;
extract($_POST, EXTR_OVERWRITE);
echo $user_id;
echo $user_login;
echo $user_pass;
Ответ написан
Комментировать
KEKSOV
@KEKSOV
Вы, случайно, не используете register_globals !?
Надеюсь, что нет :)

Отключить E_NOTICE и не использовать @ можно при помощи вызова error_reporting(E_ALL^E_NOTICE);

Но лучше всего внутри вашей функции, которая обрабатывает запрос в явном виде определить все ваши переменные со значениями по умолчанию и потом использовать extract:

function handleQuery()
{
  $foo = '';
  $boo = false;

  extract( $_POST, EXTR_IF_EXISTS );
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы