天下り変数
フォーム、クッキーからの変数、環境変数、初期設定ファイル変数を、宣言するだけで利用できるようにします。
説明
次のようにフォームの中でfDataと名付けられたテキストボックスがあるとします。
<INPUT TYPE=TEXT NAME="fData">
CGIプログラムの中で
given string fData;
と宣言することで、フォームで入力された文字列が、プログラムの中で fData という文字列として利用できます。

プログラマーはこのように given と宣言をするだけで、POST/GET、URL デコードなどを考慮する必要はありません。given は C++ for CGI が利用する予約語です。プログラムの中で given という変数や関数を作ってはいけません。
天下り変数はフォームからの変数のほか、クッキー、環境変数、初期設定ファイルからの変数も扱うことができます。given と宣言した変数の実体はグローバル変数として確保されます。
フォームなどから天下り的に変数の値が設定されるため、「天下り変数」と名付けられています。この名前は、注意を引くための戦略的な名前です。
構文
given センテンスの構文は、
given 変数の型 変数1 , 変数2 ......;
です。変数の型としては次のような物が使用可能です。
使用可能 | string int float double short long bool |
使用不可 | unsigned で修飾された型 char size_t ポインター 構造体 クラス その他の型 |
同じ名前の変数が、フォーム、クッキーなどで定義されている場合、天下り変数として代入される変数の優先順位は、
- 初期設定ファイル変数
- フォームからの変数
- クッキー
- 環境変数
です。同じ名前の変数をフォームやクッキーで使うことは混乱の元ですのやらないほうが無難です。
フォームなどから渡される変数は、文字列ですが、宣言された型にあわせて変換されます。フォームなどから変数が渡されない場合値は変数の型が string ならば空の文字列 ("") に数値ならば 0 に bool ならば false に初期化されます。
string宣言
stringはSTLで定義されている型です。フォームの中にあるテキスト要素 (INPUT TYPE=TEXT など)の内容は string と宣言した天下り変数を用いることで、文字列として簡単に扱うことができます。この場合クロスサイトスプリプティングに注意する必要があります。
この文字列に、悪意あるページやプログラムへのリンク、SSI コマンドなどが混ぜられている可能性があります。
不用意にそのまま出力するとこれらが実行されてしまう可能性があります。入力した文字列を出力する場合はタグを無効にする (< を < に変換する) など注意しなければなりません。
bool宣言
bool は CHECKBOX や RADIO で利用することを想定しています。次のようにチェックボックスに VALUE を設定しない場合を考えます。
<INPUT TYPE=CHECKBOX NAME="fCheck">
このとき、チェックボックスがチェックされない場合は、fCheck は CGI プログラムに渡されません。チェックされた場合は on という値が渡されます。このようなとき、次のように bool として宣言します。
bool fCheck;
チェックボックスがチェックされたとき、true が、チェックボックスがチェックされない場合、false が fCheck に設定されます。チェックボックスに VALUE を設定する場合は、VALUE の値が文字列として CGI プログラムに渡されますので、プログラムでは、bool ではなく、string で宣言してください。
配列宣言
given 宣言の変数名に [] をつけることで、フォームからの変数を配列として扱うことができます。このとき、フォームの中のアイテムの名前も同様に [] を付ける必要があります。すなわち、フォームを、
<INPUT TYPE=CHECKBOX NAME="fCheck[]" VALUE="A">チェック1
<INPUT TYPE=CHECKBOX NAME="fCheck[]" VALUE="B">チェック2
<INPUT TYPE=CHECKBOX NAME="fCheck[]" VALUE="C">チェック3
のように作り、プログラムの中で
given string fCheck[];
のように宣言します。宣言で [] の中に数字などを入れてはいけません。ここでの[] は配列を表すのではなく文字列の一部と考えてください。ポインターのような宣言 *fCheck; はサポートしていません。このように宣言することで、フォームから与えられる変数を
int i,n;
n = fCheck.size();
for(i=0;i<n;i++) {
fCheck[i]の処理
}
の様に、配列として扱うことができます。size() 関数は配列の大きさを返す関数です。配列の添え字は0から始まります。添え字のチェックはしていません。添え字を範囲を超えて指定した場合の値は不定です。これは、複数のテキスト入力やチェックボックスによる入力を簡単に処理したい場合のことを想定しています。
この場合、次のように宣言した変数を他の変数と一緒に宣言してはいけません。
//誤った宣言
given string fCheck[],fText,fPass,fHidden,fRadio;
//正しい宣言
given string fCheck[];
given string fText,fPass,fHidden,fRadio;
配列様の宣言はチェックボックス以外でも利用できます。
イメージボタン
イメージボタンを利用するためには、次のタグを利用します。
<INPUT TYPE=IMAGE SRC="image_file_path" NAME="fname" [HEIGHT=xx] [WIDTH=yy]>
ブラウザからは、画像をクリックした座標が、fname.x , fname.y という値で CGIプログラムに渡されます。ピリオドの付いた変数は、C/C++ では構造体のメンバーを参照する形ですので、C++ for CGI では . (ピリオド) を _ (アンダースコア) に変えた形で値を提供します。すなわち、fname_x , fname_y という形で提供されます。従って
given int fname_x,fname_y;
と宣言することでイメージボタンからの入力を扱うことができます。
入ってくる値は、イメージ内でのクリックしたポインタの座標です。
選択メニュー
選択メニューを利用するためには、次のタグを利用します。
<SELECT NAME="fSelect" [SIZE=xx] [MULTIPLE]>
<OPTION VALUE="abcd" [SELECTED]>
</SELECT>
テキストと同じように、ブラウザから選択されたデータが天下り変数に送られてきます。天下り変数で値を参照する場合は、
given string fSelect;
と宣言します。
MULTIPLE オプションを指定した場合は、選択された項目が複数 CGI プログラムに送られてきます。この場合は、配列として次のように宣言します。
<SELECT NAME="fSelect[]" MULTIPLE>
given string fSelect[];
ファイル
ファイルを利用するためには、次のタグを利用します。
<FORM ACTION="path" METHOD="POST" ENCTYPE="multipart/form-data">
[<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="xxxx">]
<INPUT TYPE=FILE [NAME="fFile"] [SIZE=yy] [VALUE="path"]>
</FORM>
ファイルをアップロードする場合は FORM タグに ENCTYPE="multipart/form-data"
を記述する必要があります。また、METHOD は POST のみです。
MAX_FILE_SIZE は INPUT TYPE=FILE タグの前に書かなければなりません。アップロードファイルの最大サイズを指定できますが、ブラウザによってはサポートされない場合があります。このフォーム (FORM タグ) の中にテキスト入力など他のフォームの要素を加えることができます。
C++ for CGI では、ファイルのアップロードを扱うためにはいくつかの天下り変数を定義する必要があります。上記のように fFile でアイテムの名前を指定した場合、
given string fFile,fFile_path,fFile_mime;
given int fFile_size;
とします。
fFile | クライアント側でのファイルのフルパス名 |
fFile_path | CGIプログラム側でのアップロードされた一時ファイルのパス名 |
fFile_mime | ファイルのMIMEタイプ |
fFile_size | ファイルのサイズ、単位はバイト |
_path , _mime , _size は小文字でそのまま書かねばなりません。fFile_mime とfFile_size は必要のない場合は宣言する必要ありません。
アップロードされた一時ファイルは、CGI プログラムと同じディレクトリに fFile_path という名前で一時的に保存されます。CGI プログラムが置かれるディレクトリはすべてのユーザーが書き込みできるようにアクセス権を設定してください。この一時ファイルは、プログラム終了時に削除されます。
ファイルを保存する場合は、プログラム終了前に、一時ファイルの名前を変える必要があります。ただし、fFile_path にはアップロードしたクライアント側のファイルのフルパスが入っていますので、これをファイルの名前としてはいけません。fFile_path のディレクトリの区切りは、UNIX では /(スラッシュ)MacOS では :(コロン) Windows では \(円マーク) です。
また、CGI を置いたサーバーでは漢字やスペースを含んだファイル名を扱うことができない可能性があります。ファイルの名前を変える場合は慎重に行わなければなりません。
クッキー、環境変数、初期設定ファイル変数
クッキー、環境変数、初期設定ファイル変数も宣言するだけで利用できます。フォームからの変数と同じように、CGI プログラムの中でクッキー、環境変数、初期設定ファイル変数と同じ名前の変数を宣言するだけで、それらを利用できるようになります。たとえば、クッキーに cData という名前の変数があるとします。プログラムの中で、
given string cData;
と宣言することでその値を利用できるようになります。
クッキーへのデータの入力(保存)は setcookie 関数を用います。
初期設定ファイルの指定は、プリプロセス指令 #configure を使います。また、初期設定ファイルの中身を変える場合は、初期設定ファイルクラス class conffile を利用します。
環境変数の値を変えることはできません。
注意
- 宣言する変数名はフォームのアイテム名などと同じでなければなりません。
大文字・小文字は区別されます。
- フォームなどから変数が渡されない場合、値は初期化されます。
- 配列様の宣言とその他の宣言を混ぜてはいけません。
- 文字列の入出力には気を付けなければなりません。
- 入力はフォームの名前に _x , _yを付けた2つの値に分けられて与えられます。
- アップロードされたファイルは一時ファイルに保存されます。
一時ファイルは、プログラム終了時に削除されます。
- クライアント側でのファイルのフルパス名で、ディレクトリの区切りは
- UNIX(Linux) = "/"
- MacOS(漢字Talk) = ":"
- Windows(MS-DOS) = "\"
です。クライアント側のOSに注意する必要があります。
- 一時ファイルは CGI プログラムと同じディレクトリに置かれます。ディレクトリがすべてのユーザーから書き込み可能でなければなりません。
- クッキーの値は自動的に入ってきます。拒否することはできません
- 初期設定ファイル変数は、プリルロセス指令 #configure で初期設定ファイルを指定しなければ利用できません
- CGI、クッキー、初期設定ファイル変数で名前の区別はしません。同じ名前を使ってはいけません。