Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

ดึง Parameter จาก URL String ใน PHP (parse_url + parse_str)

ใช้ 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);