プロが教える店舗&オフィスのセキュリティ対策術

チェックボックスをCGI(C言語)で使用する方法を教えて下さい。
例えば、HTMLで

<input type="checkbox" name="Check1" value="Sel11" />
チェック1 選択1<br />
<input type="checkbox" name="Check1" value="Sel12" />
チェック1 選択2<br />
<input type="checkbox" name="Check1" value="Sel13" />
チェック1 選択3
<hr />
<input type="checkbox" name="Check2" value="Sel21" checked />
チェック2 選択1<br />
<input type="checkbox" name="Check2" value="Sel22" />
チェック2 選択2<br />
<input type="checkbox" name="Check2" value="Sel23" checked />
チェック2 選択3

というプログラムはCGI(C言語)ではどの様に記述すれば良いでしょうか?

A 回答 (5件)

■各データーを受け取ってからどのようにしたいかの処理



そういえば使い方を聞かれはしたけどどのように使いたいのかは聞いてないわ
まあいいやそれでも説明はできるしね

先っきの書き込みで

chek_name[3],*chek_value[3];
の中身はこんな感じになってるはず

chek_name[0]==sel
chek_name[1]==sel
chek_name[2]==NULL

chek_value[0]==Sel21
chek_value[1]==Sel23
chek_value[2]==NULL

そしてさっきの分解法は
チェックを全部ONにしようが一つだけONにしようがONにした数だけ配列に値がはいるようにしてるの

そして次

while(chek_value[i]!=NULL){
check(&chek_value[i],&b,&c);//NO3で作ったHTMLの表示を変える関数
if(strcmp(chek_value[i],"Sel21")==0){ //やっぱりチェックボックスのvalueは数字がいいよ処理がめんどいswichもつかえないし
//sel21がON担ったときどう処理したいかここに記述する
//って言うか処理させたい事の関数を作ってまとめて処理するといいかも
//失敗失敗


}

if(strcmp(chek_value[i],"Sel22")==0){
//sel22がONになったときどう処理したいかここに記述する
}

if(strcmp(chek_value[i],"Sel23")==0){
//sel23がONになったときどう処理したいかここに記述する
}
i++;
}

大体こんな感じだね
まとめると
・チェックがonのとき(offでも処理できるならどうぞ)情報を送信してもらう
・送られてくる情報を分解して各配列に入れる(順番がバラバラでも内容にNUULが入っててもOKな用に)
・onの情報が送られてきたときようの表示変換関数と動作処理関数を作っておく
・HTMLのcheakのvalueは数字のほうが処理しやすい

//・説明する時に作ったソースは私が作ったソースをアレンジして作ったけれどアレンジしたのはコンパイルして動作を確認していないからちゃんと動くか分からない上にバグがあるか分からない
//・たぶんあってるけれど、多少書き間違えてるかもしれないから質問者さんが自分でどこがミスってるか考えてね ミスがあっても本の少しだろうからね アレンジしていない私のソースはバグなし、書き間違えなし

・C言語でCGI作ってる人少ないみたいだから同じC言語使い同士仲良くやろうね。また質問やききたい事があったらよろしくね


疲れました。
手が冷たいです。
今日は寝ます。
    • good
    • 0
この回答へのお礼

ありがとうございました。無事に解決致しました。

お礼日時:2012/12/29 18:34

■チェックボックスの入力情報取得



おそらくチェックボックス以外のテキストボックスもつかうと思いますのでそれを含めた処理です

チェックボックスはチェックボックス専用の配列に格納します
チェックボックス以外のものはチェックボックス以外のですね

例としてHTMLにこれだけの情報を送ってもらうようにしてみます

//チェックボックス以外は適当にかいてるので使い方おかしいと言う突っ込みは受け付けません
<input type=\"text\" name=\"text\" value=\"ren\" />";
<input type=\"radio\" name=\"cc\" value=\"light\" checked />";
<input type=\"radio\" name=\"cc\" value=\"left" />";
<input type=\"checkbox\" name=\"sel\" value=\"Sel21\" />";//チェック入れて送信
<input type=\"checkbox\" name=\"sel\" value=\"Sel22\" />";//チェックいれずに送信
<input type=\"checkbox\" name=\"sel\" value=\"Sel23\" />";//チェック入れて送信

送られてくる情報はこんなかんじでしょうか

