$_GET.Всесвітня мережа та процес веброзробки тримаються на базі протоколу HTTP. Усі мови програмування — Python, Node.js та PHP — на рівні бекенду просто парсять (аналізують) вхідні текстові запити від браузерів згідно правил цього протоколу, та формують і віддають текстову відповідь. Розуміння відмінностей методів HTTP-запитів і способів передавати параметри в адресному рядку — це “Абетка” для створення динамічних сторінок, таких як результати пошуку або сторінки профілів користувачів. Без них усі сторінки були б завжди однаковими (статичними).
HTTP (Hypertext Transfer Protocol) — це набір фундаментальних правил, за якими клієнт (як правило, ваш браузер Chrome або Safari) і сервер обмінюються текстовими повідомленнями.
Важлива характеристика HTTP, про яку забувають новачки — він є Stateless (протоколом “без стану”).
Що це означає: Сервер не має “пам’яті”. Після того, як сервер отримав запит від вашого клієнта, побудував сторінку і відправив її назад — він негайно забуває про вас. Кожен наступний клік на сайті по будь-якому посиланню (навіть через 2 секунди) розглядається сервером як 100% новий і незалежний запит від незнайомця.
Тому, якщо ви авторизувалися на сторінці login.php, а потім перейшли на profile.php, сервер вас “вже не знає” ($is_logged=true загубиться). Щоб передавати “стан” (хто ви і що ви уже ввійшли в систему), розробникам доводиться вдаватися до спеціальних інструментів — Cookie та Сесій (про які поговоримо у लेक्चरі 9), або передавати значення щоразу в URL-адресі.
Невидиме “око” HTTP-запиту від браузера виглядає приблизно так:
GET /articles/category-php HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64) Chrome/...
Accept-Language: uk,en-US
Ми бачимо Метод (GET), Шлях (/articles/…) та серію Заголовків (Headers).
В протоколі є безліч методів (дієслів) для вказівки “що саме і як має відбутись” із сторінкою, яку запитують. Найбільш вживані: GET і POST.
Це метод за замовчуванням. Абсолютно кожен раз, коли ви вводите URL в адресний рядок, переходите по посиланню <a> або оновлюєте сторінку по F5 — браузер робить GET-запит.
?.Зазвичай ініціюється виключно натисканням кнопочки Submit в HTML-формі (<form method="POST">).
$_GETУ PHP розробнику не потрібно вручну парсити ті загадкові текстові рядки протоколу HTTP і “різати” URL-и. Інтерпретатор PHP робить це автоматично ДО запуску вашого коду на файлі index.php. Він бере всі дані і сортує їх в особливі багатовимірні масиви, що називаються Суперглобальними.
Суперглобальні масиви — це вбудовані “з коробки” змінні в PHP, які завжди доступні у будь-якій частині коду (включаючи будь-яку вашу функцію, без необхідності писати слово global). Вони всі починаються з префіксу $_.
Основні з них:
$_GET — масив параметрів з URL-адреси.$_POST — масив даних із відправленої POST-форми.$_SERVER — технічна інформація (IP клієнта, який шлях до файлу, який метод було використано).$_FILES — файли (наприклад, аватарки), завантажені користувачем.$_GETОсновним механізмом спілкування між сторінками через GET-метод є параметри Query String. Вони додаються в URL після знаку питання ?. Кожен параметр - це пара “ключ=значення”. Разом вони розділяються амперсандом &.
Приклад адреси (пошуковий запит):
http://mysite.com/search.php?category=books&author=king
Коли користувач переходить за таким URL, PHP АВТОМАТИЧНО формує та заповнює суперглобальний асоціативний масив $_GET:
<?php
// PHP відпрацював, і масив $_GET гарантовано має такий вигляд:
// $_GET = [
// 'category' => 'books',
// 'author' => 'king'
// ];
// Отже, ми як розробники можемо легко діставати ці змінні:
echo "Ви шукаєте категорію: " . $_GET['category'];
echo "Автор: " . $_GET['author'];
// ------------------------------------
// ВАЖЛИВА ПРАВИЛО БЕЗПЕКИ !!!
// Що як користувач зітре "?category=books" з адресного рядка?
// Наш код впаде з помилкою "Warning: Undefined array key 'category'"
// Завжди перевіряйте наявність ключа, або використовуйте оператор об'єднання (??):
$cat = $_GET['category'] ?? "Фільтрація вимкнена"; // Якщо ключа нема, поставити дефолт
echo "Поточна категорія: " . $cat;
?>
В URL-адресу не можна просто так написати пробіл, кирилицю чи знаки &, #, =. Згідно зі специфікацією, ці знаки мають спеціальне системне значення. Вони повинні бути “закодовані” (переведені в безпечний латинський 16-й формат %hex).
Якщо ви хочете передати логін Іван Шевченко, браузер (або ви вручну при створенні лінки) повинні перетворити його за допомогою PHP-функції urlencode().
?login=Іван%20Шевченко
Добра новина: під час “розбору” масиву, всередині $_GET['login'] PHP автоматично зробить декодування (URL Decode) у звичний для вас пробіл та Кирилицю! Вам не треба розкодовувати його назад.
GET-запити використовуються тільки для “Читання” даних. Всі передані клієнтом дані “світяться” в URL, вони не підходять для паролів чи великих обсягів тексту.GET параметри із URL (які знаходяться після символу ?) та будує зручний асоціативний масив, до якого розробники мають доступ у вигляді $_GET.$_GET['id']), потрібно застосовувати перевірки існування параметра чи оператор об’єднання (??), оскільки користувач може стерти його з адресної строки вручну.global $_GET у тілі невеликої власної function, щоб його побачити?$myAge = $_GET['age'] ?? 18;) і чому його використання є найкращою практикою під час роботи зі структурами даних, отриманими від зовнішнього клієнта (браузера)?