こんにちは!今日は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パラメータを取得する
