PHPではGETやPOSTは$_GET、$_POSTの連想配列に格納されます。
例
$_GET['aaa']に10
$_GET['bbb']にexam
例えば、このような連想配列を、キーを『key』、値を『val』にした連想配列にして、さらに配列に格納する関数は次のようになります。
$re_arr=array();
while(list ($key, $val) = each($rensohairetsu)) {
$re_arr[]=array("key"=>$key,"val"=>$val);
}
return $re_arr;
}
これを使うとGETとPOSTは
return HashArray($_GET);
}
function PostHashArray(){
return HashArray($_POST);
}
このようにして配列に格納できます。
さらにGETされた変数をURIにくっつける関数は次のようになり、ちょっと便利です。
$allow_arr 継続してGETする変数名を配列で渡します。
$sid_add 1にするとセッションIDを付けます。
$get_v="";
$get_arr=GetHashArray();
for($i=0;$i<count($get_arr);$i++){
for($j=0;$j<count($allow_arr);$j++){
if($get_arr[$i]["key"]==$allow_arr[$j]){
break;
}
}
if($j>=count($allow_arr)){
if($get_v!=""){
$get_v.="&";
}
$get_v.=$get_arr[$i]["key"]."=".$get_arr[$i]["val"];
}
}
if($sid_add==1){
if($get_v!=""){
$get_v.="&";
}
$get_v.=htmlspecialchars(SID);
}
return $get_v;
}
W3Cの規格では&は、&で書くことが推奨されていますが、対応していないブラウザもあるため&を使用したほうがいい場合があります。
セキュリティ上SIDもhtmlspecialcharsでエスケープしましょう。
セッションIDは文字変数に入れてもブランクになるので注意。
if($st==""){
echo "空欄";
}else{
echo "空欄ではない";
}
この結果 -->空欄
配列をPOSTした場合
<input name="test[1]" 〜〜〜 />
このような値をPOSTすると
$_POST['test'][0]
$_POST['test'][1]
こんな感じで値が得られます。
GETやPOST(ついでにSESSION)を便利にする関数
POSTの値を得るには通常 次のようにします。
【変数】 = (isset($_POST['【name属性値】']))? $_POST['【name属性値】'] : 【規定値】;
$_POST['test']が定義されてたら$_POST['test']を、定義されてなかったら規定値(この場合ブランク)を変数に入れるとなるのですが、
$test = htmlspecialchars($test)とかhiddenとか、それ以外の扱い方は2個組になっているので、置き換えで編集するのは不便です。
そこで値の取得も2個組みになるように関数を作るとプログラミングが早くなります。
return (isset($_GET[$form_name]))? $_GET[$form_name] : $default;
}
function post_value($form_name,$default=""){
return (isset($_POST[$form_name]))? $_POST[$form_name] : $default;
}
function session_value($form_name,$default=""){
return (isset($_SESSION[$form_name]))? $_SESSION[$form_name] : $default;
}
さらにPOSTやSESSIONが配列の場合は
return (isset($_POST[$form_name][$i]))? $_POST[$form_name][$i] : $default;
}
function session_value_arr($form_name,$i,$default=""){
return (isset($_SESSION[$form_name][$i]))? $_SESSION[$form_name][$i] : $default;
}
このようにしてもいいのですが、もうそのまま配列に入れてしまうのもいいです。
$ret_arr=array();
if((isset($_POST[$form_name]))){
for($i=0;$i<count($_POST[$form_name]);$i++){
$ret_arr[$i]=(isset($_POST[$form_name][$i]))? $_POST[$form_name][$i] : $default;
}
}
return $ret_arr;
}
入力フォームでGET・SESSION(セッション)を使うときの注意
formタグのmethod属性をmethod="get"とした場合、URLに付加されたパラメータは無視されます。
具体的には次のようにしてもGETパラメータのa=10やセッションIDは送信されません。
<input type="submit" value="送信" />
</form>
セッションIDをGETで送信するには次のようにするか、php.iniなどでセッションIDを自動的に付加するようにします。
<input type="hidden" name="<?=htmlspecialchars(session_name())?>" value="<?=htmlspecialchars(session_id())?>">
<input type="submit" value="送信" />
</form>
php.iniなどで設定する場合にはsession.use_trans_sidなど
ただしcookie(クッキー)ではなく、URL付加によるセッションIDの受け渡しはセキュリティ的に推奨されませんし、ブックマークなどに使われると厄介です。