Jak číst a získávat parametry URL v jazyce PHP

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"...

Poptat web

24. 09. 2025

Jak číst a získávat parametry URL v jazyce PHP

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 = php
  • lang = en
  • page = 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 existence
if (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:

  • $_GET funguje 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(), ??, nebo filter_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_vars můž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:

<?php
function 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

<?php
function 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

  1. Použijte $_GET pro aktuální parametry požadavku.
  2. Použijte parse_url() + parse_str() pro libovolné adresy URL.
  3. Zapouzdřit parsování do pomocných modulů.
  4. Vždy ověřujte a upravujte vstupní údaje.

Původní článek publikoval Nabil Hassen.