PHPでHTMLフォームやコマンドラインから値を受け取る

(1/1)
HTMLの FORMタグSUBMITで指定したボタンが押下されたり、INPUTで入力したデータを受け取って、PHPプログラムで処理することはよく行われる。これを HTTP通信で見ると、GET または POSTメソッドでデータが渡される。
そこで今回は、GET/POSTのどちらからでもデータを受け取ることができ、PHPをコマンドラインで使うときにも利用でき、日本語にも対応する汎用ユーザー関数を作ってみることにする。

(2023年9月9日)$_GET, $_POST参照をfilter_input()関数に置換
(2023年4月16日)タイトル変更,大幅加筆

目次

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

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

サンプル・プログラム

圧縮ファイルの内容
getParam.phpサンプル・プログラム本体
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getParam.php 更新履歴
バージョン 更新日 内容
2.1.0 2023/04/22 説明用に isButtonDraft(), getParamDraft() 追加
2.0 2022/05/07 コマンドライン動作対応(CUI版)
1.1 2021/02/13 PHP8対応
1.0 2015/02/15 初版
pahooInputData.php 関数/メソッド一覧
関数/メソッド 機能 詳細
exitIfLessVersion PHPが指定したバージョン未満ならメッセージを表示して強制終了する.
isCommandLine コマンドラインから起動されたかどうかを求める.
isButton HTML FORMで指定したボタンが押されたかどうかを求める. filter_input()関数および $argv を参照する.
getParam HTML FORMで指定したINPUTの内容を取り出す. filter_input()関数および $argv を参照する.
validNumber 数値バリデーションを行う. 数値が整数か小数かを指定し,最小値と最大値を指定する.
getValidNumber HTML FORMで指定したINPUTの内容を数値として取り出す(バリデーション付き) filter_input()関数および $argv を参照する.
validString 文字列バリデーションを行う. filter_input()関数および $argv を参照する.文字列の最小長,最大長,排除または受容するパターンを指定する.
getValidString HTML FORMで指定したINPUTの内容を文字列として取り出す(バリデーション付き) filter_input()関数および $argv を参照する.
getPasswordHash パスワード・ハッシュをつくる.
veryfyPassword パスワードがハッシュに合致するかどうかを求める.
roundFloat 小数を指定した桁数で丸めて文字列として返す。 与えた小数の有効桁数より指定桁数が多いときには,末尾に0をサプレスする.

HTTP GETとPOSTの違い

HTML FORMタグで、
<form method="GET" action="hoge.php">
<input type="text" name="param" id="param">
<input type="submit" name="exec" id="exec" value="実行">
</form>
のように記述し、テキストボックスに "abc" と入力して実行ボタンを押下すると、ブラウザに
hoge.php?param=abc&exec=実行
が渡る。これが GETメソッドである。"hoge.php" はクエスチョンマーク以降のパラメータを取り出し、処理する。

次に、HTML FORMタグで、
<form method="POST" action="hoge.php">
<input type="text" name="param" id="param">
<input type="submit" name="exec" id="exec" value="実行">
</form>
のように記述し、テキストボックスに "abc" と入力して実行ボタンを押下すると、ブラウザには
hoge.php
と表示されるが、前述の GETメソッドと同様、データが "hoge.php" に渡される。URLに表れないだけで、HTTP通信の中にデータが埋め込まれている。これを POSTメソッドと呼ぶ。

PHPは、あらかじめ用意されたスーパーグローバル変数(配列) $_GET にGET方式で渡されたデータを、また、スーパーグローバル変数(配列) $_POST にPOST方式で渡されたデータを格納する。
配列の要素名は、HTML FORMのname属性に対応する。前述の例だと、$_GET['param'] または $_POST['param'] にINPUTタグのデータを、$_GET['exec'] または $_POST['exec'] にボタン(INPUT SUBMIT)のデータを格納する。

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

 131: /**
 132:  * 指定したボタンが押されたかどうか(ドラフト版)
 133:  * @param   string $btn ボタン名(HTML FORMのname)
 134:  * @return  bool TRUE=押された/FALSE=押されていない
 135: */
 136: function isButtonDraft($btn) {
 137:     $param = FALSE;
 138:     //GETから取得
 139:     if (isset($_GET[$btn]))         $param = TRUE;
 140:     //POSTから取得
 141:     else if (isset($_POST[$btn]))   $param = TRUE;
 142: 
 143:     return $param;
 144: }

指定したボタンが押されたかどうか
ブラウザ画面でボタンが押されたかどうかを判定するユーザー関数が isButtonDraft である。引数として、対象となるボタン・オブジェクトのname属性を $btn に代入する。

処理としては、まず、スーパーグローバル変数 $_GET$_POST の順に、 $btn と一致するキーがあるかどうかを調べる。
いずれかに一致すれば TRUEを、一致しなければ FALSEを返す。

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

 146: /**
 147:  * HTML FORMで指定したINPUTの内容を取り出す.(ドラフト版)
 148:  * @param   string $key  パラメータ名(省略不可)(HTML FORMのname)
 149:  * @return  string パラメータ/NULL=パラメータ無し
 150: */
 151: function getParamDraft($key) {
 152:     $param = '';
 153:     //GETから取得
 154:     if (isset($_GET[$key]))         $param = $_GET[$key];
 155:     //POSTから取得
 156:     else if (isset($_POST[$key]))   $param = $_POST[$key];
 157:     //文字コード変換(エンコード選定は自動)
 158:     $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
 159: 
 160:     return $param;
 161: }

