プログラム例

簡単なCGIプログラム例です。
入力された身長と体重からBMI(ボディマス指数)という肥満に関する値を計算します。
BMIは次の式で求めます。
BMI = 体重(kg) / (身長(m) * 身長(m))

プログラム

プログラムソースファイルと 一式です。
//漢字コードはEUC、改行はLF
//---------------------------------------------------------------------------
//サンプルプログラム
//	acpp -o bmi.cgi -visible bmi.cpp
//---------------------------------------------------------------------------
#include	<acpplib.h>
//天下り変数
given	float	fWeight,fHeight;	//フォームからのデータ
given	string	fName;				//本当はタグを無効にしなければなしません。
given	string	cName;				//クッキーデータ

//プリプロセス指令
#pragma		SET_HEAD	<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp">
#pragma		SET_HEAD	<!-- 漢字コードはEUC -->
#pragma		SET_HEAD	<META NAME="keywords" CONTENT="ACPP,C++ for CGI,C言語,CGI">
#pragma		SET_HEAD	<META NAME="description" CONTENT="C++ for CGIのサンプルプログラム">
#pragma		SET_HEAD	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
#pragma		END_HTML

void	print_form(void);	//入力フォームを作る
void	print_bmi(void);	//BMIの計算結果を表示する
//---------------------------------------------------------------------------
void	start()
//CGIメインルーチン
{
	if(! isset("fOk")) print_form();	//フォームからの入力があるかどうか
	  else print_bmi();
}
//---------------------------------------------------------------------------
void	print_bmi()
//BMIの計算結果を表示する
{
	float	bmi,bmi2;
	string	himan;

//CGIライブラリ
	setcookie("cName",fName.c_str(),time(NULL)+3600);	//フォームから来たfNameをcNameとしてクッキーに保存
	set_head("<TITLE>BMI計算結果</TITLE>");
	begin_html();		//setcookieはcout_header,cout_head,begin_htmlを実行する前に利用

	if(fHeight > 0.0) {
		bmi = 10000 * fWeight / (fHeight * fHeight);
		if(25.0 <= bmi) himan = "<FONT COLOR=\"red\" SIZE=+1><B>肥満</B></FONT>です。";
		if((18.5 <= bmi) && (bmi < 25.0)) himan = "普通体重です。";
		if(bmi < 18.5) himan = "<FONT COLOR=\"blue\" SIZE=+1>痩せ</FONT>ています。";
	
		bmi2 = bmi * 10;
		if(bmi2 >= 500) bmi2 = 500.0;
		if(bmi2 <= 0  ) bmi2 = 1.0;
	} else {
		bmi  = 0.0;
		bmi2 = 1.0;
		himan = "???";
	}

//ピュアテキスト
<?HTML
<H2>BMI計算結果</H2>
<B><BIG>$fName</BIG></B>さんの身長は $fHeight cm、体重は $fWeight kgです。<BR>
標準体重は ${fHeight * fHeight * 22 / 10000} です。<BR>
BMIの値は、$bmi です。  $himan <BR>
<IMG SRC="gauge.jpg" HEIGHT=55 WIDTH=500><BR>
<IMG SRC="bar.gif" HEIGHT=20 WIDTH=$bmi2 >
<P>
<A HREF="bmi.cgi">戻る</A>
?>
}
//---------------------------------------------------------------------------
void	print_form()
//入力フォームを作る
{
//CGIライブラリ
	set_head("<TITLE>BMI計算</TITLE>");
	begin_html();	//HTTP応答ヘッダー、HTMLのヘッダ部分を送信する

//ピュアテキスト
<?HTML
<H2>BMI計算</H2>
<FORM NAME="bmi" ACTION="./bmi.cgi" METHOD="POST">
<TABLE>
<TR><TD>氏名</TD><TD><INPUT TYPE="TEXT" NAME="fName" VALUE= "$cName" ></TD></TR>
<TR><TD>身長</TD><TD><INPUT TYPE="TEXT" NAME="fHeight"> cm</TD></TR>
<TR><TD>体重</TD><TD><INPUT TYPE="TEXT" NAME="fWeight"> kg</TD></TR>
<TR><TD></TD><TD>
<INPUT TYPE="SUBMIT" NAME="fOk" VALUE="計算">
<INPUT TYPE="RESET"  NAME="fCancel" VALUE="クリア"></TD></TR>
</TABLE>
</FORM>
BMIは次の式で求めます。 : BMI = 体重(kg) / (身長(m) * 身長(m))<BR>
標準体重は次の式で求めます。 : 標準体重(?) = 身長(m) * 身長(m) * 22<BR>
参考までに、BMI評価は次のようになります(参考にするホームページによって若干数値に違いがあります)
<TABLE BORDER>
<TR><TH>BMIの値</TH><TD>25.0以上</TD><TD>18.5以上、25.0未満</TD><TD>18.5以下</TD></TR>
<TR><TH>肥満度</TH><TD>肥満</TD><TD>普通体重</TD><TD>痩せ</TD></TR>
</TABLE>
?>
}
//---------------------------------------------------------------------------
コンパイルは
acpp -o bmi.cgi -visible bmi.cpp
と行います。実行はbmi.cgiを呼び出します。
上記のプログラムでは、フォームからの名前の入力(fName)をそのまま出力しています。ここに名前ではなく、プログラムのURIやスクリプトが入力されると、クロスサイトスクリプティングという状況が起こる可能性があります。文字列の入力があった場合はタグを無効にする処理を加えておいた方が無難です。

注意

  1. テキスト入力はタグを無効にしクロスサイトスクリプティングに注意する必要があります。
  2. データをインターネットから閲覧できる場所に置くのは賢明ではありません。
  3. データはflock関数などで排他処理しておかないと消失する事があります。
  4. CGIプログラムやディレクトリのパーミッションが755でないと動作しないことがあります。