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.
parse_str($query)değişkenleri “ortama” (global scope) basabilir; en güvenlisiparse_str($query, $params)kullanmaktır.- URL’de
#fragmentkı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...).
<?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
)
*/
?>
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.
<?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
)
*/
?>
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.
<?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.
<?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 ?? "");
}
?>