php備忘録: FORMでの値の受け渡し(GET編)

サイトの再構築でphpを学習中。

perlよりもお手軽に書ける感じだが、定義なしに変数を使えるのは善し悪し。
便利だけれど思わぬバグの元です。
以下の例で使用した「可変変数」は上手に活用すれば、とても便利だと思います。

FORMで送信するデータをGETで受ける場合の例文を見ていると、全てのデータを一旦展開するものが多い様子。
必要なものだけをGETして、規定値以外はデフォルトの値を持たせるようにしてみました。
チョットしたことですが、使ってみると応用範囲が広くて便利です。(^^)v

hoge.php
※ファイル名は任意、下記は文字コードUTF-8用に記述してあります。
<?php
header('Content-Type: text/html; charset=UTF-8');
$countrydata = array(
  '00' => 'V Select',
  'ET' => 'Ethiopia',
  'GT' => 'Guatemala',
  'CO' => 'Colombia',
  'JM' => 'Jamaica',
  'TZ' => 'Tanzania',
  'BR' => 'Brazil',
  'MX' => 'Mexico',
);

$weightdata = array(
  '1' => '100g',
  '2' => '200g',
  '5' => '500g'
);

$roastdata = array(
  '0' => 'all',
  '1' => 'medium',
  '2' => 'high',
  '3' => 'city',
  '4' => 'full city',
  '5' => 'french'
);

$listdata = array(
  'weight' => array(
                'name'    => 'Weight',
                'default' => '2'
              ),
  'roast'  => array(
                'name'    => 'Roast',
                'default' => '0'
              ),
  'country'  => array(
                'name'    => 'Country',
                'default' => '00'
              )
);

foreach($listdata as $key => $value) {
  if (isset($_GET[$key])) {
    ${$key} = htmlspecialchars($_GET[$key], ENT_QUOTES);
  } else {
    ${$key} = $value['default'];
  }
  if (!array_key_exists(${$key}, ${$key.'data'})) {
    ${$key} = $value['default'];
  }
}
?>

<HTML>
<HEAD>
  <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <TITLE>Example(Weight:<?php echo $weight; ?>00g, Roast:<?php echo $roastdata[$roast]; ?>, Country:<?php echo $countrydata[$country]; ?>)</TITLE>
</HEAD>
<BODY>
<H1>Example</H1>
<HR>
<FORM action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET" style="margin:2px">
<?php
foreach ($listdata as $listkey => $listvalue) {
  print "  {$listvalue['name']}<SELECT name=\"$listkey\">\n";
  foreach (${$listkey.'data'} as $key => $value) {
    $linedata = "    <OPTION value=\"$key\"";
    if(${$listkey} == $key) $linedata .= ' selected';
    $linedata .= ">$value</OPTION>\n";
    print $linedata;
  }
  print "  </SELECT>\n";
}
?>
  <INPUT type="submit" value="Submit">
</FORM>
<HR>
<?php
foreach ($listdata as $listkey => $listvalue) {
  print "  {$listvalue['name']} => ".${$listkey.'data'}[${$listkey}]." /\n";
}
?>
</BODY>
</HTML>

【解説】
[$xxxxxdata = array();]
データテーブルの定義/「xxxxx」の部分は変数名を記述、キーと値を定義

[$listdata = array();]
先に定義したデータテーブルの「xxxxx」をキーにし、変数表示用の名称(name)と規定値(default)を定義
ここで定義したものがGETの対象となる。

[foreach($listdata as $key => $value)…]
$_GETしたデータ中に変数が存在すればその値を取得。
変数が存在しない場合、もしくは、データテーブルに取得した値が存在しなければ規定値にする。

[<HTML>~</HTML>]
サンプルプログラム。
各データテーブルの内容を<SELECT>~</SELECT>中に展開する。
キーの値が変数の値と等しい項目を「selected」する。
<FORM>中の「style=”margin:2px”」は送信ボタンの後ろに余白が出るのを防止するため。
最後は変数の内容確認のための「おまけ」。

カテゴリー: php パーマリンク