PHP - URL (Uniform Resource Locator) Yapısının Analizi

URL’ler; protokol (scheme), alan adı (host), yol (path), sorgu (query) ve parça (fragment) gibi bölümlerden oluşur. PHP’de URL parçalamak için parse_url(), query parametrelerini diziye çevirmek için parse_str() (veya önerilen şekilde parse_str($query, $out)) kullanılır.

Püf Noktalar (Güncel)
  • parse_str($query) değişkenleri “ortama” (global scope) basabilir; en güvenlisi parse_str($query, $params) kullanmaktır.
  • URL’de #fragment kısmı sunucuya gönderilmez; sadece tarayıcı tarafında kullanılır (örn: sayfa içi anchor).
  • Query oluşturmak için http_build_query() çok kullanılır.
  • Gelen parametreleri doğrudan kullanmadan önce doğrulama/süzme (filter) yapmak güvenlidir.

1) URL’yi Parçalamak: parse_url()

parse_url() bir URL’yi parçalar ve sonuçları anahtarları olan bir dizi halinde döndürür (scheme, host, path, query, fragment, port, user, pass...).

Örnek: parse_url()
<?php
$url = "https://www.mehmeterbas.com/ipucugoster.php?kodturu=php&id=45&secim=sil#bolum1";

$parcalar = parse_url($url);

print_r($parcalar);

/*
Array
(
    [scheme] => https
    [host] => www.mehmeterbas.com
    [path] => /ipucugoster.php
    [query] => kodturu=php&id=45&secim=sil
    [fragment] => bolum1
)
*/
?>
Canlı Çıktı (örnek URL parçaları)
scheme: https
host: www.mehmeterbas.com
path: /ipucugoster.php
query: kodturu=php&id=45&secim=sil
fragment: bolum1

2) Query Parametrelerini Ayırmak: parse_str()

URL’nin query kısmı genelde anahtar=değer çiftlerinden oluşur. Bu kısmı diziye çevirmek için parse_str() kullanılır.

Örnek: parse_str($query, $params)
<?php
$url = "https://www.mehmeterbas.com/ipucugoster.php?kodturu=php&id=45&secim=sil";

$parcalar = parse_url($url);

// Güvenli kullanım: sonuçları diziye al
$params = [];
if (!empty($parcalar["query"])) {
    parse_str($parcalar["query"], $params);
}

print_r($params);

/*
Array
(
    [kodturu] => php
    [id] => 45
    [secim] => sil
)
*/
?>
Neden bu şekilde?
parse_str($query) çağrısı $id, $kodturu gibi değişkenleri otomatik oluşturabilir. Bu, isim çakışması ve güvenlik açısından istenmeyebilir. Bu yüzden parse_str($query, $params) önerilir.

3) Query Oluşturmak: http_build_query()

Bir dizi parametreyi URL query formatına çevirmek için en pratik fonksiyon http_build_query()’dir.

Örnek: http_build_query()
<?php
$baseUrl = "https://www.mehmeterbas.com/ipucugoster.php";

$params = [
  "kodturu" => "php",
  "id" => 45,
  "secim" => "sil"
];

$query = http_build_query($params);
$yeniUrl = $baseUrl . "?" . $query;

echo $yeniUrl;
// https://www.mehmeterbas.com/ipucugoster.php?kodturu=php&id=45&secim=sil
?>

Bonus: Gerçek Sayfa İsteğinde Parametreleri Okumak

Bir sayfa çağrıldığında query parametreleri zaten $_GET içinde gelir. Örneğin: /sayfa.php?id=45 çağrısında $_GET["id"] erişilebilir olur.

Örnek: $_GET ile güvenli okuma
<?php
// /sayfa.php?id=45&secim=sil gibi bir çağrıda:
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
$secim = filter_input(INPUT_GET, "secim", FILTER_SANITIZE_FULL_SPECIAL_CHARS);

if ($id === null || $id === false) {
  echo "Geçersiz id";
} else {
  echo "id = " . $id . "<br>";
  echo "secim = " . ($secim ?? "");
}
?>