PHPでGET/POSTでフォームから値を受け取る

(1/1)
HTMLのGET/POSTでフォームを使って何かを入力し、それをPHPプログラムに渡すことはよく行われる。
そこで今回は、GET/POSTの両方で利用でき、日本語テキストも受け取ることができるユーザー関数を作ってみることにする。

目次

サンプル・プログラムの実行例

PHPでGET/POSTでフォームから値を受け取る

サンプル・プログラム

解説:コマンドラインから起動されたかどうか

0140: /**
0141:  * コマンドラインから起動されたかどうか
0142:  * @param   string $btn  ボタン名
0143:  * @return  bool TRUE=コマンドライン起動である/FALSE=でない
0144: */
0145: function isCommandLine() {
0146:     global $argv;
0147: 
0148:     return (isset($argv) && ($argv[0] == MYSELF)) ? TRUE : FALSE;
0149: }

PHP 8:Windows版のイントール/Apacheと連携/特長」で紹介するように、PHPスクリプトはコマンドラインから実行することもできる。ユーザー定義関数 isCommandLine はコマンドラインから実行されたかどうかを判定する。

一般に、PHPスクリプトをコマンドラインから起動すると、グローバル配列変数 $argv にコマンドライン・パラメータがセットされる。最初の要素には自身のスクリプト・ファイル名が入るので、これをチェックしてコマンドラインから起動されたかどうかを判定する。

解説:指定したボタンが押されたかどうか

0151: /**
0152:  * 指定したボタンが押されたかどうか
0153:  * @param   string $btn        ボタン名
0154:  * @param   bool   $ignoreCase TRUE:大文字小文字を無視/FALSE:無視しない
0155:  * @param   bool   $shorted    TRUE:CUIで短縮形を使う/使わない
0156:  *                  短縮形の例 --help, -h
0157:  * @return  bool TRUE=押された/FALSE=押されていない
0158: */
0159: function isButton($btn$ignoreCase=FALSE$shorted=TRUE) {
0160:     global $argv;
0161: 
0162:     $param = FALSE;
0163:     //GETから取得
0164:     if (isset($_GET[$btn])) {
0165:         $param = TRUE;
0166:     //POSTから取得
0167:     } else if (isset($_POST[$btn])) {
0168:         $param = TRUE;
0169:     //コマンドラインから取得
0170:     } else if (isCommandLine()) {
0171:         foreach ($argv as $str) {
0172:             if ($str == ('--' . $btn)) {
0173:                 $param = TRUE;
0174:                 break;
0175:             //短縮形
0176:             } else if ($shorted && ($str == ('-' . substr($btn, 0, 1)))) {
0177:                 $param = TRUE;
0178:                 break;
0179:             }
0180:         }
0181:     }
0182: 
0183:     //大文字・小文字を無視
0184:     if (!$param && $ignoreCase) {
0185:         $btn = mb_strtoupper($btn);
0186:         //GETから取得
0187:         foreach ($_GET as $key=>$val) {
0188:             if (mb_strtoupper($key) == $btn) {
0189:                 $param = TRUE;
0190:                 break;
0191:             }
0192:         }
0193:         //POSTから取得
0194:         foreach ($_POST as $key=>$val) {
0195:             if (mb_strtoupper($key) == $btn) {
0196:                 $param = TRUE;
0197:                 break;
0198:             }
0199:         }
0200:         //コマンドラインから取得
0201:         if (!$param && isset($argv)) {
0202:             foreach ($argv as $str) {
0203:                 if (mb_strtoupper($str) == ('--' . $btn)) {
0204:                     $param = TRUE;
0205:                     break;
0206:                 //短縮形
0207:                 } else if ($shorted && (mb_strtoupper($str) == ('-' . substr($btn, 0, 1)))) {
0208:                     $param = TRUE;
0209:                     break;
0210:                 }
0211:             }
0212:         }
0213:     }
0214: 
0215:     return $param;
0216: }

ブラウザ画面(GUI版)でボタンが押されたかどうか、またはコマンドライン(CUI版)でコマンドライン・オプションが指定されたかどうかを判定するユーザー関数が isButton である。
引数として、対象となるボタン・オブジェクトのname属性、またはコマンドライン・オプション文字列を $btn に代入する。name属性またはコマンドライン・オプション文字列の大文字・小文字を無視したいときは $ignoreCasTRUE を、そうでないときは FALSE を代入する。CUIでコマンドライン・オプション文字列の短縮形を使いたいときは $shortedTRUE を、そうでないときは FALSE を代入する。短縮形とは、コマンドライン・オプション文字列の先頭1文字を指す。たとえば、オプション --help の短縮形は -h である。

処理としては、まず、グローバル変数 $_GET$_POST の順に、 $btn と一致するキーがあるかどうかを調べる。
次に、コマンドライン起動の場合(isCommandLineTRUE)なら、グローバル変数 $argv に '--' + $btn と一致する要素があるかどうかを調べる。短縮形が指定された場合は、$btn の冒頭1文字を切り出して比較する。

次に、大文字・小文字を無視する場合の処理である。
$_GET$_POST$argv のすべてについて、組み込み関数  mb_strtoupper  を使って大文字に変換してから比較を行う。

解説:パラメータを取り出す

