LoginSignup
2
1

More than 5 years have passed since last update.

PHP の「http_build_query()」で「%5B0%5D」の自動挿入

Last updated at Posted at 2018-02-21

TL;DR (その値、文字列ですか?)

「%5B0%5D」は文字列「[0]」を URL エンコードしたもの

PHP のhttp_build_query関数を使う際、第1引数に渡す配列に注意する必要があります。
というのも、配列の値(value)が文字列以外の場合はキー名に「[n]」が付加されるからです。

パターン1
/* パターン1 */
$params = http_build_query([
    'hoge' => ['fuga'],
]);

echo $params . PHP_EOL;
echo urldecode($params) . PHP_EOL;

// 出力結果('hoge'のキー名に"%5B0%5D"が付いてしまう)
//
// hoge%5B0%5D=fuga
// hoge[0]=fuga
パターン2
/* パターン2 */
$params = http_build_query([
    'foo'  => 'bar',
    'hoge' => ['huga', 'piyo']
]);

echo $params . PHP_EOL;
echo urldecode($params) . PHP_EOL;

// 出力結果('hoge'のキーに"%5B?%5D"が付くが'foo'のキーには付かない)
//
// foo=bar&hoge%5B0%5D=huga&hoge%5B1%5D=piyo
// foo=bar&hoge[0]=huga&hoge[1]=piyo
/* 受け手(POST/GET先)の仕様上どうしても消したい場合は置き換える(削除する) */
$params = preg_replace('/%5B(\d+?)%5D/', '', $params);
echo $params . PHP_EOL;

// 出力結果
//foo=bar&hoge=huga&hoge=piyo

所感

実家の WiFi ルーターが、WiFi カメラを設置してから調子が悪く(同じカメラのセッションが大量に残ってしまうため)定期的な再起動が必要になりました。

病院提出用にトイレの回数を取るために使っていたラズパイ3と AmazonDashButton(ADB) があったので、ADB でルータを再起動させたいと思いました。しかし、curl で叩くと正常に再起動するのに、PHP で書いた CLI スクリプトが動かない。

出力した内容(POST する内容)をよくよく見ると「%5B0%5D」という見慣れない文字列が入っていました。

どうやらルータを再起動するために必要なセッション ID を取得する為に使った DOMDocument() で XML(リブートのページ)から抜き出したフォームの value 属性値がオブジェクトのままだったようです。アチョンブリケ。

参考文献

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1