パラメータを取り出す
ブラウザ画面でテキストやチェックボックスの値を取得を取得するユーザー関数が getParamDraft である。引数として、対象となるオブジェクトのname属性を $btn に代入する。

処理は、isButtonDraft とほぼ同じである。
スーパーグローバル変数から取り出した値は、 mb_convert_encoding  関数を使って内部文字エンコードに自動変換する。

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

  31: /**
  32:  * コマンドラインから起動されたかどうかを求める.
  33:  * @return  bool TRUE=コマンドライン起動である/FALSE=でない
  34: */
  35: function isCommandLine() {
  36:     global $argv;
  37: 
  38:     $res = FALSE;
  39:     if (isset($argv)) {
  40:         $info = pathinfo($argv[0]);
  41:         if ($info['basename'] == MYSELF) {
  42:             $res = TRUE;
  43:         }
  44:     }
  45: 
  46:     return $res;
  47: }

ブラウザのGUIを使ったPHPプログラムでは、isButtonDraftgetParamDraft があれば事足りるのだが、「PHP 8:Windows版のイントール/Apacheと連携/特長」で紹介するように、PHPスクリプトはコマンドラインから実行することもできる。そこで、コマンドラインから実行されたかどうかを判定するユーザー定義関数 isCommandLine を用意した。

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

解説:isButton,getParamの使い方

