目次
サンプル・プログラムの実行例
サンプル・プログラム
getParam.php | サンプル・プログラム本体 |
pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
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 | 初版 |
関数/メソッド | 機能 | 詳細 |
---|---|---|
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の違い
<form method="GET" action="hoge.php">のように記述し、テキストボックスに "abc" と入力して実行ボタンを押下すると、ブラウザに
<input type="text" name="param" id="param">
<input type="submit" name="exec" id="exec" value="実行">
</form>
hoge.php?param=abc&exec=実行が渡る。これが GETメソッドである。"hoge.php" はクエスチョンマーク以降のパラメータを取り出し、処理する。
次に、HTML FORMタグで、
<form method="POST" action="hoge.php">のように記述し、テキストボックスに "abc" と入力して実行ボタンを押下すると、ブラウザには
<input type="text" name="param" id="param">
<input type="submit" name="exec" id="exec" value="実行">
</form>
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: }
処理としては、まず、スーパーグローバル変数 $_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: }
処理は、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: }
一般に、PHPスクリプトをコマンドラインから起動すると、グローバル配列変数 $argv にコマンドライン・パラメータがセットされる。最初の要素には自身のスクリプト・ファイル名が入るので、これをチェックしてコマンドラインから起動されたかどうかを判定する。
解説:isButton,getParamの使い方
GET や POST の値を受け取るのに、スーパーグローバル変数 $_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: }
name属性またはコマンドライン・オプション文字列の大文字・小文字を無視したいときは $ignoreCas に TRUE を、そうでないときは FALSE を代入する。
CUIでコマンドライン・オプション文字列の短縮形を使いたいときは $shorted に TRUE を、そうでないときは FALSE を代入する。短縮形とは、コマンドライン・オプション文字列の先頭1文字を指す。たとえば、オプション --help の短縮形は -h である。
コマンドライン起動の場合(isCommandLine が TRUE)なら、グローバル変数 $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: }
受け取ったデータの文字エンコードを自動的に内部エンコードに変換したいときは、$auto に TRUE を、そうでないときは FALSE を代入する。この引数を省略した場合には自動変換を行う。
オブジェクトに値が入っていないとき、デフォルト値として受け取りたい値があれば、$def にその値をセットする。$def に NULL; をセットするが、この引数を省略した場合にはデフォルト値はないものとみなす。
name属性またはコマンドライン・オプション文字列の大文字・小文字を無視したいときは $ignoreCas に TRUE を、そうでないときは FALSE を代入する。
CUIでコマンドライン・オプション文字列の短縮形を使いたいときは $shorted に TRUE を、そうでないときは FALSE を代入する。
コマンドラインでオプションを指定するときは、
php getParam.php --param=12345のようにする。短縮オプションは
php getParam.php -p=12345である。
コマンドライン・オプションから値を取り出すために explode を利用している。
参考サイト
- PHPでGET/POSTでフォームから値を受け取る(その2):ぱふぅ家のホームページ
そこで今回は、GET/POSTのどちらからでもデータを受け取ることができ、PHPをコマンドラインで使うときにも利用でき、日本語にも対応する汎用ユーザー関数を作ってみることにする。
(2023年9月9日)$_GET, $_POST参照をfilter_input()関数に置換
(2023年4月16日)タイトル変更,大幅加筆