《PHP8上級試験対策》http_build_query()関数によるURLエンコード処理の仕組みを理解しよう

  • URLをコピーしました!

はじめに

http_build_query() は、配列をURLクエリ文字列に変換する便利な関数です。
ただし、エンコードルール(空白→+%20 か)や特殊文字の扱いを正しく理解していないと、出力結果を見て「なぜこうなるの?」と戸惑うことも。
今回はPHP8上級試験の例題をベースに、エンコード処理の流れと仕様の違いをわかりやすく整理します。

キーワード: http_build_query / URLエンコード / クエリ文字列 / PHP_QUERY_RFC1738 / RFC3986

目次

🧩 コード例

<?php
declare(strict_types=1);
error_reporting(-1);

$params = [
    'id' => 'id string',
    'pass' => 'p&a=ss',
];

$q = http_build_query($params);
var_dump($q);

🧾 出力結果

string(28) "id=id+string&pass=p%26a%3Dss"

この出力は正しい動作です。では、なぜこのような文字列になるのかを順に見ていきましょう。

🔍 http_build_query() の基本仕様

http_build_query() は、連想配列をURLクエリ文字列に変換する関数です。

http_build_query(
    array $data,
    string $numeric_prefix = "",
    string $arg_separator = "&",
    int $encoding_type = PHP_QUERY_RFC1738
): string

✅ 主な役割

  • 各キーと値を key=value の形式に整形
  • 値を URLエンコード して安全に送信できる文字列へ変換
  • & でパラメータを連結する

⚙️ 各値がどのように変換されるか

元の値エンコード後備考
'id string''id+string'空白( )は + に変換される
'p&a=ss''p%26a%3Dss'&%26=%3D

結果として:

id=id+string&pass=p%26a%3Dss

というクエリ文字列になります。

💡 RFC指定による違い

実は、空白をどうエンコードするかは「エンコードタイプ」で変わります。

オプション内容空白の扱い出力例
PHP_QUERY_RFC1738(デフォルト)通常のWeb互換+id=id+string
PHP_QUERY_RFC3986RFC3986準拠%20id=id%20string

例:

echo http_build_query($params, '', '&', PHP_QUERY_RFC3986);
// 出力: id=id%20string&pass=p%26a%3Dss

🧭 図解:エンコードの流れ

$params = [
  'id'   => 'id string',
  'pass' => 'p&a=ss'
];

         │
         ▼
[1] キーと値のペアに分解
   → id=id string
   → pass=p&a=ss
         │
         ▼
[2] URLエンコード処理
   → id=id+string
   → pass=p%26a%3Dss
         │
         ▼
[3] &で連結
   → id=id+string&pass=p%26a%3Dss

🧩 まとめ

項目内容
関数名http_build_query()
目的配列をURLエンコード済みのクエリ文字列へ変換
デフォルト仕様RFC1738(空白→+
特殊文字&%26=%3D
試験ポイントエンコード結果が "id=id+string&pass=p%26a%3Dss" になるのは正しい

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次