7

Codeigniterを使用してWebアプリを作成し、いくつかの編集フォーム(mysqlデータベースから現在の値を取得する)を作成しました。ユーザーは、フォームのデータを編集することにより、現在のデータベースデータを編集できます。

私がやりたいのは、ユーザーが特定の値を変更した場合に特定のアクションを実行することです。したがって、フィールドに特定の値がある場合にアクションを実行するだけでなく、ユーザーが値を変更してフォームを送信した時点でのみアクションを実行したいと思います。(具体的には、ユーザーが値を「no」から「yes」に変更して特定のタスクを実行したことを示した場合、タスクの完了のタイムスタンプを設定するなどの操作を行います。)

解決策をグーグルで検索しようとしましたが、必要なものを見つけるのに苦労しています。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

7

私はCodeIgniterを使用していませんが、純粋なPHPベースのサイトで行っていることは確かに行っています。

私は、さまざまなプロジェクトで2つの考え方に従いました。

戦略#1:複数の書き込みは安価です。

ユーザーが「キャンセル」ではなく「送信」をクリックした場合、少なくとも1つのフィールドが変更されています。したがって、を実行するコストはUPDATE table SET name=%s,email=%s,gender=%s WHERE id=%d単純なものにすぎませんUPDATE table SET gender=%s WHERE id=%d。WHEREと書き込みの費用がかかる場合、書き込みをいくつかの追加フィールドにすることは、特にそれが発生する頻度では重要ではありません。

だから:それについて心配する必要はありません。フォームに戻ってきたものですべてを更新するだけです。同じデータでフィールドを上書きする場合、それは問題ではありません。結局のところ、以前のデータベースに何があったかに関係なく、フォームに戻ってきたすべてのものをデータベースに反映させる必要があります。

戦略#2:セッション変数を使用します。

フォームに現在のデータを入力している場合は、すでにそれを配列にプルしている可能性があります。したがって、配列をにコピーし$_SESSION、POST後のフィールドを比較します。

戦略1はプログラミングが簡単ですが、データベースのCPUと帯域幅をわずかに多く使用します戦略2は、Webサーバーで使用されるCPUがかなり多くなるという犠牲を払って、データベースへの影響がわずかに少なく、開発エラーが発生しやすくなります。

どちらが良いかはまだわかりませんが、どちらの議論も正しいようです。最近、私は最も単純な解決策を選ぶ傾向があります。ただし、データベースクラスターよりもWebクラスターのスケーリングが簡単であることに気付いたため、非常に大規模なものを開発する場合は、Webサーバーではなくデータベースを優先して最適化に注力する方がよいでしょう。

セッションデータを一時ファイルではなくデータベースに保存している場合、#2は、データベースサーバーへの影響という点で実際にはコストがかかることに注意してください。

于 2012-05-29T02:00:20.930 に答える
1

ユーザーはデータベースのエントリを編集できると言っているので、レコードidを非表示の入力フィールドとして送信するだけです。

ユーザーがフォームを送信するまでに、非表示フィールドを使用してデータベースレコードを取得し、必要な比較を行います。

ところで、ユーザーが他のレコードを変更しようとするのを防ぐためにid、自分だけが確認できるチェックサムをフィールドに追加することをお勧めします。これは、を使用して実行できますhash_hmac。または、レコードがログインしている場合は、レコードの所有権を確認することもできます。

于 2012-05-29T01:23:35.843 に答える
0

ここでの唯一の実際の解決策は、フォーム入力の初期値を知り、それを送信された値と比較することです。元の値を非表示のフォームフィールドとわずかに異なる名前としてブラウザに渡してから、2つのサーバー側を比較することもできます。これにより、元の値がすでにわからない場合に、目的の効果が得られるはずです。

于 2012-05-29T01:19:49.860 に答える