Серед $ _REQUEST, $ _GET та $ _POST, хто з них найшвидший?


177

Який із цих кодів буде швидшим?

$temp = $_REQUEST['s'];

або

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
Є третій випадок, ви знаєте. !isset($_REQUEST['s']).
Франц

5
Наскільки важливо, щоб інші люди чітко розуміли ваш код? POST та GET явні, тоді як ЗАПИТАННЯ може надходити з різних джерел. Я думаю, що ефективність є незначною, оскільки суперглобали REQUEST, POST та GET завжди завантажуються для кожного запиту.
Кевін

Відповіді:


273

$_REQUEST, За замовчуванням, містить вміст $_GET, $_POSTі $_COOKIE.

Але це лише дефолт, від якого залежить variables_order; і не впевнений, що ви хочете працювати з файлами cookie.

Якби мені довелося вибирати, я б, мабуть, не користувався $_REQUEST, і я вибрав би $_GETабо $_POST- залежно від того, що повинна робити моя програма (тобто те чи інше, але не те і інше) : загалом кажучи:

  • Ви повинні використовувати, $_GETколи хтось запитує дані з вашої програми.
  • І вам слід користуватися, $_POSTколи хтось надсилає (додає або оновлює; або видаляє) дані до вашої програми.

Так чи інакше, у виконанні не буде великої різниці: різниця буде незначною, порівняно з тим, що робитиме решта вашого сценарію.


1
В ідеалі, ви завжди повинні мати можливість використовувати $ _REQUEST. Але це, звичайно, лише ідеальний світ.
Тайлер Картер

2
$ _REQUEST нібито (або принаймні колись був дорожчим), ніж безпосередньо використання $ _POST та $ _GET.
Даррелл Брогдон

3
+1, оскільки концепція різниці в продуктивності є незначною, а перспектива обслуговування - важливішою: $ _GET і $ _POST передають значення таким чином, що $ _REQUEST не може.
Джон Крам

9
Використання $ _REQUEST не спричиняє XSS / XSRF. Нерозуміння нюансів XSS / XSRF викликає XSS / XSRF. Поки ви пом'якшуєте лексеми, немає жодної проблеми І ви отримуєте переваги від використання $ _REQUEST (всі ваші змінні знаходяться в одному надглобальному). Я фактично будую $ _REQUEST перед тим, як використовувати його на основі інших суперглобалів через 'змінних_порядку'. Я обробляю $ _COOKIE, потім $ _GET, потім $ _POST. Таким чином, POST vars має найвищий пріоритет, а файли cookie отримують найнижчий рівень, що дозволяє мені неявно виправити ряд помилок (наприклад, Adobe Flash та магічні цитати).
CubicleSoft

його в назві, Get = get from, Post = post to
Grumpy

32

GET vs. POST

1) І GET, і POST створюють масив (наприклад, масив (key => значення, key2 => value2, key3 => value3, ...)). Цей масив містить пари ключів / значень, де ключі - назви елементів форми, а значення - вхідні дані від користувача.

2) І GET, і POST трактуються як $ _GET і $ _POST. Це суперглобали, це означає, що вони завжди доступні, незалежно від обсягу, - і ви можете отримати доступ до них з будь-якої функції, класу чи файлу, не роблячи нічого особливого.

3) $ _GET - це масив змінних, що передаються поточному сценарію через параметри URL.

4) $ _POST - це масив змінних, переданих до поточного сценарію методом HTTP POST.

Коли користуватися GET?

Інформація, надіслана з форми за допомогою методу GET, видима всім (всі імена змінних та значення змінних відображаються в URL-адресі). GET також має обмеження щодо кількості інформації, яку потрібно надіслати. Обмеження становить близько 2000 символів. Однак, оскільки змінні відображаються в URL-адресі, сторінку можна зробити закладкою. Це може бути корисно в деяких випадках.

GET може використовуватися для надсилання нечутливих даних.

Примітка: GET НІКОЛИ не повинен використовуватися для надсилання паролів або іншої конфіденційної інформації!

Коли використовувати POST?

Інформація, надіслана з форми за допомогою методу POST, невидима для інших (усі імена / значення вбудовані в тіло HTTP-запиту) і не має обмежень щодо кількості інформації для надсилання.

Більше того, POST підтримує розширену функціональність, таку як підтримка двочастинного двійкового введення під час завантаження файлів на сервер.

Однак, оскільки змінні не відображаються в URL-адресі, не можна розміщувати закладки на сторінці.


6
Будь ласка, додайте щось про ЗАПИТАННЯ.
Чорна мамба

