Stackoverflow 的老读者;第一次发帖,希望你温柔点:)
我在一个页面上有一个表单,其中包含大约 50 个不同类型的字段(复选框/文本/十进制/日期等)。通过一个查询从大约 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。第三种选择当然是将其转换为具有多个提交按钮的多个表单,例如每个选项卡一个(表单已经分为选项卡),缺点是由于需要更多提交而更频繁地重新加载页面(尽管在这里当然也可以使用 AJAX)。
我是否应该考虑这么多(到目前为止,我花了一天的大部分时间在这里阅读旧线程......)?!这里涉及到一些财务数据,所以我主要关心的是可靠性和性能,但我也很好奇是否有其他人遵循的任何最佳实践?
--- 执行下面选择的答案后更新 ---
作为 SO 的长期读者,我总是很欣赏提出问题的人稍后跟进的线程,所以我想我自己会这样做。不确定协议或格式是否正确。
如上所述,我最终选择了 barnyr 的解决方案,它基本上使用 javascript 将提交时的表单与原始值进行比较,然后将更改发布到 mysql(使用 jquery post)。如果您正在考虑类似的情况,请考虑以下几点:
如果未选中,jquery 的序列化不会发送复选框/单选值。我看到他们的逻辑,但对我来说这没有意义。我使用了http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/上的插件来解决这个问题。
如果您在页面上编辑一个值,然后保存它,然后再次编辑它,回到原始值,您将收到一条“没有改变”消息,与页面加载时设置的初始值相比,没有任何改变。这是合乎逻辑的,但直到我完成并测试之后我才考虑到这一点。我真的看不出有什么办法可以保证保持这个解决方案带来的复杂性而不是简单的“覆盖表单提交上的所有内容”,所以如果你正在构建一个关心你的用户的公共应用程序,我不会建议您使用此方法。
在规范化方面,这个解决方案很漂亮,因为我可以防止将行添加到链接到包含用户 ID 的主表的表中,除非将内容添加到这些特定字段。但是,如果第 2 点对我来说是一个大问题,那么只需将所有这些值以一个大表格的形式存储在一个大表中,就会大大减少代码的复杂性。我几乎是一个新手 wrt 标准化(所以在干草叉上放轻松),这当然主要是所有数据都以一种形式显示的结果。如果您使用多个表格,则不再适用。
系统的一部分涉及大量数字,汇总在表单的其他部分中,通过 AJAX 完成所有这些意味着您必须非常小心并清楚用户点击保存时到底发生了什么变化。例如,他们可以更改程序价格,并且总价格也应该更新,但是当您通过 AJAX 提交并且没有适当的重新加载时,您必须将所有这些编码回系统中。
在这种情况下,第 2,3 和第 4 点可以解决,但如果我在开始时知道我现在所知道的,我可能会使用一个包含所有数据的大表,并在表单提交时简单地编辑整行。话又说回来,我学到的东西会少很多,所以没有遗憾:) 希望这对那些在稍后阶段找到这个线程的人有所帮助。