PHP で GET パラメータを表示するサンプルコード。

test.php


<?php

function dump($key, $val) {
  $valType = gettype($val);
  echo("${key}: ${val} (${valType})\n");
}

foreach ($_GET as $key => $val) {
  dump($key, $val);
}

簡易的に ビルトインウェブサーバー を起動する。


$ php -S 0.0.0.0:8888

他のターミナルから curl でアクセスしてみると・・・「.a」パラメータなのに「_a」になってる。


$ curl "http://localhost:8888/test.php?.a=hello"
_a: hello (string)

「_a」パラメータは「_a」のまま。


$ curl "http://localhost:8888/test.php?_a=hello"
_a: hello (string)

「.a」と「_a」パラメータを同時に使用してみると・・・パラメータの順番で後のものが優先されていた。


$ curl "http://localhost:8888/test.php?.a=dot&_a=line"
_a: line (string)

$ curl "http://localhost:8888/test.php?_a=line&.a=dot"
_a: dot (string)

パラメータの途中にあるドット「.」もアンダーライン「_」に変換されてしまう。


$ curl "http://localhost:8888/test.php?a.a=hello"
a_a: hello (string)

ドキュメントを探してみると、

注意:
変数名のドットやスペースはアンダースコアに変換されます。 たとえば <input name="a.b" /> は $_REQUEST["a_b"] となります。

PHP: 外部から来る変数 - Manual

もしかして・・・

array_test.php


<?php
$a = [];
$a['.a'] = 'hello';
var_dump($a);

実行。連想配列のキーにドット「.」が使えないわけじゃなかった。ほっ。。。


$ php array_test.php
array(1) {
  [".a"]=>
  string(5) "hello"
}

配列のドキュメントを見ていたら、また心配そうなものを見かけてしまった。

integer として妥当な形式の文字列は integer 型にキャストされます。 つまり、キーに "8" を指定すると、実際には 8 として格納されるということです。一方 "08" はキャストされません。これは十進数として妥当な形式ではないからです。

PHP: 配列 - Manual

もしかして・・・というわけでサンプルコードを書く。

test2.php


<?php

function dump($key, $val) {
  $keyType = gettype($val); // キーの型を取得
  $valType = gettype($val);
  echo("${key} (${keyType}): ${val} (${valType})\n");
}

foreach ($_GET as $key => $val) {
  dump($key, $val);
}

PHPのビルトインサーバ上で動かして、他のターミナルから「8」のパラメータ名を指定する。


$ curl "http://localhost:8888/test2.php?8=hello"
8 (string): hello (string)

連想配列のキーは integer にキャストされてなかった。

$_GET で値を取得するのは、なかなかまぎらわしい。。。

tags: php

Posted by NI-Lab. (@nilab)