isButtonDraftgetParamDraft に、コマンドラインから実行したCUIプログラムにも対応し、よく使うオプション機能を付加したユーザー関数を用意した。
GETPOST の値を受け取るのに、スーパーグローバル変数 $_GET$_POST を使うのではなく、組み込み関数  filter_input  を使うように改めた。これは、$_GET$_POST は代入が可能なため、参照前に内容が変更される可能性があるためである。
これからよく使うことになるので、別ファイル "pahooInputData.php" に分離し、メインプログラム側で  require_once  で読み込むようにする。

  49: /**
  50:  * HTML FORMで指定したボタンが押されたかどうかを求める.
  51:  * filter_input()関数および $argv を参照する.
  52:  * @param   string $btn        ボタン名(省略不可)(HTML FORMのname)
  53:  * @param   bool   $ignoreCase TRUE:大文字小文字を無視/FALSE:無視しない
  54:  * @param   bool   $shorted    TRUE:CUIで短縮形を使う/使わない
  55:  *                  短縮形の例 --help, -h
  56:  * @return  bool TRUE=押された/FALSE=押されていない
  57: */
  58: function isButton($btn, $ignoreCase=FALSE, $shorted=TRUE) {
  59:     global $argv;
  60: 
  61:     $param = FALSE;
  62:     //GETから取得
  63:     if (filter_input(INPUT_GET, $btn!NULL) {
  64:         $param = TRUE;
  65:     //POSTから取得
  66:     } else if (filter_input(INPUT_POST, $btn!NULL) {
  67:         $param = TRUE;
  68:     //コマンドラインから取得
  69:     } else if (isCommandLine()) {
  70:         foreach ($argv as $str) {
  71:             if ($str == ('--' . $btn)) {
  72:                 $param = TRUE;
  73:                 break;
  74:             //短縮形
  75:             } else if ($shorted && ($str == ('-' . substr($btn, 0, 1)))) {
  76:                 $param = TRUE;
  77:                 break;
  78:             }
  79:         }
  80:     }
  81: 
  82:     //大文字・小文字を無視
  83:     if (!$param && $ignoreCase) {
  84:         $btn = mb_strtoupper($btn);
  85:         //GETから取得
  86:         if (($arr = filter_input_array(INPUT_GET)) !NULL) {
  87:             foreach ($arr as $key=>$val) {
  88:                 if (mb_strtoupper($key) == $btn) {
  89:                     $param = TRUE;
  90:                     break;
  91:                 }
  92:             }
  93:         }
  94:         //POSTから取得
  95:         if (($arr = filter_input_array(INPUT_POST)) !NULL) {
  96:             foreach ($arr as $key=>$val) {
  97:                 if (mb_strtoupper($key) == $btn) {
  98:                     $param = TRUE;
  99:                     break;
 100:                 }
 101:             }
 102:         }
 103:         //コマンドラインから取得
 104:         if (!$param && isset($argv)) {
 105:             foreach ($argv as $str) {
 106:                 if (mb_strtoupper($str) == ('--' . $btn)) {
 107:                     $param = TRUE;
 108:                     break;
 109:                 //短縮形
 110:                 } else if ($shorted && (mb_strtoupper($str) == ('-' . substr($btn, 0, 1)))) {
 111:                     $param = TRUE;
 112:                     break;
 113:                 }
 114:             }
 115:         }
 116:     }
 117: 
 118:     return $param;
 119: }

ユーザー関数 isButtonisButtonDraftの改良版である。
name属性またはコマンドライン・オプション文字列の大文字・小文字を無視したいときは $ignoreCasTRUE を、そうでないときは FALSE を代入する。
CUIでコマンドライン・オプション文字列の短縮形を使いたいときは $shortedTRUE を、そうでないときは FALSE を代入する。短縮形とは、コマンドライン・オプション文字列の先頭1文字を指す。たとえば、オプション --help の短縮形は -h である。
コマンドライン起動の場合(isCommandLineTRUE)なら、グローバル変数 $argv に '--' + $btn と一致する要素があるかどうかを調べる。短縮形が指定された場合は、$btn の冒頭1文字を切り出して比較する。

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

 121: /**
 122:  * HTML FORMで指定したINPUTの内容を取り出す.
 123:  * filter_input()関数および $argv を参照する.
 124:  * @param   string $key  パラメータ名(省略不可)(HTML FORMのname)
 125:  * @param   bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
 126:  * @param   mixed  $def  初期値(省略時:空文字)
 127:  * @param   bool   $ignoreCase TRUE:大文字小文字を無視/FALSE:無視しない
 128:  * @param   bool   $shorted    TRUE:CUIで短縮形を使う/使わない
 129:  *                  短縮形の例 --help, -h
 130:  * @return  string パラメータ/NULL=パラメータ無し
 131: */
 132: function getParam($key, $auto=TRUE, $def=NULL, $ignoreCase=FALSE, $shorted=TRUE) {
 133:     global $argv;
 134: 
 135:     $param = $def;
 136: 
 137:     //GETから取得
 138:     if (($x = filter_input(INPUT_GET, $key)) !NULL) {
 139:         $param = $x;
 140:     //POSTから取得
 141:     } else if (($x = filter_input(INPUT_POST, $key)) !NULL) {
 142:         $param = $x;
 143:     //コマンドラインから取得
 144:     } else if (isset($argv)) {
 145:         foreach ($argv as $str) {
 146:             $arr = explode('=', $str);
 147:             if (($arr[0] == ('--' . $key)) || ($arr[0] == ('-' . $key))) {
 148:                 $param = isset($arr[1]) ? $arr[1: '';
 149:                 break;
 150:             //短縮形
 151:             } else if ($shorted && ($arr[0] == ('-' . substr($key, 0, 1)))) {
 152:                 $param = isset($arr[1]) ? $arr[1: '';
 153:                 break;
 154:             }
 155:         }
 156:     }
 157: 
 158:     //大文字・小文字を無視
 159:     if ($ignoreCase) {
 160:         $key = mb_strtoupper($key);
 161:         //GETから取得
 162:         if (($arr = filter_input_array(INPUT_GET)) !NULL) {
 163:             foreach ($arr as $str=>$val) {
 164:                 if (mb_strtoupper($str) == $key) {
 165:                     $param = $val;
 166:                     break;
 167:                 }
 168:             }
 169:         }
 170:         //POSTから取得
 171:         if (($arr = filter_input_array(INPUT_POST)) !NULL) {
 172:             foreach ($arr as $str=>$val) {
 173:                 if (mb_strtoupper($str) == $key) {
 174:                     $param = $val;
 175:                     break;
 176:                 }
 177:             }
 178:         }
 179:         //コマンドラインから取得
 180:         if (isCommandLine()) {
 181:             foreach ($argv as $str) {
 182:                 $arr = explode('=', $str);
 183:                 if ((mb_strtoupper($arr[0]) == ('--' . $key)) || (mb_strtoupper($arr[0]) == ('-' . $key))) {
 184:                     $param = isset($arr[1]) ? $arr[1: '';
 185:                     break;
 186:                 //短縮形
 187:                 } else if ($shorted && (mb_strtoupper($arr[0]) == ('-' . substr($key, 0, 1)))) {
 188:                     $param = isset($arr[1]) ? $arr[1: '';
 189:                     break;
 190:                 }
 191:             }
 192:         }
 193:     }
 194: 
 195:     //自動コード変換
 196:     if ($auto) {
 197:         $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
 198:     }
 199: 
 200:     return $param;
 201: }

ユーザー関数 getParamgetParamDraftの改良版である。
受け取ったデータの文字エンコードを自動的に内部エンコードに変換したいときは、$autoTRUE を、そうでないときは FALSE を代入する。この引数を省略した場合には自動変換を行う。
オブジェクトに値が入っていないとき、デフォルト値として受け取りたい値があれば、$def にその値をセットする。$defNULL; をセットするが、この引数を省略した場合にはデフォルト値はないものとみなす。
name属性またはコマンドライン・オプション文字列の大文字・小文字を無視したいときは $ignoreCasTRUE を、そうでないときは FALSE を代入する。
CUIでコマンドライン・オプション文字列の短縮形を使いたいときは $shortedTRUE を、そうでないときは FALSE を代入する。

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

コマンドライン・オプションから値を取り出すために  explode  を利用している。

参考サイト

(この項おわり)
header