Функция php для объединения внешних переменных в один объект независимо от GET или POST - PullRequest
0 голосов
/ 07 февраля 2009

Я помню, как однажды просматривал чужой PHP-код, и у него был метод функции или класса, который свернул все переменные GET и POST в один простой старый объект, который затем можно было обойти. Если в GET и POST появится одна и та же пара имя-значение, POST победит.

Существует ли хорошо закодированное PHP-дополнение какого-либо рода, которое делает именно это?

Ответы [ 5 ]

7 голосов
/ 07 февраля 2009

Вы можете использовать $_REQUEST, но имейте в виду, что он содержит содержимое $_GET, $_POST и $_COOKIE, а также наличие (и порядок в целях перезаписи) Переменные в этом суперглобальном файле подлежат настройке в среде выполнения.

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

$requestData = array_merge( $_GET, $_POST );

Затем вы можете обернуть это каким-то образом, возможно, предоставив дополнительные полезные функции, например, автоматическое применение stripslashes() к значениям, искаженным с помощью magic_quotes, предоставление значений по умолчанию для отсутствующих переменных и т. д.

2 голосов
/ 08 февраля 2009

Объединение обеих переменных (или использование вместо них $_REQUEST или Регистров глобалов ) может привести к недостаткам безопасности, поскольку вы не можете однозначно определить источник его значений. Таким образом, при доступе к $_REQUEST['foobar'] вы не можете определить, было ли значение отправлено через URL, тело POST или Cookie. Это может сделать ваш скрипт уязвимым для Подделки межсайтовых запросов .

Поэтому я рекомендую вам перейти к безопасности, а не к комфорту и использовать те переменные, откуда вы ожидаете, что ваши значения получены. $_GET для аргументов, которые, как ожидается, будут переданы по URL, $_POST для аргументов, передаваемых через POST, и $_COOKIE для файлов cookie.

1 голос
/ 08 февраля 2009

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

function param($name, $default = null) {
  return isset($_POST[$name])
    ? $_POST[$name]
    : (isset($_GET[$name])
      ? $_GET[$name] 
      : $default);
}

Но на самом деле .. это плохая практика.

0 голосов
/ 08 февраля 2009

Это класс из моей среды, который обрабатывает глобальные переменные в приложении. Обработка переменных здесь не производится.

class stGlobal

{

//instance
private static $instance;

//global settings
public $post = '';
public $get = '';
public $files = '';
public $request = '';

private function initialize()
{
    $this->post = $_POST;
    $this->get = $_GET;
    $this->files = $_FILES;
    $this->request = $_REQUEST;
}

public function getInstance()
{
    if (!isset(self::$instance))
    {
        $class = __CLASS__;
        self::$instance = new $class();
        self::$instance->initialize();
    }
    return self::$instance;
}

}

Чтобы использовать его где угодно

$myObj = stGlobal::getInstance();
0 голосов
/ 07 февраля 2009

вы можете использовать глобальную переменную $ _REQUEST. это определяется PHP, интерпретируемым по умолчанию, когда ваше приложение работает в веб-сапи (например, CGI или модуль веб-сервера), как в случае вашего приложения, когда вы пишете веб-приложения с использованием PHP. $ _REQUEST является ассоциативным массивом всех данных в $ _GET и $ _POST и определяется по умолчанию. для его использования не требуется расширение / библиотекарь.

...