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)