[PHP]parse_str関数を完全解説!使い方と注意点を実例付きで紹介

PHP

こんにちは!今日はPHPの便利な関数「parse_str」について、初心者の方にも分かりやすく解説していきます。

parse_str関数とは?

parse_strは、URLクエリ文字列(例:name=John&age=30)を解析して、PHPの変数や配列に変換してくれる関数です。フォームデータの処理やURLパラメータの取得など、Web開発で頻繁に使用される場面があります。

基本的な使い方

構文

parse_str(string $string, array &$result): void

パラメータ

  • $string: 解析したいクエリ文字列
  • $result: 解析結果を格納する配列(参照渡し)

基本的な使用例

<?php
// クエリ文字列を準備
$queryString = "name=山田太郎&age=25&city=東京";

// parse_strで解析
parse_str($queryString, $params);

// 結果を表示
print_r($params);
/*
出力:
Array
(
    [name] => 山田太郎
    [age] => 25
    [city] => 東京
)
*/

// 個別にアクセス
echo $params['name']; // 山田太郎
echo $params['age'];  // 25
?>

実践的な使用例

例1: URLからパラメータを取得

<?php
// URLの例: https://example.com/search?keyword=PHP&category=programming&sort=new

// クエリ文字列部分を取得
$url = "https://example.com/search?keyword=PHP&category=programming&sort=new";
$query = parse_url($url, PHP_URL_QUERY);

// parse_strで解析
parse_str($query, $searchParams);

echo "検索キーワード: " . $searchParams['keyword'];     // PHP
echo "カテゴリ: " . $searchParams['category'];           // programming
echo "並び順: " . $searchParams['sort'];                 // new
?>

例2: 配列形式のパラメータ

<?php
// 配列形式のクエリ文字列
$queryString = "colors[]=red&colors[]=blue&colors[]=green&size=large";

parse_str($queryString, $params);

print_r($params);
/*
出力:
Array
(
    [colors] => Array
        (
            [0] => red
            [1] => blue
            [2] => green
        )
    [size] => large
)
*/

// 配列の各要素にアクセス
foreach ($params['colors'] as $color) {
    echo $color . "<br>";
}
?>

例3: ネストした配列

<?php
$queryString = "user[name]=田中&user[email]=tanaka@example.com&user[age]=30";

parse_str($queryString, $data);

print_r($data);
/*
出力:
Array
(
    [user] => Array
        (
            [name] => 田中
            [email] => tanaka@example.com
            [age] => 30
        )
)
*/

echo $data['user']['name'];  // 田中
echo $data['user']['email']; // tanaka@example.com
?>

重要な注意点

1. 必ず第2引数を使用する

**PHP 7.2以降、第2引数を省略することは非推奨です。**必ず配列変数を指定してください。

// ❌ 非推奨(PHP 7.2+)
parse_str($queryString);

// ✅ 正しい使い方
parse_str($queryString, $result);

第2引数を省略すると、変数が現在のスコープに直接作成されるため、既存の変数を上書きしてしまう危険性があります。

2. セキュリティに注意

ユーザー入力をそのままparse_strに渡す場合は、セキュリティに注意が必要です。

<?php
// ユーザー入力を処理する場合
$userInput = $_SERVER['QUERY_STRING'];

// 安全に処理
parse_str($userInput, $params);

// バリデーションを実施
if (isset($params['id']) && is_numeric($params['id'])) {
    $id = (int)$params['id'];
    // 処理を続ける
} else {
    // エラー処理
    echo "無効なIDです";
}
?>

3. URLエンコードされた文字列の処理

parse_strは自動的にURLデコードを行います。

<?php
// URLエンコードされた文字列
$queryString = "message=Hello%20World&emoji=%F0%9F%98%80";

parse_str($queryString, $params);

echo $params['message']; // Hello World
echo $params['emoji'];   // 😀
?>

parse_urlとの組み合わせ

完全なURLからクエリパラメータを取得する際は、parse_urlと組み合わせると便利です。

<?php
$fullUrl = "https://example.com/page?id=123&action=edit&lang=ja";

// URLを解析
$urlParts = parse_url($fullUrl);

// クエリ文字列を取得して解析
if (isset($urlParts['query'])) {
    parse_str($urlParts['query'], $queryParams);
    
    print_r($queryParams);
    /*
    Array
    (
        [id] => 123
        [action] => edit
        [lang] => ja
    )
    */
}
?>

実践例: フィルター機能の実装

<?php
// 商品検索のフィルター機能
$filterString = "category=electronics&price_min=1000&price_max=50000&brand[]=Sony&brand[]=Panasonic&in_stock=1";

parse_str($filterString, $filters);

// フィルター条件を使ってSQL構築(疑似コード)
function buildSearchQuery($filters) {
    $conditions = [];
    
    if (!empty($filters['category'])) {
        $conditions[] = "category = '" . htmlspecialchars($filters['category']) . "'";
    }
    
    if (!empty($filters['price_min'])) {
        $conditions[] = "price >= " . (int)$filters['price_min'];
    }
    
    if (!empty($filters['price_max'])) {
        $conditions[] = "price <= " . (int)$filters['price_max'];
    }
    
    if (!empty($filters['brand'])) {
        $brands = array_map('htmlspecialchars', $filters['brand']);
        $conditions[] = "brand IN ('" . implode("','", $brands) . "')";
    }
    
    if (!empty($filters['in_stock'])) {
        $conditions[] = "in_stock = 1";
    }
    
    return "SELECT * FROM products WHERE " . implode(" AND ", $conditions);
}

echo buildSearchQuery($filters);
?>

まとめ

parse_str関数は、クエリ文字列を簡単に配列に変換できる便利な関数です。主なポイントを振り返りましょう:

  • クエリ文字列をPHP配列に変換する
  • 必ず第2引数を指定する(PHP 7.2+)
  • セキュリティに注意してバリデーションを実施
  • parse_urlと組み合わせると効果的
  • 配列やネストした構造もサポート

この関数を活用することで、URLパラメータの処理やフォームデータの扱いがよりシンプルになります。ぜひ実際のプロジェクトで活用してみてください!


関連記事

  • parse_url() – URLを構成要素に分解する
  • http_build_query() – クエリ文字列を生成する(parse_strの逆)
  • $_GET – HTTPのGETパラメータを取得する
タイトルとURLをコピーしました