パソコンQ&A

POSTやGETは連想配列になっている

PHPではGETやPOSTは$_GET、$_POSTの連想配列に格納されます。

test.php?aaa=10&bbb=exam

$_GET['aaa']に10
$_GET['bbb']にexam


例えば、このような連想配列を、キーを『key』、値を『val』にした連想配列にして、さらに配列に格納する関数は次のようになります。

function HashArray($rensohairetsu){
  $re_arr=array();
  while(list ($key, $val) = each($rensohairetsu)) {
    $re_arr[]=array("key"=>$key,"val"=>$val);
  }

  return $re_arr;
}


これを使うとGETとPOSTは

function GetHashArray(){
  return HashArray($_GET);
}
function PostHashArray(){
  return HashArray($_POST);
}

このようにして配列に格納できます。

さらにGETされた変数をURIにくっつける関数は次のようになり、ちょっと便利です。
$allow_arr 継続してGETする変数名を配列で渡します。
$sid_add 1にするとセッションIDを付けます。

function SelfGet($allow_arr=array(),$sid_add=1){
  $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.="&amp;";
      }
      $get_v.=$get_arr[$i]["key"]."=".$get_arr[$i]["val"];
    }
  }
  if($sid_add==1){
    if($get_v!=""){
      $get_v.="&amp;";
    }
    $get_v.=htmlspecialchars(SID);
  }

  return $get_v;
}

W3Cの規格では&は、&amp;で書くことが推奨されていますが、対応していないブラウザもあるため&を使用したほうがいい場合があります。
セキュリティ上SIDもhtmlspecialcharsでエスケープしましょう。
セッションIDは文字変数に入れてもブランクになるので注意。

$st=SID;
if($st==""){
  echo "空欄";
}else{
  echo "空欄ではない";
}

この結果 -->空欄

配列をPOSTした場合

<input name="test[0]" 〜〜〜 />
<input name="test[1]" 〜〜〜 />

このような値をPOSTすると
$_POST['test'][0]
$_POST['test'][1]
こんな感じで値が得られます。

GETやPOST(ついでにSESSION)を便利にする関数

POSTの値を得るには通常 次のようにします。

$test = (isset($_POST['test']))? $_POST['test'] : "";
【変数】 = (isset($_POST['【name属性値】']))? $_POST['【name属性値】'] : 【規定値】;

$_POST['test']が定義されてたら$_POST['test']を、定義されてなかったら規定値(この場合ブランク)を変数に入れるとなるのですが、 $test = htmlspecialchars($test)とかhiddenとか、それ以外の扱い方は2個組になっているので、置き換えで編集するのは不便です。
そこで値の取得も2個組みになるように関数を作るとプログラミングが早くなります。

function get_value($form_name,$default=""){
  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が配列の場合は

function post_value_arr($form_name,$i,$default=""){
  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;
}

このようにしてもいいのですが、もうそのまま配列に入れてしまうのもいいです。

function post_value_arr2($form_name,$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は送信されません。

<form name="form" method="get" action="test.php?a=10&">
<input type="submit" value="送信" />
</form>

セッションIDをGETで送信するには次のようにするか、php.iniなどでセッションIDを自動的に付加するようにします。

<form name="form" method="get" action="test.php">
<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の受け渡しはセキュリティ的に推奨されませんし、ブックマークなどに使われると厄介です。

このページはリンクフリーです。設定などは自己責任で…
Copy Right kikky

kikky.net