PHP создает простую функцию if-isset-empty

#php #function #post #isset #simplify

#php #функция #Публикация #isset #упростить

Вопрос:

Я кодирую приложение для работы с таблицами для компании, производящей принтеры. Я получаю поток форм. Для каждого отдельного поля ввода я должен проверять, установлены ли $_POST переменные, и если, то возвращать значение эхом. (В случае некоторой ошибки, например, после ошибки проверки, пользователь не должен повторно вводить всю форму)

Пример кода:

 if(isset($_POST['time'])amp;amp;!empty($_POST['time'])){echo $_POST['time'];}
  

Мне приходилось реализовывать это около сотни раз.
Итак, я попытался придумать какую-нибудь функцию, чтобы сделать это простым и читаемым.

Что-то вроде этого:

 function if_post_echo($key, $default = "") {
    if(isset($_POST[$key])amp;amp;!empty($_POST[$key])){
    echo $_POST[$key];   
    }else{
    echo $default;   
    }
}
  

Но это не сработает.
Я попытался передать $_POST для $key переменной следующим образом:

 if_post_echo($_POST['time'])

function if_request_echo($key, $default = "") {
        if(isset($key)amp;amp;!empty($key)){
        echo $key;   
        }else{
        echo $default;   
        }
    }
  

И я также пробовал это:

 function if_request_echo($key, $default = null) {
    return isset($_REQUEST[$key])amp;amp;!empty($_REQUEST[$key]) ? $_REQUEST[$key] : $default;
}
  

Без какого-либо разумного результата.

Вопрос:

Как я могу создать функцию, которая ищет необходимую $_POST переменную и возвращает ее, или, если она не установлена, возвращает пустую строку. И есть ли способ сделать это также для $_GET и $_REQUEST ? (Или просто дублирует?)

Комментарии:

1. Большую часть времени вам следует избегать $_REQUEST, вопрос безопасности. Используйте $ _GET и $ _POST в зависимости от отправленных данных.

2. Спасибо за ваши комментарии! @David: Я знаю о проблеме с $ _REQUEST, но на этот раз мы не защищены, приложение недоступно из сети. @netcoder: Я не могу вспомнить, почему я настроил это так, но я знаю, что раньше я пробовал !empty самостоятельно без isset, и это приводило к некоторым проблемам.

3. @David как $_REQUEST менее безопасно, чем $_GET or $_POST ? Все они могут быть изменены пользователем для получения значений, которые ваше приложение может не ожидать. Как может, $_COOKIE если уж на то пошло, которая $_REQUEST также получает свое значение из.

4. Взгляните на межсайтовые подделки Криса Шифлета

5. Ну, на самом деле это не безопасность, а существенное различие между методами POST и GET.

Ответ №1:

Ваша функция тестирования PHP:

 <?php
function test_req($key, $default = '') {
    if(isset($_REQUEST[$key]) and
       !empty($_REQUEST[$key])) {
        return $_REQUEST[$key];
    } else {
        return $default;
    }
}
?>
  

Затем в вашей форме HTML:

 <input name="my_field" value="<?php echo htmlentities(test_req('my_field')); ?>" />
  

$_REQUEST (linked) — это PHP super global, который содержит параметры запроса POST ( $_POST ) и GET ( $_GET ).

Если вы хотите только фиксировать параметры POST-запроса, тогда это было бы:

 <?php
function test_req($key, $default = '') {
    if(isset($_POST[$key]) and
       !empty($_POST[$key])) {
        return $_POST[$key];
    } else {
        return $default;
    }
}
?>
  

Например.

Ответ №2:

Если у вас большое количество полей, я бы предложил вам также использовать массив значений по умолчанию:

 $defaults = array(
    "time" => "default",
    "name" => "enter name here",
    "text..." => "...",
);

$fields = array_filter($_POST)   $defaults;
  

$fields затем будет содержать список значений формы либо с данными POST, либо с предустановленным значением по умолчанию. Нет isset, понимаете?

страница руководства array_filter в частности: если обратный вызов не предоставлен, все входные данные, равные FALSE, будут удалены. В некоторой степени объясняет работу, лежащую в основе этого решения.

Комментарии:

1. Мне нравится простота этого подхода.

2. Спасибо; также за добавление ссылки! (Это действительно работает аналогично empty() в этом случае.)

Ответ №3:

Это должно сработать:

 function if_post_echo($key, $default = ''){
    if(isset($_POST[$key]) AND !empty($_POST[$key]){
        echo $_POST[$key];
    }

    echo $default;
}
  

Если у вас возникли проблемы, я рекомендую вам попробовать var_dump($_POST) или print_r($_POST) посмотреть, все ли было правильно размещено.

Ответ №4:

Просто к сведению, это избыточно:

 isset($_POST[$key]) amp;amp; !empty($_POST[$key])
  

Неустановленная переменная всегда будет «пустой», что isset() подразумевается в вашем empty() вызове.

Для вашей логики вы можете достичь того же результата с помощью всего:

 !empty($_POST[$key])
  

Ответ №5:

Ваша первая функция работает для меня идеально.

Как вы думаете, почему это не работает?

Однако лучшим вариантом было бы

 function _post($key, $default = "") {
    if(isset($_POST[$key])){
        return $_POST[$key];
    }else{
        return $default;
    }
}
  

Чтобы использовать ее :

 echo $_post($key); // You could define the message as a second parameter.
  

Комментарии:

1. Я действительно запутался. Точно таким кодом, который вы использовали, я вставляю это: value="<?php _post(time); ?>" и ничего не возвращает.

2. value="<?php echo htmlentities(_post(time)); ?>

3. Это не проверяет, пуста ли переменная, что нормально, если $default всегда является пустой строкой. Если нет, то она не функционирует так, как было запрошено.

Ответ №6:

 function requireArray( $array, $required ) {
    foreach( $required as $k=>$v ) {
        if ( !isset($array[$k]) || empty($array[$k]) )
            return false;
    }
    return true;
}
#call like this:
requireArray($_POST, array('time', 'username', 'foo'));
  

Если вы хотите знать конкретно:

 function missingFrom( $array, $required ) {
    $r = array();
    foreach( $required as $k ) {
        if ( !isset($array[$k]) || empty($array[$k]) )
            $r[] = $k;
    }
    return $r;
}
  

Вызывается как предыдущая функция.

Ответ №7:

Похоже, ваш метод здесь работает нормально:

 function if_post_echo($key, $default = "") {
    if(isset($_POST[$key])amp;amp;!empty($_POST[$key])){
        echo $_POST[$key];   
    }else{
        echo $default;   
    }
}
  

Я ввел простой ввод с именем test, а метод form является POST и использует echo if_post_echo('test'); .

Он разместил на странице то, что было в текстовом поле.

Ответ №8:

Эта функция добавляется в PHP 7 как «Оператор объединения Null» с использованием двух вопросительных знаков:

echo ($_GET['message'] ?? 'default-if-not-set');

https://wiki.php.net/rfc/isset_ternary