ใช้ parse_url() แยกส่วนของ URL แล้ว parse_str() Parse Query String ให้เป็น Array
ฟังก์ชันมาตรฐาน
/**
* ดึง Query Parameters จาก URL
*
* @param string $url
* @return array Associative Array ของ Parameters
*/
function getUrlParams(string $url): array {
$parsed = parse_url($url);
$query = $parsed['query'] ?? '';
$params = [];
if ($query !== '') {
parse_str($query, $params);
}
return $params;
}
// ใช้งาน
$url = 'https://example.com/register?name=demo&email=example12@domain.com&age=25';
$params = getUrlParams($url);
echo $params['name']; // demo
echo $params['email']; // example12@domain.com
echo $params['age']; // 25
รายละเอียด parse_url() Components
$url = 'https://user:pass@example.com:8080/path/to/page?name=value&foo=bar#anchor';
$parsed = parse_url($url);
print_r($parsed);
/*
Array
(
[scheme] => https
[host] => example.com
[port] => 8080
[user] => user
[pass] => pass
[path] => /path/to/page
[query] => name=value&foo=bar
[fragment] => anchor
)
*/
// ดึง Component เฉพาะ
echo parse_url($url, PHP_URL_HOST); // example.com
echo parse_url($url, PHP_URL_PATH); // /path/to/page
echo parse_url($url, PHP_URL_QUERY); // name=value&foo=bar
echo parse_url($url, PHP_URL_SCHEME); // https
parse_str() พฤติกรรมพิเศษ
$query = 'arr[]=1&arr[]=2&arr[key]=val&foo=bar&foo=baz';
parse_str($query, $params);
print_r($params);
/*
Array
(
[arr] => Array
(
[0] => 1
[1] => 2
[key] => val
)
[foo] => baz // Duplicate Key: ตัวหลัง Overwrite (ไม่ใช่ Array!)
)
*/
// ถ้าต้องการเก็บ Duplicate Keys เป็น Array:
$query = 'foo=bar&foo=baz';
parse_str($query, $params); // $params['foo'] = 'baz' (Last Wins)
// ใช้แทน: Manual Parse
function parseStrKeepDuplicates(string $query): array {
$params = [];
foreach (explode('&', $query) as $pair) {
[$key, $value] = array_pad(explode('=', $pair, 2), 2, '');
$key = urldecode($key);
$value = urldecode($value);
$params[$key][] = $value;
}
return $params;
}
สร้าง URL จาก Parameters (http_build_query)
$params = [
'name' => 'John Doe',
'tags' => ['php', 'mysql'],
'active' => true,
];
$query = http_build_query($params);
// name=John+Doe&tags%5B0%5D=php&tags%5B1%5D=mysql&active=1
$url = 'https://example.com/api?' . $query;
จัดการ URL ใน Object-Oriented (PHP 8.0+)
// ใช้ UriInterface (PSR-7) หรือ League/Uri
// composer require league/uri
use League\Uri\Components\Query;
use League\Uri\Http;
$uri = Http::createFromString('https://example.com/path?name=value');
$query = $uri->getQuery(); // Query Object
// Manipulate
$query = $query->withPair('name', 'newvalue');
$query = $query->withoutPair('oldparam');
$newUri = $uri->withQuery($query);
echo (string)$newUri; // https://example.com/path?name=newvalue
⚠️ Security: XSS Prevention
// เมื่อ Echo Parameter กลับไปใน HTML
$name = $_GET['name'] ?? '';
// ❌ ไม่ปลอดภัย
echo "Welcome $name";
// ✅ ปลอดภัย
echo 'Welcome ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
// ใน URL (Href)
$url = 'https://example.com/?name=' . urlencode($name);