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

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

(2025年10月9日)記事「解説:issetとempty関数の違い」追記
(2025年7月26日)getParam() 引数に$trim追加

目次

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

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 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

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)のデータを格納する。

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

getParam.php

 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を返す。

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

getParam.php

 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  関数を使って内部文字エンコードに自動変換する。

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

pahooInputData.php

 111: /**
 112:  * コマンドラインから起動されたかどうかを求める.
 113:  * @参考URL https://www.pahoo.org/e-soul/webtech/php01/php25-01.shtm
 114:  * @return  bool TRUE=コマンドライン起動である/FALSE=でない
 115: */
 116: function isCommandLine() {
 117:     global $argv;
 118: 
 119:     $res = FALSE;
 120:     if (isset($argv)) {
 121:         $info = pathinfo($argv[0]);
 122:         if ($info['basename'] == MYSELF) {
 123:             $res = TRUE;
 124:         }
 125:     }
 126: 
 127:     return $res;
 128: }

ブラウザの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  で読み込むようにする。

pahooInputData.php

 130: /**
 131:  * HTML FORMで指定したボタンが押されたかどうかを求める.
 132:  * filter_input()関数および $argv を参照する.
 133:  * @参考URL https://www.pahoo.org/e-soul/webtech/php01/php25-01.shtm
 134:  * @param   string $btn        ボタン名(省略不可)(HTML FORMのname)
 135:  * @param   bool   $ignoreCase TRUE:大文字小文字を無視/FALSE:無視しない
 136:  * @param   bool   $shorted    TRUE:CUIで短縮形を使う/使わない
 137:  *                  短縮形の例 --help, -h
 138:  * @return  bool TRUE=押された/FALSE=押されていない
 139: */
 140: function isButton($btn, $ignoreCase=FALSE, $shorted=TRUE) {
 141:     global $argv;
 142: 
 143:     $param = FALSE;
 144:     // GETから取得
 145:     if ((filter_input(INPUT_GET, $btn!NULL|| (isset($_GET[$btn]))) {
 146:         $param = TRUE;
 147:     // POSTから取得
 148:     } else if ((filter_input(INPUT_POST, $btn!NULL|| (isset($_POST[$btn]))) {
 149:         $param = TRUE;
 150:     } else if (isset($_POST[$btn])) {
 151:         $param = TRUE;
 152:     // コマンドラインから取得
 153:     } else if (isCommandLine()) {
 154:         foreach ($argv as $str) {
 155:             if ($str == ('--' . $btn)) {
 156:                 $param = TRUE;
 157:                 break;
 158:             // 短縮形
 159:             } else if ($shorted && ($str == ('-' . substr($btn, 0, 1)))) {
 160:                 $param = TRUE;
 161:                 break;
 162:             }
 163:         }
 164:     }
 165: 
 166:     // 大文字・小文字を無視
 167:     if (!$param && $ignoreCase) {
 168:         $btn = mb_strtoupper($btn);
 169:         // GETから取得
 170:         if (($arr = filter_input_array(INPUT_GET)) !NULL) {
 171:             foreach ($arr as $key=>$val) {
 172:                 if (mb_strtoupper($key) == $btn) {
 173:                     $param = TRUE;
 174:                     break;
 175:                 }
 176:             }
 177:         }
 178:         // POSTから取得
 179:         if (($arr = filter_input_array(INPUT_POST)) !NULL) {
 180:             foreach ($arr as $key=>$val) {
 181:                 if (mb_strtoupper($key) == $btn) {
 182:                     $param = TRUE;
 183:                     break;
 184:                 }
 185:             }
 186:         }
 187:         // コマンドラインから取得
 188:         if (!$param && isset($argv)) {
 189:             foreach ($argv as $str) {
 190:                 if (mb_strtoupper($str) == ('--' . $btn)) {
 191:                     $param = TRUE;
 192:                     break;
 193:                 // 短縮形
 194:                 } else if ($shorted && (mb_strtoupper($str) == ('-' . substr($btn, 0, 1)))) {
 195:                     $param = TRUE;
 196:                     break;
 197:                 }
 198:             }
 199:         }
 200:     }
 201: 
 202:     return $param;
 203: }

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

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

pahooInputData.php

 130: /**
 131:  * HTML FORMで指定したボタンが押されたかどうかを求める.
 132:  * filter_input()関数および $argv を参照する.
 133:  * @参考URL https://www.pahoo.org/e-soul/webtech/php01/php25-01.shtm
 134:  * @param   string $btn        ボタン名(省略不可)(HTML FORMのname)
 135:  * @param   bool   $ignoreCase TRUE:大文字小文字を無視/FALSE:無視しない
 136:  * @param   bool   $shorted    TRUE:CUIで短縮形を使う/使わない
 137:  *                  短縮形の例 --help, -h
 138:  * @return  bool TRUE=押された/FALSE=押されていない
 139: */
 140: function isButton($btn, $ignoreCase=FALSE, $shorted=TRUE) {
 141:     global $argv;
 142: 
 143:     $param = FALSE;
 144:     // GETから取得
 145:     if ((filter_input(INPUT_GET, $btn!NULL|| (isset($_GET[$btn]))) {
 146:         $param = TRUE;
 147:     // POSTから取得
 148:     } else if ((filter_input(INPUT_POST, $btn!NULL|| (isset($_POST[$btn]))) {
 149:         $param = TRUE;
 150:     } else if (isset($_POST[$btn])) {
 151:         $param = TRUE;
 152:     // コマンドラインから取得
 153:     } else if (isCommandLine()) {
 154:         foreach ($argv as $str) {
 155:             if ($str == ('--' . $btn)) {
 156:                 $param = TRUE;
 157:                 break;
 158:             // 短縮形
 159:             } else if ($shorted && ($str == ('-' . substr($btn, 0, 1)))) {
 160:                 $param = TRUE;
 161:                 break;
 162:             }
 163:         }
 164:     }
 165: 
 166:     // 大文字・小文字を無視
 167:     if (!$param && $ignoreCase) {
 168:         $btn = mb_strtoupper($btn);
 169:         // GETから取得
 170:         if (($arr = filter_input_array(INPUT_GET)) !NULL) {
 171:             foreach ($arr as $key=>$val) {
 172:                 if (mb_strtoupper($key) == $btn) {
 173:                     $param = TRUE;
 174:                     break;
 175:                 }
 176:             }
 177:         }
 178:         // POSTから取得
 179:         if (($arr = filter_input_array(INPUT_POST)) !NULL) {
 180:             foreach ($arr as $key=>$val) {
 181:                 if (mb_strtoupper($key) == $btn) {
 182:                     $param = TRUE;
 183:                     break;
 184:                 }
 185:             }
 186:         }
 187:         // コマンドラインから取得
 188:         if (!$param && isset($argv)) {
 189:             foreach ($argv as $str) {
 190:                 if (mb_strtoupper($str) == ('--' . $btn)) {
 191:                     $param = TRUE;
 192:                     break;
 193:                 // 短縮形
 194:                 } else if ($shorted && (mb_strtoupper($str) == ('-' . substr($btn, 0, 1)))) {
 195:                     $param = TRUE;
 196:                     break;
 197:                 }
 198:             }
 199:         }
 200:     }
 201: 
 202:     return $param;
 203: }

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

また、引数 [$trim] によって、受け取ったデータの冒頭・末尾の空白を除くことができるようにした。ユーザー入力では、多くの場合、冒頭・末尾に空白を入力することはなく、逆に、入力ミスで空白を入れてしまうケースが多いからだ。
全角空白文字が含まれている可能性を考慮し、組み込み関数  preg_replace  によって空白文字を除去素いる。PHP8.x以上であれば、マルチバイト文字に対応した組み込み関数  mb_trim  を利用できる。

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

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

解説:issetとempty関数の違い

isset関数と似ているものに  empty 関数がある。
empty関数は、変数が〈空〉であるかどうかを検査します。変数が〈空〉である場合は、
  • ""(空文字)
  • 0(整数0)
  • 0.0(浮動小数点0)
  • "0"(文字列 "0")
  • NULL
  • FALSE
  • 空配列 []
を指します。文字列 "0" も〈空〉とみなすことに注意してください。また、変数が未定義の時も〈空〉とみなす。

empty関数は、式 !isset($var) | $var == false と等価である。
isset($i) と empty($i) の結果の値
$i isset($i) empty($i)
(未定義) FALSE TRUE
NULL FALSE TRUE
空文字 "" TRUE TRUE
0(整数0) TRUE TRUE
0.0(浮動小数点0) TRUE TRUE
"0"(文字列 "0") TRUE TRUE
FALSE TRUE TRUE
空配列 [] TRUE TRUE

参考サイト

(この項おわり)
header