Stackoverflow の長年の読者。初めてのポスターなので、お手柔らかにお願いします:)
さまざまなタイプ (チェックボックス/テキスト/10 進数/日付など) の約 50 のフィールドで構成されるページにフォームがあります。値は、およそ次のように、1 つのクエリを通じて約 8 つのテーブルから取り込まれます。
SELECT * FROM p
LEFT JOIN pd on p.id=pd.id
LEFT JOIN pc on p.id=pc.id
LEFT JOIN pie on p.id=pie.id
etc.
WHERE p.id = xxx
フォームで単純な POST を使用し、一連の検証クエリと更新クエリを作成し (既存のすべての値をフォームにあるもので上書きする)、それで完了すると考えて一日を始めましたが、自分の判断に疑問を抱いています。ここ。
具体的には、既存の値が変更されていない場合にそれをオーバーライドするのは間違っていると感じます。データベースの更新が途中で失敗した場合にどうなるか少し心配です (トランザクションで処理することを考えています)。私は小さなフォームでこれに慣れていますが、スタッフが 1 つまたは 2 つのフィールドを変更しただけの場合、これは無駄に多くのことを書いているように感じます. 次に考えたのは、フィールドごとのレベルに基づいて AJAX にすることでした。フィールドを変更すると、変更が送信されて保存されます。できればjsを避けたいと思っていても、もっと理にかなっているように感じます。もちろん、3番目のオプションは、複数の送信ボタンを備えた複数のフォームに変換することです。たとえば、タブごとに1つ(フォームはすでにタブに分割されています)、欠点は、より多くの送信が必要なため、ページをより頻繁にリロードすることです(ここではもちろん、AJAX も使用できます)。
私はそれにこれほど多くのことを考えるべきですか? ここには財務データが少し含まれているので、私の主な関心事は信頼性とパフォーマンスですが、他の人が従うベスト プラクティスがあるかどうかも知りたいです。
--- 以下の選択した回答を実装した後に更新 ---
SO の長年の読者である私は、質問者が後でフォローアップするスレッドにいつも感謝しているので、自分でそうしようと思いました。正しいプロトコルまたはフォーマットがわからない。
上記のように、私は基本的にjavascriptを使用して送信時のフォームを元の値と比較し、変更をmysqlに投稿するbarnyrのソリューションに行き着きました(jquery postを使用)。同様のシナリオを検討している場合は、次の点を考慮してください。
すぐに、jquery のシリアル化は、チェックボックス/ラジオの値が選択されていない場合、それらを送信しません。彼らの論理はわかりますが、私にはこれは意味がありません。これを解決するために、 http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/のプラグインを使用しました。
ページで値を編集して保存し、再度編集して元の値に戻すと、ページの読み込み時に設定された初期値と比較して、何も変更されていないというメッセージが表示されます。論理的ですが、すべてが完了してテストが完了するまで、これを考慮していませんでした。単純な「フォーム送信時にすべてをオーバーライドする」よりも、このソリューションに伴う複雑さを維持することを保証するこれを回避する方法は実際には見当たらないため、ユーザーを気にするパブリックアプリケーションを構築している場合は、この方法を使用することをお勧めします。
正規化に関しては、コンテンツが特定のフィールドに追加されない限り、ユーザー ID を含むメインのテーブルにリンクされたテーブルに行が追加されないようにすることができるため、このソリューションは美しいです。ただし、ポイント 2 が私にとって大きな問題である場合、1 つの大きなフォームに表示されるこれらすべての値を 1 つの大きなテーブルに格納するだけで、コードの複雑さが大幅に軽減されます。私は正規化に関してほとんど初心者です(ピッチフォークで簡単に行ってください)。もちろん、これは主に、すべてのデータが1つの形式で表示される結果です。複数のフォームを使用している場合、これは当てはまりません。
システムの一部には、フォームの他の部分に合計された多くの数値が含まれます。これらすべてを AJAX 経由で行うことは、ユーザーが保存を押したときに正確に何が変化するかを非常に注意深く明確にする必要があることを意味します。たとえば、プログラムの価格を変更でき、合計価格も更新されるはずですが、AJAX 経由で送信していて適切なリロードがないため、これらすべてをシステムにコーディングし直す必要があります。
この場合、ポイント 2、3、および 4 を回避できますが、開始時に今知っていることを知っていれば、すべてのデータを含む 1 つの大きなテーブルを使用し、フォーム送信時に行全体を単純に編集していたでしょう。繰り返しになりますが、私は学ぶことがずっと少なかったので、後悔はありません:)これが後の段階でこのスレッドを見つけた人の助けになることを願っています.