text=ren&cc=light&sel=Sel21&sel=Sel23

これを分解して各配列に入れます

int Deta1(void){
char *chekigai_name[2],*chekigai_value[2]; //チェック以外の配列用 配列の数はちぇくボックス以外の情報分
char *chek_name[3],*chek_value[3]; //テックの配列用 配列の数はON/OFF含めたチェックの全体すう

char *a="text=ren&cc=light&sel=Sel21&sel=Sel23"; //送られてくる情報が入るように工夫してね
int b;
int c=0;
int i=0,cn=0,dn=0;
char *tm=NULL;
char *han;

if(a[0]==NULL){
return(-1);
}

if(a!=NULL){
b=strlen(a)
}

chekigai_name[0]=a;
while((a[++i]!=NULL)&&(i<b)){

/* 項目の分解 */
if(a[i]=='='){
a[i]=NULL;

if(c!=1){
chekigai_value[cn]=a+i+1;
cn++;
}

else{
chek_valu[dn]=a+i+1;
dn++;
c=0;
}

}

/* データ項目で分解 */
else if(a[i]=='&'){
a[i]=NULL;
han=a+i+1;

if(strncmp(han,"sel=",4)==0){
chek_name[dn]=han;
c=1;

}

else{
chekigai_name[cn]=han;
}

}
}
}

//部屋の気温が冷たいから手が冷たいし疲れてきた

続く
    • good
    • 0

■checkedのON/OFFの関数の用意



こんな関数を用意します

っというかよく見たらvalueにはいってるの(文字列でも良い)数字がいいですよ
処理しやすいため

第一引数にはvalueの値を
第二引数にはかえる前の文字列を
第三引数には変えたい文字列をいれます

void check(char **a,char **b,char **c){

if(strcmp(a,"Sel21")==0){
*b="<input type="checkbox" name="Check2" value="Sel21" checked />";
*c="<input type="checkbox" name="Check2" value="Sel21" />";
}

if(strcmp(a,"Sel22")==0){
*b="<input type="checkbox" name="Check2" value="Sel22" />";
*c="<input type="checkbox" name="Check2" value="Sel22" checked />";
}

if(strcmp(a,"Sel23")==0){
*b="<input type="checkbox" name="Check2" value="Sel23" checked />";
*c="<input type="checkbox" name="Check2" value="Sel23" />";
}


}

続く
    • good
    • 0

■checkedのON/OFFのさせかた



こんな関数を使います

int hen(char *buf, char *mae, char *ato){

char *nw;
size_t zen,go;

zen = strlen(mae);
go = strlen(ato);

if(zen == 0 || (nw = strstr(buf, mae)) == NULL){
return 0;
}

memmove(nw + go, nw + zen, strlen(buf) - (nw + zen - buf ) + 1);
memcpy(nw, ato, go);
return 1;
}

関数の使い方ですが

第一引数は変化させたい文字列
第二引数は第一引数の中でとくに変えたい箇所
第三引数は変える予定の文字列

具体例をあげると

hen("りんごが木から落ちた","りんご","みかん");

とすると

みかんが木から落ちた

となります


質問にかかれてる
<input type="checkbox" name="Check2" value="Sel22" />
チェック2 選択2<br />

にchecked をつける場合

char *buf="<input type=\"checkbox\" name=\"Check2\" value=\"Sel22\" />
チェック2 選択2<br />"

char *zen="<input type=\"checkbox\" name=\"Check2\" value=\"Sel22\" />"
char *go="<input type=\"checkbox\" name=\"Check2\" value=\"Sel22\" checked/>"

と初期設定しておいて
hen(buf,zen,go);

とすれば文字列をかえられます
続く
    • good
    • 0

「使用する」とはどんな意味で使ってますか?



・HTMLとして、例示されたようなコードを出力したい

printfなりなんなり、お好きな関数を使って標準出力に出力してください。
それすらわからないなら、CGIより先にC言語をマスターしてください

・HTMLのcheckboxの使い方がわからない

CGIより先にHTMLをマスターしてください。
あとは、そのHTMLの通りに出力するようにプログラムを作るだけです。

・checkboxからデータを受けとる方法がわからない

過去の質問を見ると、受けとれているようなので、これは無いと思いますが。

・その他

具体的に補足してください
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2012/12/29 18:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!