Що з $ _REQUEST?
Аамір Калімі

22

$ _GET отримує змінні з рядка запитів або вашої URL-адреси.>

$ _POST отримує змінні з методу POST, таких як (загалом) форми.

$ _REQUEST - це злиття $ _GET і $ _POST, де $ _POST перекриває $ _GET. Добре використовувати $ _REQUEST на власних рекреаційних формах для перевірки.


3
+1 Це в основному те, чого мене вчили. Не технічний, як інші відповіді, але набагато простіше запам'ятати ( GETіз рядка запиту, POSTвід подання форми).
jp2code

18

Я б запропонував використовувати $_POSTі $_GETпрямо.

Використання $ _REQUEST у будь-якому разі має бути непотрібним при правильному дизайні веб-сайтів, і це має деякі недоліки, як, наприклад, відкриття для більш легких CSRF/XSSатак та іншої глупості, що виникає від зберігання даних у URL-адресі.

Різниця в швидкості повинна бути мінімальною в будь-якому випадку.


8

Використовуйте ЗАПИТ. Ніхто не переймається швидкістю такої простої операції, і це набагато чистіший код.


7
Хороша відповідь, зауважуючи, що у багатьох ситуаціях GET або POST слід вибирати виходячи із ситуації, а не використовувати будь-яку.
ceejayoz

3
Ти маєш рацію, що нікого не цікавить, але, на мою думку, використання $_REQUESTнеправильного висновку. Дивіться мою відповідь.
Франц

4
чому ussing $ _REQUEST чистіший порівняно з $ _GET або $ _POST? $ _REQUEST виконує ту саму логіку за сценою, а вибір GET або POST дає вам більше контролю.
Джей Зенг

6
Твердження, що _REQUEST - це більш гігієнічні потреби, потребує розробки.

