PHP で POST を取得するには、通常、$_POST 変数が使われるが、下記のような配列になっていない フォーム の場合、同じ変数に格納しようとするため、全データを取得することができません。
<form method="post">
<input value="AAAAA" name="a" />
<inpu value="BBBBB" name="a" />
<input value="CCCCC" name="a" />
<input value="CCCCC" name="a" />
<input value="D&E" name="a" />
<input type="submit" />
</form>
もちろん、下記のように HTML にて、PHP で取得時に配列に格納されるよう name 属性を変更すれば取得できます。
<form method="post">
<input value="AAAAA" name="a[]" />
<inpu value="BBBBB" name="a[]" />
<input value="CCCCC" name="a[]" />
<input value="CCCCC" name="a[]" />
<input value="D&E" name="a[]" />
<input type="submit" />
</form>
ただ、最近の案件で HTML を変更できないケースがあり、そのときに使った関数を忘れないようにメモ。
<?php
function jGetInputData($type = 'post', $str = null, $del_null_byte = true) {
if ($str === null) {
switch (strtolower($type)) {
case 'get':
$str = $_SERVER["QUERY_STRING"];
break;
case 'post':
default:
$str = file_get_contents("php://input");
}
}
if (!is_string($str)) return false;
if (trim($str) === '') return array();
$datas = (strpos($str, '&') === false) ? array($str) : explode('&', $str);
$rtn = array();
foreach($datas as $data) {
$name = null;
$val = null;
if (strpos($data, '=') === false) {
$name = urldecode($data);
} else {
$_tmp = explode('=', $data, 2);
$name = urldecode($_tmp[0]);
$val = urldecode($_tmp[1]);
}
if (!isset($rtn[$name])) {
$rtn[$name] = $val;
} else {
if (!is_array($rtn[$name])) {
$rtn[$name] = array($rtn[$name]);
}
$rtn[$name][] = $val;
}
}
if ($del_null_byte) {
$rtn = jDelNullbyte($rtn);
}
return $rtn;
}
function jDelNullbyte($data) {
if (is_array($data)) {
return array_map('jDelNullbyte', $data);
}
return str_replace("\0", '', $data);
}
使う場合は
<?php
$_POST = jGetInputData();
のような感じで。
<form method="post">
<input value="AAAAA" name="a" />
<inpu value="BBBBB" name="a" />
<input value="CCCCC" name="a" />
<input value="CCCCC" name="a" />
<input value="D&E" name="a" />
<input value="F" name="a.b" />
<input value="G" name="あいう=えお" />
<input value="H" name="" />
<input value="" name="I" />
<input value="JJJJJ" name="a[]" />
<input type="submit" />
</form>
に対して
<?php
var_dump(jGetInputData());
をすると、
array(6) {
["a"]=>
array(4) {
[0]=>
string(5) "AAAAA"
[1]=>
string(5) "CCCCC"
[2]=>
string(5) "CCCCC"
[3]=>
string(3) "D&E"
}
["a.b"]=>
string(1) "F"
["あいう=えお"]=>
string(1) "G"
[""]=>
string(1) "H"
["I"]=>
string(0) ""
["a[]"]=>
string(5) "JJJJJ"
}
のように返ります。
何らかの事情で HTML を変更できない、もしくは変更せずに PHP からその値を取得したい場合があれば、自由に改変して使っていただいて結構です。
なお、上記関数を使用した場合、name 属性で使用した文字列がそのまま配列のアイテム名になり、[]を使用しても配列として展開されないので注意。
間違いがありましたら、コメントください。