Есть ли лучший способ проверить POST-переменные в PHP? - PullRequest
7 голосов
/ 31 июля 2009

На своих страницах PHP я нахожу строки и строки кода, которые выглядят так:

$my_id = isset($_REQUEST['my_id']) ? $_REQUEST['my_id'] : '';
$another_var = isset($_REQUEST['another_var']) ? $_REQUEST['another_var'] : 42;
...

Есть ли лучший, более краткий или более читаемый способ проверить этот массив и назначить его локальной переменной, если они существуют, или применить значение по умолчанию, если их нет?

РЕДАКТИРОВАТЬ: я не хочу использовать register_globals() - у меня все равно будет проблема isset в любом случае.

Ответы [ 6 ]

6 голосов
/ 31 июля 2009

Как насчет того, чтобы обернуть его в функцию?

<?php

function getPost($name, $default = null) {
    return isset($_POST[$name]) ? $_POST[$name] : $default;
}
4 голосов
/ 31 июля 2009

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

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

class Request {

  private $defaults = array();
  private static $_instance = false;

  function getInstance () {
    if (!self::$_instance) {
     $c = __CLASS__;
      self::$_instance = new $c;
    }
    return self::$_instance;
  }

  function setDefaults($defaults) {
    $this->defaults = $defaults;
  }

  public function __get($field) {
    if (isset($_REQUEST[$field]) && !empty($_REQUEST[$field])) {
        return $_REQUEST['field'];        
      } elseif (isset($this->defaults[$field])) {
        return $this->defaults[$field];
      } else {
        return ''; # define a default value here.
      }
   }
}

затем вы можете сделать:

# get an instance of the request
$request = Request::getInstance();

# pass in defaults.
$request->setDefaults(array('name'=>'Please Specify'));

# access properties
echo $request->name;
echo $request->email;

Я думаю, что это делает ваши отдельные скрипты более чистыми и абстрагирует от проверки и т. Д. Плюс множество возможностей с этим дизайном, чтобы расширить его / добавить альтернативное поведение, добавить более сложную обработку по умолчанию и т. Д. И т. Д.

2 голосов
/ 31 июля 2009

Прежде всего, НИКОГДА не используйте переменную $ _REQUEST, это приведет к ошибкам и другим проблемам во время разработки

<code>
function getPOST($key) {
    if(isset($_POST[$key])) {
        return $_POST[$key];
    }
}

обратите внимание, что этот код оставляет переменную пустой, когда $ _POST [$ key] не было установлено

Вы также можете адаптировать этот код, чтобы вместо этого предоставить (разумное) значение по умолчанию, когда значение не может быть загружено.

function getPOST($key, $default = NULL) {
    if(isset($_POST[$key])) {
        return $_POST[$key];
    } else {
        return $default;
    }
}
2 голосов
/ 31 июля 2009

Во-первых, используйте $_POST для переменных POSTed. $_REQUEST представляет собой гибрид множества различных входящих переменных, а не только $_POST, и может вызвать проблемы.

Одним из решений вашего вопроса было бы создание функции, которая обрабатывает логику isset().

function ForceIncomingValue($Key, $Default) {
    if (!isset($_POST[$Key]))
         return $Default;
    else return $_POST[$Key];
}
1 голос
/ 31 июля 2009

Известен ли набор ожидаемых вами переменных на момент написания скрипта, или вы хотите сделать это для произвольного набора значений? Если первое верно, вы можете сделать что-то вроде этого:

# This array would hold the names of all the variables you're expecting
# and a default value for that variable name
$variableNames = array (...); 
foreach ($variableNames as $key => $default) {
    if (isset ($_REQUEST[$key])) $$key = $_REQUEST[$key];
    else $$key = $default;
}

В основном, это использует способность PHP оценивать переменные для создания других переменных (отсюда двойной доллар для ключа $$ - это означает создание новой переменной, именем которой является значение $ key).

Я еще не нашел хорошего решения последней ситуации.

0 голосов
/ 02 марта 2016

PHP-ноль оператор объединения !

$username = $_GET['user'] ?? 'nobody';

Для многих переменных с проверкой требований любой может использовать мою expect функцию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...