重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

CGIを改造中です。
データベースのようなものなのですが、それぞれのレコードを管理画面には出すけど、チェックされていないものに関しては公開画面には出さないように出来るようにしています。
今までは、修正画面でその他の項目と共に表示非表示チェックボックスをオンオフすることで表示非表示を切り替えてきました。
今回、これを「表示非表示だけの変更が出来るページ」を作ろうかと考えています。

普通、内容を1つだけ変更する時は他の項目は<input type="hidden" name="■■" value="$■■">と言う形で記入していきますよね。
これを記入せず、変えたい変数のみ表示して変更すると言うことは可能でしょうか?
データは、
$no,$date,$name,$genre,$com,$isub,$info,$tel,$url,$thanks,$job,$tail,$w,$h,$subimg1,$subcom1,$subimg2,$subcom2,$floor,$jgenre,$jcapa,$jtime,$jmoney,$jservice,$jholiday,$jtan,$jothと言う並びで保存されていて、「<>」で区切られています。
変更したいのは「$job」で空白か1(1の時表示)が入ります。

以上、足りない情報があったら指摘してください。
お願いします。

A 回答 (1件)

一般的にそのようなケースでは、セキュリティや整合性を保つという観点から、必要なデータだけを受け取るようにします。

いくら表示で hidden にしたところで、スクリプトが受け付けてしまうようでは意味がありませんから。

たとえば、($no というのは ID のようなものですか?以下そう仮定しています)今回の処理を行いたい場合、必要なデータは「no」と「job」だけですよね。それなら、
まずレコード一覧を表示するスクリプトで、ループの中で「no」と「job の現在の状態」を組み込んだformを表示します。

※@rec_line に全行を読み込んであるとして。

foreach (@rec_line) {
($load_no, $load_job) = (split(/<>/))[0, 10];
$job_checked = $load_job ? ' checked' : '';
print <<"EOM";
…(必要なら date や name など識別できるものを表示)
<form …>
<input type="hidden" name="no" value="$load_no">
<input type="checkbox" name="job" value="1"$job_checked>
<input type="submit" value="更新">
</form>

EOM
}

これで、現在 job が空白でなければチェックボックスがオンになった状態で一覧表示されます。
で、上記フォームから受け取ったデータを使って更新します。

※フォームからのデータが $form_no 、$form_job に入っているとして。

foreach (@rec_line) {
@fields = split(/<>/);
if ($fields[0] eq $form_no) {
$fields[10] = $form_job ? '1' : '';
$_ = join('<>', @fields);
}
}
ファイル保存…

no と job 以外は、読み込んだものをそのまま保存します。つまり触りません。
また、job の値はフォームからのデータをそのまま格納するのではない、というのもポイントです。
(本来は、配列よりも連想配列を使って $FIELD{'job'} などと書いた方が綺麗で読みやすく、また処理しやすいですが。)
    • good
    • 0

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