0218: /**
0219:  * 指定したパラメータを取り出す
0220:  * @param   string $key  パラメータ名(省略不可)
0221:  * @param   bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0222:  * @param   mixed  $def  初期値(省略時:空文字)
0223:  * @param   bool   $ignoreCase TRUE:大文字小文字を無視/FALSE:無視しない
0224:  * @param   bool   $shorted    TRUE:CUIで短縮形を使う/使わない
0225:  *                  短縮形の例 --help, -h
0226:  * @return  string パラメータ/NULL=パラメータ無し
0227: */
0228: function getParam($key$auto=TRUE$def=NULL$ignoreCase=FALSE$shorted=TRUE) {
0229:     global $argv;
0230: 
0231:     $param = $def;
0232:     //GETから取得
0233:     if (isset($_GET[$key])) {
0234:         $param = $_GET[$key];
0235:     //POSTから取得
0236:     } else if (isset($_POST[$key])) {
0237:         $param = $_POST[$key];
0238:     //コマンドラインから取得
0239:     } else if (isset($argv)) {
0240:         foreach ($argv as $str) {
0241:             $arr = explode('=', $str);
0242:             if (($arr[0] == ('--' . $key)) || ($arr[0] == ('-' . $key))) {
0243:                 $param = isset($arr[1]) ? $arr[1] : '';
0244:                 break;
0245:             //短縮形
0246:             } else if ($shorted && ($arr[0] == ('-' . substr($key, 0, 1)))) {
0247:                 $param = isset($arr[1]) ? $arr[1] : '';
0248:                 break;
0249:             }
0250:         }
0251:     }
0252: 
0253:     //大文字・小文字を無視
0254:     if ($ignoreCase) {
0255:         $key = mb_strtoupper($key);
0256:         //GETから取得
0257:         foreach ($_GET as $str=>$val) {
0258:             if (mb_strtoupper($str) == $key) {
0259:                 $param = $val;
0260:                 break;
0261:             }
0262:         }
0263:         //POSTから取得
0264:         foreach ($_POST as $str=>$val) {
0265:             if (mb_strtoupper($str) == $key) {
0266:                 $param = $val;
0267:                 break;
0268:             }
0269:         }
0270:         //コマンドラインから取得
0271:         if (isCommandLine()) {
0272:             foreach ($argv as $str) {
0273:                 $arr = explode('=', $str);
0274:                 if ((mb_strtoupper($arr[0]) == ('--' . $key)) || (mb_strtoupper($arr[0]) == ('-' . $key))) {
0275:                     $param = isset($arr[1]) ? $arr[1] : '';
0276:                     break;
0277:                 //短縮形
0278:                 } else if ($shorted && (mb_strtoupper($arr[0]) == ('-' . substr($key, 0, 1)))) {
0279:                     $param = isset($arr[1]) ? $arr[1] : '';
0280:                     break;
0281:                 }
0282:             }
0283:         }
0284:     }
0285: 
0286:     //自動コード変換
0287:     if ($auto) {
0288:         $param = mb_convert_encoding($paramINTERNAL_ENCODING, 'auto');
0289:     }
0290: 
0291:     return $param;
0292: }

ブラウザ画面(GUI版)でテキストやチェックボックスの値を取得したり、またはコマンドライン(CUI版)でコマンドライン・オプションの値を取得するユーザー関数が getParam である。
引数として、対象となるボタン・オブジェクトのname属性、またはコマンドライン・オプション文字列を $key に代入する。取得地がテキストのような場合、文字エンコードをあらかじめ定義してある内部エンコード INTERNAL_ENCODE に自動変換させたいときには $autoTRUE にする。オブジェクトやコマンドライン・オプションが無かったときのデフォルト値を指定したいときは $def に代入する。name属性またはコマンドライン・オプション文字列の大文字・小文字を無視したいときは $ignoreCasTRUE を、そうでないときは FALSE を代入する。CUIでコマンドライン・オプション文字列の短縮形を使いたいときは $shortedTRUE を、そうでないときは FALSE を代入する。短縮形とは、コマンドライン・オプション文字列の先頭1文字を指す。たとえば、オプション --help の短縮形は -h である。

処理は、isButton とほぼ同じである。
コマンドライン・オプションから値を取り出すために  explode  を利用している。
最後に、mb_convert_encoding 関数を使って文字エンコードを自動変換する。

コマンドラインでオプションを指定するときは、
php getParam.php --param=12345
のようにする。短縮オプションは
php getParam.php -p=12345
である。

解説:isCommandLine,isButton,getParamの使い方

0345: // メイン・プログラム ======================================================
0346: $param = getParam('param', TRUE,  '', TRUETRUE);
0347: 
0348: //リセット
0349: if (isButton('reset')) {
0350:     $param = '';
0351: }
0352: 
0353: //GUI
0354: if (! isCommandLine()) {
0355:     //表示
0356:     $HtmlBody = makeCommonBody($param);
0357:     echo $HtmlHeader;
0358:     echo $HtmlBody;
0359:     echo $HtmlFooter;
0360: 
0361: //CUI
0362: else {
0363:     if (isButton('help')) {
0364:         echo $Help;
0365:     } else {
0366:         echo $param;
0367:     }
0368: }
0369: 
0370: /*

ユーザー関数 isCommandLineisButtongetParam は、このようにして使う。

要素 param からはパラメータを取り出し、ボタン reset については押下されているかどうかの判定を、そして、コマンドラインから起動しているかどうかを判定する。

参考サイト

(この項おわり)
header