Získávání a extrakce parametrů dotazu URL v PHP
Při vytváření webových aplikací PHP je velmi časté, že je třeba číst hodnoty předávané prostřednictvím adresy URL ("řetězec dotazu" nebo parametry GET). V tomto příspěvku se budeme zabývat:
- Jaké parametry URL (řetězce dotazů) jsou
- Jak je PHP zpřístupňuje
- Jak analyzovat parametry z řetězce URL
- Užitečné pomocné funkce
- Okrajové případy, zabezpečení a osvědčené postupy
Co jsou to parametry URL / řetězce dotazů?
Parametr URL (nebo řetězec dotazu) je část adresy URL za znakem ? s dvojicemi klíč/hodnota oddělenými znakem &. Například:
https://example.com/search.php?q=php&lang=en&page=2
Zde:
q=phplang=enpage=2
Tradičně se k nim přistupuje prostřednictvím HTTP GET. Umožňují předávat malé množství dat v samotné adrese URL.
vestavěný mechanismus PHP: $_GET
Nejjednodušší a nejběžnější způsob přístupu k parametrům URL v jazyce PHP je prostřednictvím příkazu superglobal $_GET. Jedná se o asociativní pole, které PHP vyplňuje z řetězce dotazu aktuálního požadavku.
<?php// Suppose URL is: http://mysite.com/page.php?user=alice&age=30 $user = $_GET['user']; // “alice”$age = $_GET['age']; // “30” // Better: check existenceif (isset($_GET['user'])) { $user = $_GET['user'];} else { $user = null;}?>
Můžete také použít nulový koalescenční operátor (PHP 7+):
$user = $_GET['user'] ?? null;
S filtrováním:
$user = filter_input(INPUT_GET, 'user', FILTER_SANITIZE_STRING);
Poznámky:
$_GETfunguje vždy, když je přítomen řetězec dotazu, bez ohledu na metodu požadavku.- Vždy ověřujte a upravujte data.
- Použijte
isset(),??, nebofilter_input()abyste se vyhnuli upozorněním. - Pole (
?arr[]=foo&arr[]=bar) se zpracovávají automaticky.
Extrakce z libovolného řetězce URL
Někdy je třeba analyzovat parametry z řetězce URL, nikoli z aktuálního požadavku. V takovém případě:
parse_url() + parse_str()
<?php$url = "https://example.com/path?foo=bar&baz=qux&arr[]=one&arr[]=two"; $parts = parse_url($url); if (!empty($parts['query'])) { parse_str($parts['query'], $queryParams); // ["foo"=>"bar", "baz"=>"qux", "arr"=>["one", "two"] ]} else { $queryParams = [];}?>
Nebo kratší:
parse_str(parse_url($url, PHP_URL_QUERY), $queryParams);
Upozornění:
- Nevolejte
parse_str()bez druhého argumentu znečistí lokální obor. - Mezery/tečky v klávesách se změní na podtržítka.
max_input_varsmůže omezit počet analyzovaných parametrů.
Alternativa pro Regex
if (preg_match("/[?&]foo=([^&]+)/", $url, $matches)) { $fooVal = urldecode($matches[1]);}
Ten je však křehký, přednost mají vestavby.
Získání úplné aktuální adresy URL
Pokud potřebujete kompletní aktuální adresu URL požadavku:
<?phpfunction getCurrentUrl(): string { $scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http"; $host = $_SERVER['HTTP_HOST']; $uri = $_SERVER['REQUEST_URI']; return $scheme . "://" . $host . $uri;} $current = getCurrentUrl();echo $current;?>
To dává něco jako:
https://example.com/search.php?lang=en&q=php
Pomocné funkce
<?phpfunction getQueryParams(?string $url = null): array { if ($url === null) { $qs = $_SERVER['QUERY_STRING'] ?? ''; parse_str($qs, $params); return $params; } $parts = parse_url($url); if (empty($parts['query'])) { return []; } parse_str($parts['query'], $params); return $params;} function getParam(string $key, ?string $url = null, $default = null) { $params = getQueryParams($url); return $params[$key] ?? $default;}?>
Použití:
$params = getQueryParams("https://example.com/?a=1&b=2");$email = getParam('email', null, '');
Okrajové případy a osvědčené postupy
| Obavy | Tip |
|---|---|
| Chybějící klíče | Použijte isset(), ??, nebo array_key_exists. |
| Kódování URL | Automaticky zpracovává PHP. |
| Opakované klávesy | parse_str() zachová poslední hodnotu, pokud [] je použita syntaxe. |
| Mnoho parametrů | Omezeno na max_input_vars. |
| Zabezpečení | Vždy ověřujte a dezinfikujte. |
| Špatně formulované adresy URL | Ochrana před neplatnými vstupy. |
Souhrn
- Použijte
$_GETpro aktuální parametry požadavku. - Použijte
parse_url()+parse_str()pro libovolné adresy URL. - Zapouzdřit parsování do pomocných modulů.
- Vždy ověřujte a upravujte vstupní údaje.