2
Я рекомендую використовувати GET, якщо ви бажаєте, щоб користувач мав змогу скопіювати URL-адресу та виконати таку ж операцію, тобто (URL-адресу видно як "google.com/q=searchWord", тоді як POST слід використовувати для розміщення даних на веб-сайті які потрібно вставити лише один раз, або багато даних активовано, і користувач не повинен мати змогу зберігати URL, як вставляти дані в бази даних, входити в систему тощо.
Дін Механ,

7

Не хвилюйся. Але ви все одно повинні використовувати друге рішення (плюс додатковий чек жодна з цих змінних існуючих), тому що є проблеми з безпекою $_REQUEST(починаючи з $_GETі $_POSTне є єдиними джерелами для цього масиву).

$_REQUESTЯ вважаю пост про проблеми з вчорашнім днем. Дозвольте мені піти його знайти.

EDIT : Ну добре, не безпосередньо повідомлення, але тут все одно: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Використовуйте це, оскільки це безпечніше і це не зробить помітної різниці швидкостей


Зовсім не погане рішення. Він піклується про недоліки безпеки, пов'язані з, $_REQUESTале все ж дозволяє отримати доступ до одного і того ж скрипту в будь-якому випадку (у моєму випадку той самий скрипт використовується з різними "діями", і в деяких випадках $ _GET було б добре, але в інших випадках мені потрібно $ _POST для приховування / захисту даних).
Ксандор

4

Існують певні занепокоєння щодо безпеки, оскільки хакер може встановити файл cookie, який замінить значення $ _POST або $ _GET. Якщо ви обробляєте конфіденційні дані, я б не рекомендував використовувати $ _REQUEST. - Ксандор

ви не можете використовувати $_GETальтернативу $_POSTв деяких випадках.

Коли ??

  • коли ви хочете завантажити файл.
  • коли ви не захочете показувати дані в URL-адресі.

GETтакож є обмеження щодо кількості інформації для надсилання. Обмеження становить близько 2000 символів.

Інша справа, що мало випадків, коли ви не можете отримати дані, використовуючи $_POST

Коли ?

  • коли дані передаються в URL.

Для відпочинку

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

немає нічого поганого у використанні $_REQUEST.

Але спосіб зробити це - перевірити $ _SERVER ['REQUEST_METHOD'] явно, а не покладатися на те, що $ _POST порожній для GET.


1
Хороша порада щодо використання, $_SERVER['REQUEST_METHOD']щоб перевірити, чи буде викликаний сценарій з будь-яким. Але сказати, що нічого поганого немає, $_REQUESTце не на 100% правда. Існують певні проблеми з безпекою, оскільки хакер може встановити файл cookie, який буде заміняти значення $ _POST або $ _GET. Якщо ви обробляєте конфіденційні дані, я б не рекомендував їх використовувати $_REQUEST.
Ксандор

Я додав ваш коментар у свою відповідь, я допоможу вам подякувати
Parth Chavda

3

$ _GET отримує змінні з рядка запитів або вашої URL-адреси.>

$ _POST отримує змінні з методу POST, таких як (загалом) форми.

$ _REQUEST - це злиття $ _GET і $ _POST, де $ _POST перекриває $ _GET. Добре використовувати $ _REQUEST на власних рекреаційних формах для перевірки.


2
Переоцінка залежить від request_orderі може містити значення файлів cookie, тому це не дуже надійна і корисна функція.
Ja͢ck

1

Я використовував би другий метод, оскільки він є більш явним. Інакше ви не знаєте, звідки беруться змінні.

Чому вам потрібно перевірити як GET, так і POST? Безумовно, використання того чи іншого має лише більше сенсу.


1
Я бачив це раніше, GETоскільки він використовувався лише для одного елемента (наприклад, переміщення його) та POSTдля кількох з них (форма з прапорцями ...).
Франц

1

Я коли-небудь використовую _GET або _POST. Я вважаю за краще контролювати.

Що мені не подобається в жодному фрагменті коду в ОП, це те, що вони відкидають інформацію, для якої використовувався метод HTTP. І ця інформація важлива для санітарії введення.

Наприклад, якщо скрипт приймає дані з форми, яка буде введена в БД, тоді форма краще використовувати POST ( використовувати GET лише для ідентичних дій ). Але якщо скрипт отримує вхідні дані методом GET, його слід (як правило) відхилити. Для мене така ситуація може бути підставою для написання порушення безпеки в журнал помилок, оскільки це знак, що хтось щось намагається.

З будь-яким фрагментом коду в ОП ця санітарія була б неможливою.


Насправді просто просто написати невелику сторінку, яка розміщує на сторінці все, що завгодно. Тож якщо ви не покладаєтесь на надсилання заголовків рефералів, публікація vars не є безпечнішою, ніж отримати vars. Я вважаю, що найбільшою перевагою явного $_POSTє те, щоб сканери пошукових систем не робили щось подібне: thedailywtf.com/Articles/WellIntenposed-Destruction.aspx
Duroth

Я нічого не сказав протилежного. Я сказав, що якщо форма HTML використовує POST, а обробка сценарію отримує дані форми через GET, сценарій хотів би знати про це, а не викидати цей факт, як це робить обидва приклади кобри. (

1

Я б використовував $_POST, і $_GETтому, що на $_REQUESTїх зміст не впливає variables_order.
Коли використовувати $_POSTта $_GETзалежить від того, який тип операції виконується. Операцію, яка змінює оброблювані дані з сервера, слід проводити через POST-запит, а інші операції - через GET-запит. Щоб зробити приклад, операція, яка видаляє обліковий запис користувача, не повинна виконуватися безпосередньо після того, як користувач натисне на посилання, а перегляд зображення може бути здійснено через посилання.


1

Я використовую це,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

Оператор підтверджує, якщо $ _REQUEST має більше одного параметра (перший параметр у $ _REQUEST буде урі-запитом, який можна використовувати при необхідності, деякі пакети PHP не повертають $ _GET, тому перевірте, чи не більше 1 $ для $ _GET, за замовчуванням це буде $ _POST.


0

Ви передчасно оптимізуєте. Крім того, вам слід подумати над тим, чи слід GET використовувати для речей, які ви розміщуєте, з міркувань безпеки.


3
Будь ласка, не намагайтеся сказати людям, що в POST є щось більш безпечне, ніж про GET.

Я не. Суть полягала в тому, що над їх використанням слід подумати, а не нахабно використовувати їх взаємозамінно, бо "просто набрати ЗАПИТУВАННЯ так простіше".
Олексій Брасевік

Якщо ви маєте на увазі те, що кобра повинна перевірити, чи були дані надіслані за допомогою очікуваного методу, то я згоден. Будь-який із прикладів його коду робить таке тестування неможливим.

0

Це некрасиво, і я не рекомендував би його як остаточне рішення при натисканні коду в реальному часі, але, будуючи функції відпочинку, іноді зручно мати захоплювач параметрів 'catch-all':

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Хтось із рекламних ресурсів, ймовірно, може навіть додати його для обробки параметрів командного рядка або того, що відбувається з вашого IDE. Після того, як ви вирішите, що робить дана функція відпочинку, ви можете вибрати одну відповідну для цього дзвінка, щоб переконатися, що ви отримаєте те, що вам потрібно для версії розгортання. Це передбачає, що "REQUEST_METHOD" встановлено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.