• 締切済み

チェックボックスのデータをdatファイルに保存する方法

更新記録CGI(perl)を改造中です。 修正画面でチェックボックスにチェックを入れておくと確認画面である文字列を表示させるというのを実現させたいです。 表示させる方はIF文で、 if ($check ==1){普通に表示}else {別の文字列を表示} とすることで何とかなると思うのですが、このチェックボックスの情報の保存方法がよくわかりません。 記事登録処理の部分、 foreach (@data) { ($contents,$date,$year,$month,$day,$comment,$check) = split(/<>/); if ($in{'contents'} eq $contents && $in{'year'} eq $year && $in{'mon'} eq $month && $in{'day'} eq $day && $in{'comment'} eq $comment $in{'check'} eq $check ) { &error("記録済みです"); } } このあたりが、データの保存を指示している場所だと思うのですが、このままだと、datファイルには「in{'check'}」と保存されてしまいます。 これをどうやったらチェックボックスにチェックが入っているという風に保存できるのでしょうか? また、修正画面でチェックボックスにチェックが入っている場合はチェックが入った状態で表示する(その情報表示する)という風にしたいのですが、これまたうまくできません。 多分、 if ($no eq $in{'edit_no'}){~~$e_check = $check;~~} <input type=\"checkbox\" name=\"e_check\" size=5 value=\"$e_check \">\n"; この二つが関係していると思うのですが… 単純に、チェックボックスにチェックを入れて保存したら、datファイルにそのデータが保存され、チェックが入っていれば、修正画面・表示画面にてそれぞれのアクションを起こしてほしいというものです。 抜けてる情報などありましたら指摘してください。すぐに書き込みします。 よろしくお願いします。

  • CGI
  • 回答数2
  • ありがとう数1

みんなの回答

  • estea
  • ベストアンサー率44% (39/87)
回答No.2

まず、$in{'check'}だけど、 保存時に ' ~ $in{'check'} ~' とか ' で囲まれてるとか、 q( ~ ) となっているんでしょうか? その場合は ' の代わりに " にするとか q() の代わりにqq() にするとかで回避できます。 >抜けてる情報 ~ 何処かでファイルに保存している記述があるのでその部分が要ります。 で、チェックがある場合それを HTML にも表示させたいって事みたいですが、チェックされている場合は <input type=checkbox ~ > に checked を入れます。 多分 value=~ を入れたのでは無理かと。 >抜けてる情報 ~ 「チェックボックスにチェックが入っていることを表示させたい」部分のコードが要ります つまり > <input type=\"checkbox\" name=\"e_check\" size=5 value=\"$e_check \">\n"; の周囲。

master-3rd
質問者

お礼

すみません。間違え発見してしまいました。 ここを if($check ==1){ print "<input type=\"checkbox\" name=\"s_out\" size=5 value=\"checked\">\n"; }else{ print "<input type=\"checkbox\" name=\"s_out\" size=5>\n"; } でOKでしょうか? //////// ↓正しくは ////////// ここを if($check ==1){ print "<input type=\"checkbox\" name=\"check\" size=5 value=\"checked\">\n"; }else{ print "<input type=\"checkbox\" name=\"check\" size=5>\n"; } でOKでしょうか? でした。 よろしくお願いします。

master-3rd
質問者

補足

