$_GET и isset()

Меня судят о if isset($_GET['whatever'])... перед остальной частью моего оператора if. Ошибки E_NOTICE очень удобно отключать, а для $_POST переменных у меня есть решение в моем сценарии инициализации..

$POST = (is_array( $_POST ) && count( $_POST ) > 0);

Я считаю, что это помогает скриптам самостоятельной публикации выглядеть чистыми.

if ($POST) {
    // now do something with $_POST...
}

Я не уверен, как это сделать динамически, если вы понятия не имеете, что такое ключ? Может ли кто-нибудь помочь найти аналогичное решение для переменных $_GET?

ИЗМЕНИТЬ:

Я просто хочу, чтобы if ($_GET['whatever'] == "whatever"); возвращало false, если оно не установлено и нет ошибок E_NOTICE.

ИЗМЕНИТЬ:

Извините, если я неясно выразился, я ищу решение для $_GET, а не $_POST -- я использую $_POST только как пример того, чего я надеюсь достичь.


person Mikey1980    schedule 31.08.2010    source источник
comment
Ваш вопрос не ясен, чего вы ожидаете?   -  person Sarfraz    schedule 31.08.2010


Ответы (8)


Иногда я использую глобальную функцию GET:

function GET($key, $default = null) {
    return isset($_GET[$key]) ? $_GET[$key] : $default;
}
person Ionuț G. Stan    schedule 31.08.2010
comment
Потрясающе.. СПАСИБО! это значительно упростит чтение кода. - person Mikey1980; 31.08.2010

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

Но бывают разные случаи. Для случая, который вы опубликовали, вам не нужно ничего из этого, кроме

if ($_SERVER['REQUEST_METHOD'] == "POST")
person Your Common Sense    schedule 31.08.2010
comment
извините, я могу быть неясным.. У меня есть решение для $_POST, но нужно одно для $_GET - person Mikey1980; 31.08.2010
comment
+1 за every variable in your program should be initialized before use. - person robertbasic; 31.08.2010
comment
@Mikey1980 Майки1980 на самом деле у вас нет [правильного] решения для $_POST, и у вас нет [такой же] проблемы с самим массивом $_GET, поскольку он уже всегда определен и является массивом. - person Your Common Sense; 31.08.2010
comment
@ Mikey1980 Майки1980, это тоже неправда, просто научился правильно формулировать свои вопросы. - person Your Common Sense; 31.08.2010

Уже ответили, но поскольку об этом не упоминалось, попробуйте также:

$var = filter_input(INPUT_GET, 'varname');

Это вернет ноль, если он не существует, без раздражающих уведомлений массива, а также различными способами отфильтрует потенциальные плохие вещи. См. также: http://www.php.net/filter

person tadamson    schedule 31.08.2010
comment
спасибо, мне придется немного поиграть с этим, неясно, как я буду использовать это в выражении if .. тем не менее мне любопытно узнать, что fn - person Mikey1980; 01.09.2010

Вы можете сделать функцию, которая сделает это за вас.

function getVar($item){
    return isset($_GET[$item]) ? $_GET[$item] : '';
}

Затем вы можете сделать if(getVar('whatever') == "whatever").

person Rocket Hazmat    schedule 31.08.2010

Вот два метода.

/*
* Makes any request keys into variables of the same name
*/
foreach($_GET AS $key => $value) {
    ${$key} = ($value);
}    

//Assuming a input key of $_GET['whatever'] 
echo $whatever;

/*
* Casting to an object
*/
$get = (object) $_GET;

//Assuming a input key of $_GET['whatever'] 
echo $get->whatever

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

http://php.net/manual/en/language.oop5.overloading.php

Мне не хотелось писать пример, демонстрирующий это. :)

person LLBBL    schedule 31.08.2010
comment
Мне всегда было интересно, как динамически создавать имена переменных... отличная работа - person Mikey1980; 01.09.2010
comment
Спасибо! Я бы также рекомендовал, чтобы в первом примере вы вызывали какой-то класс очистки внутри foreach, а во втором примере вы просто делали бы это перед приведением к объекту. - person LLBBL; 01.09.2010

простой, я думаю, вы хотите проверить, установлено ли значение get, тогда вам нужно сделать следующий шаг, иначе сделайте другой

Мне нравится первый ответ, но нужно проверить, работает ли он для вас.

if(isset($_GET['whatever']){ if ($_GET['whatever'] == "whatever");{ // делаем все остальное } else{ // делаем все остальное } }

надеюсь, это может помочь, если то, что я думаю, вам нужно

person Rahul TS    schedule 31.08.2010

  • короткая
  • без уведомления

    $key = &$_POST['key'];

Таким образом (внутри функции) он устарел и показывает ошибку:

function f($s){}
f(&$_POST['key']);

Неустранимая ошибка: передача по ссылке во время вызова удалена.

person Community    schedule 23.09.2011

При написании такого рода сценариев я обычно делаю что-то вроде этого вверху:

$submitted = isset($_POST['submit']) ? true : false;
$username = isset($_POST['username']) ? $_POST['username'] : null;
$password = isset($_POST['password']) ? $_POST['password'] : null;
(etc.)

Затем при проверке значений это выглядит примерно так:

if ($submitted)
{
    if ($username && $password)
    {
        // do stuff with username and password including testing their values
    }
}

Кажется, это работает очень хорошо для меня.

person Ryan Kinal    schedule 31.08.2010
comment
вы пишете одну строку кода для проверки каждой переменной, независимо от того, установлена ​​она или нет, почему бы не вызвать функцию, как предложили другие? - person Sandeepan Nath; 04.09.2010