• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:保存されたレコードの一部のみを変える)

保存レコードの一部を変更する方法とは?

このQ&Aのポイント
  • CGIを改造中で、表示非表示だけの変更ができるページの作成を考えています。
  • 変数のみ表示して変更する方法は可能でしょうか?保存されているデータの一部の変更方法について詳しく教えてください。
  • 保存されたレコードの中で$jobという変数の値のみ変更したいです。どのように対応すればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.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'} などと書いた方が綺麗で読みやすく、また処理しやすいですが。)

関連するQ&A