返答ありがとうございます。 >何処かでファイルに保存している記述 これは sub edit1 { # ログファイル読み込み open (FILE, "$data") || &error("ファイルが開けません"); @data = <FILE>; close(FILE); # 二重投稿の禁止 $flag=0; foreach (@data) { ($contents,$date,$year,$month,$day,$comment,$image,$new,$no,$url,$name,$lot,$check) = split(/<>/); *****以下、下の方の補足に書かれた文章に続く***** この部分でしょうか? q( ~ )というのは見当たらないですね。 ><input type=checkbox ~ > に checked を入れます。 ということは、if分で分けないといけないと言う事でしょうか? 修正画面でチェックボックスを確認するとき、 if ($check ==1){checked}else {指定無し} としたら良いと言う事でしょうか? >「チェックボックスにチェックが入っていることを表示させたい」部分のコード ------------------------ print "<tr>\n"; print "<td align=\"right\">\n"; print "チェック</td>\n"; print "<td>:</td>\n"; print "<td>\n"; print "<input type=\"checkbox\" name=\"check\" size=5 value=\"$e_check\">\n"; print "</td>\n"; print "</tr>\n"; ------------------------------- この部分でしょうか? ここを if($check ==1){ print "<input type=\"checkbox\" name=\"s_out\" size=5 value=\"checked\">\n"; }else{ print "<input type=\"checkbox\" name=\"s_out\" size=5>\n"; } でOKでしょうか? あとは、ログにうまく保存する方法ですね。

回答No.1

まず、If文の終わりの $comment $in{'check'} eq $check ) ですが、 $comment && $in{'check'} eq $check ) ではないかと(&&が抜けている?!) どうして in{'check'}が保存されるかは このIf文の後を見ないとわからないですね。

master-3rd
質問者

補足

返答ありがとうございます。 …数日前に補足を入力したはずなのに、何も返答がないなぁと思ってたら、補足が載ってなかったです。???何かエラーが生じたのかな? ということで、もう一度掲載します。 まず、&&ですが、ほかにもいくつかの項目があるのですが、文字数制限を気にして必要ないところは削除したんです。そのときに間違って削除してしまいました。 if ($in{'contents'} eq $contents && $in{'year'} eq $year && $in{'mon'} eq $month && $in{'day'} eq $day && $in{'comment'} eq $comment&& $in{'image'} eq $image && $in{'url'} eq $url && $in{'name'} eq $name && $in{'lot'} eq $lot && $in{'check'} eq $check ) { &error("記録済みです"); } } $count = shift @data; $count = $count + 1; if ($in{'new_contents'} ne ""){ $contents = $in{'new_contents'};} else { $contents = $in{'contents'};} unshift (@data,"$contents<>$in{'year'}/$in{'mon'}/$in{'day'}<>$in{'year'}<>$in{'mon'}<>$in{'day'}<>$in{'comment'}$comment2<>$in{'image'}<>new<>$count<>$in{'url'}<>$in{'name'}<>$in{'lot'}<>$in{'check'}<>\n"); この下は更新日順にソートとなっています。 以上よろしくお願いします。

関連するQ&A

  • if文データの別ファイル化について

    金星と火星の「○年○月○日は○座」というのがわかっていて, それを入力された年月日と比較して答えを出してるのですが、 数年間のデータを全部if文で書くと,分量が非常に多くなって しまいます。 そこで、金星と火星それぞれのデータを別ファイルにしてしまう 方法はないでしょうか?初心者なもので、なるだけ具体的に よろしくお願い致します。 以下ソースコードです。 #以下金星のデータ sub get_venus_data{ local($year,$month,$day)=@_; local($horoscope)='データなし'; if($year==1950){ if($month<=3 || ($month==4 && $day<=6)){ # ~4月の6日以下 $horoscope = 'みずがめ'; # みずがめ座 }elsif($month==4 || ($month==5 && $day<=5)){ # 4月の残り~5月の5日以下 $horoscope = 'うお'; # うお座        ・        ・       間省略        ・        ・ }elsif($month==12){ # 12月の残り~12月の31日以下 $horoscope = 'やぎ'; # やぎ座 } } return $horoscope; } #以下火星のデータ sub get_mars_data{ local($year,$month,$day)=@_; local($horoscope)='データなし'; if($year==1950){ if($month<=3 && $day<=28){ # ~3月の28日以下ならば $horoscope = 'てんびん'; }elsif($month==3 || ($month==6 && $day<=11)){ # 3残り又は6/11以下 $horoscope = 'おとめ';        ・        ・       間省略        ・        ・ }elsif($month<=12){ # 12残り $horoscope = 'みずがめ'; } } return $horoscope; } # 入力から金星と火星の星座を求める。 $venus = get_venus_data($in{'year'}, $in{'month'}, $in{'day'}); $mars = get_mars_data($in{'year'}, $in{'month'}, $in{'day'});

    • ベストアンサー
    • CGI
  • ファイルメーカーのスクリプトで25日締めの請求データを作成していますが・・・

    毎度お世話になります。 ファイルメーカーVer4.0 OS=Win2000です。 毎月25日で締めて請求書を起こすために、締め日の翌日(26日)から締め日までのデータを検索して表示するスクリプトを作成しております。 「計算結果を貼り付け」で現在の日付から、表示させる締め日を貼り付けて、検索させようとしております。 見づらくて申し訳ございませんが、本日の日付を拾ったあと、下記の計算をさせようとしていますが、「関数のカンマの数が多すぎます」とエラーが出て困っています。 if(Month ( 本日 )=1, if(Day ( 本日 ) < 26, Year ( 本日 )-1 & "/" & Month ( 本日 )-2 &"/" & 26 & "..." & Year( 本日 )-1 & "/" & Month ( 本日 )-1 &"/" &25, Year ( 本日 )-1 & "/" & Month ( 本日 )-1 &"/" & 26 & "..." & Year( 本日 ) & "/" & Month ( 本日 ) &"/" &25, if(Month ( 本日 )=2, if(Day ( 本日 ) < 26, Year ( 本日 )-1 & "/" & Month ( 本日 )-2 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 25, Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 ) & "/" & 25, if(Day ( 本日 ) < 26, Year ( 本日 ) & "/" & Month ( 本日 )-2 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 25, Year ( 本日 ) & "/" & Month ( 本日 )-1 & "/" & 26 & "..." & Year ( 本日 ) & "/" & Month ( 本日 ) & "/" & 25))))) ※(本日)とはフィールド名で、スクリプトの最初に「現在の日付を貼り付ける」を入れてありますので、スクリプト起動時に当日の日付が入力されます。 要は、当日が25日までであれば、1月は前年の11月26~12月25日を表示し、 2月は前年の12月26~翌年の1月25日を表示し、3月から12月までは、当日が25日までは、前々月の26日~前月の25日迄を表示し、26日~末日までは前月の26日~当月の25日を表示させて、それを作業日のフィールドに貼り付けて検索すれば、直近の25日締めで表示されると考えました。 どこが違うのでしょうか?

  • チェックボックス、セレクトメニューについて

    現在フォームを作成しております。 入力フォームで各項目を入力してから確認画面、送信となるフォームです。 入力フォームにて各項目を入力し、確認画面が表示され、確認画面にて入力等の間違えや、入力をし忘れた等などがあった場合「戻る」で、入力画面に戻るようにしています。 (必須項目が記入されていなかった場合は自動で入力画面に戻るように設定。) 入力画面にてセレクトメニュー(1990年01月01日に選択したとする。)、チェックボックス(MF,FWにチェックをしたとする。)を選択し、 確認画面が表示されたあと入力画面に戻るとセレクトメニューは選択した値(1990年01月01日)のはずが初期値の値(1980年01月01日)に戻っている。 チェックボックスは選択されていたはずなのにチェックがはずれているという現象が起きています。 入力画面→確認画面→入力画面ページが表示されてもセレクトメニューの値はそのままでなおかつチェックボックスの値もそのまま表示されているようにしたいです。 この現象を直すにはどのように記述したらよろしいでしょうか? 下記は入力フォームと確認画面の記述になります。 /***** 入力画面 *****/ <tr> <td class="title_back1"><label for="mail">生年月日</label></td> <td class="title_back2"> <p class="error"><?php print $_SESSION['err_birthday_ereg']; ?></p> <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> </td> </tr> <tr> <td class="title_back4"><label for="position">希望ポジション</label></td> <td class="title_back5"> <input type='checkbox' name='position[]' value='GK'>GK <input type='checkbox' name='position[]' value='DF'>DF <input type='checkbox' name='position[]' value='MF'>MF <input type='checkbox' name='position[]' value='FW'>FW <input type='checkbox' name='position[]' value='MG'>MG </td> </tr> /***** 確認画面 ******/ $year = isset($_POST['year']) ? sprintf("%04d",$_POST['year']) : NULL; $month = isset($_POST['month']) ? sprintf("%02d",$_POST['month']) : NULL; $day = isset($_POST['day']) ? sprintf("%02d",$_POST['day']) : NULL; $position = isset($_POST['position']) ? implode(" , " , $_POST["position"]) : NULL; //生年月日をチェック if (checkdate($month, $day, $year) === false) { $_SESSION['err_birthday_ereg'] = '生年月日が正しくありません。'; $error = TRUE; } else { unset($_SESSION['err_birthday_ereg']); } <tr> <td class="title_back1">生年月日</td> <td class="title_back2"><?php print h($year) ;?>年&nbsp;<?php print h($month) ;?>月&nbsp;<?php print h($day) ;?>日</td> </tr> <tr> <td class="title_back4"><label for="career">希望ポジション</label></td> <td class="title_back5"><?php print h($position) ;?></td> </tr> と以上になります。 とても説明がしずらいためわかりにくいとこがあると思いますが、宜しくお願いします。 また、何か足りない記述等が御座いましたら、お申しでください。 他のテキストボックスなどは正常に動作しております。 (入力画面→確認画面→入力画面の動作をおこなってもテキストボックス内に表示されています。) 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 複数のチェックボックスの値を書き込む方法

    複数行のチェックボックスの値をそのまま 書き込みたいのですが・・・ .datファイル↓ 1234,1 5678,0  3456,1 7890,0 上記をHTMLとして出力。 1→checkedで出力されるとします。 チェックを入れて、 7890,0 ↓ 7890,1 にするとそれを1行として保存されるようにしたい です。 チェックボックスは同じ名前のためform('check') などで値を取り出したとしても最後の値しか 値を取り出せないでしょう。 画面に複数出た行を全部.datファイルに書き込むには どうすればよいのでしょうか? http://www.futomi.com/lecture/form/cgi-pm.html ↑を参照しましたが、チェックの値は@配列で 取れるような気がしましたが、1行を書き込む 方法がわからないので詳しく教えていただければ 幸いです。 言葉だけよりソースがあるとわかりやすいですm(__)m

    • ベストアンサー
    • Perl
  • チェックボックスでチェックを残したまま保存は不可能?

    よろしくお願いします。 チェックボックスにおいて、該当項目にチェックを残した状態で保存することは不可能でしょうか? 例えば50のチェック項目があって、そのうち20にチェックを残したまま保存する・・というようなことです。 できればPCでも携帯でも同様にそうした使い方ができないかを模索しています。 携帯の場合だと画面メモにチェックが残ったまま保存している、という状態ができれば理想です。 最初からCHECKEDを入力しておく以外で、そうした方法がないかを教えて下さい。 よろしくお願いします。

  • チェックボックスの入力チェック

    フォームメール用のCGIを作成しているのですが、チェックボックスの入力チェックをCGIでおこないたい場合、どのようにすればよいのでしょうか? 複数選択可で1つも選択されていない場合エラーメッセージを出すようにしたいと思っており、チェックボックスには1個づつ個別の変数を用意しています。 if ($name eq "") { print "Content-type: text/html;charset=euc-jp\n\n"; print "お名前を入力してください。"; exit(0); } テキストボックスはこのように入力チェックをおこなっています。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • Javascriptで日付毎のチェックボックスを判断する方法

    JAVAで予約できるカレンダーを作成するという課題が学校で出てしまい非常に困っています。 仕様: カレンダー関数により、年・月・日を取得しています。 Calendar cal = Calendar.getInstance(); cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE)); int YEAR = cal.get(Calendar.YEAR); int MONTH = cal.get(Calendar.MONTH)+1; int DATE = cal.get(Calendar.DATE); 下記の機能を”Javascript”で実現したいのですが、力不足でどうすることもできません。 実装したい機能: 予約の日付はカレンダー上にある日付毎に設置されたチェックボックスで判断します。予約できる日付は、選択した日付から前後連続した日付けのみ選択可能で、他の日付をまたいで予約することはできないようにする、というものです。 例をあげてみます。 10月10日のチェックボックスを選択したとします。選択した時点で10月の9、10、11日のみチェックボックスにチェックが可能となり、その他はdisabledにします。 次に10月11日のチェックボックスを選択すると、選択した時点で10月の9、12日が選択できるようになります。予約は連続した日付のみ可能ですので、10、11日とその他はdisabledにしなくてはなりません。 どのようなアドバイスでもかまいません。 回答をお願いします。

  • チェックボックスのオンオフ

    チェックボックスを配置して、チェックボックスがオンになった時に 測定器と通信して数値データを表示するプログラムを作っています。 数値データは刻一刻と変化するので、チェックボックスがオンの時は Loopで数値データを取得するようにしています。 数値データの取得を止めたいときはチェックボックスを再度クリックして 終了したいのですが、Loopの中に入っているとチェックボックスを クリックしても反応しません。 何か方法はありませんか?チェックボックス以外のボタンを配置して Loopを抜けるようにしないと駄目ですか? Private Sub Checkbox1_Click() If Checkbox1= 1 Then Do 数値データを取得して、画面上に表示するプログラム(チェックボックスのクリックが効かない) Loop End If End Sub

  • C言語で3次元配列を使い一年分のカレンダーを作成

    カレンダーは完成したのですが曜日がズレてしまい綺麗に表示されません。どのように改善すれば良いのでしょうか?よろしくお願いします。 現状です #pragma warning(disable:4996) #include <stdio.h> #include <Windows.h> enum M_LIST { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, N_MONTH }; enum W_LIST { SUN, MON, TUE, WED, THU, FRI, SAT, N_WEEK }; int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数 char *weekday[] = { "日","月","火","水","木","金","土" }; //各曜日 /*プロトタイプ宣言*/ int monthday(int year); void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]); void karenda(char box[N_MONTH][N_WEEK][N_WEEK]); /*メイン*/ void main(void) { int year, total; char box[N_MONTH][N_WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる /*画面制御の初期化*/ COORD coord; HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); printf("西暦を入力"); scanf("%d", &year); //年度の入力 total = monthday(year); Array(total, box); karenda(box); } /*求める月の前月までの総日数*/ int monthday(int year) { int total = 0; /*求める年の前年までの総日数を求める*/ total = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1); /*うるう年の判定*/ if (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0) { mday[FEB] = 29; } else { mday[FEB] = 28; } return total % 7; } /*カレンダーの配列*/ void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]) { int month, row, col, day; col = total; for (month = JAN; month < N_MONTH; month++) { row = 1; day = 1; while (day <= mday[month]) { box[month][row][col] = day; if (col > SAT) { //土曜までいったら次の週 row++; col = SUN; } day++; col++; } } } /*カレンダーの出力*/ void karenda(char box[N_MONTH][N_WEEK][N_WEEK]) { int month, week, day; for (month = JAN; month < N_MONTH; month++) { //月の出力 printf("%3d\n", month + 1); for (week = SUN; week < N_WEEK; week++) { for (day = SUN; day < N_WEEK; day++) { if (week == 0) { //曜日の出力 printf("%s", weekday[day]); } if (box[month][week][day] == 0) { //0なら空白 printf(" "); } else { printf("%3d", box[month][week][day]); } } printf("\n"); } printf("\n"); } } 今はこのような形で表示されます(空白は_で表しています) 日____月____火____水____木____金____土 ________1___2___3___4___5 6___7___8___9__10__11__12 13_14__15__16__17__18__19 20_21__22__23__24__25__26 27_28__29__30__31