Php 检查表单值在提交时是否已更改

Php 检查表单值在提交时是否已更改,php,forms,codeigniter,Php,Forms,Codeigniter,我正在使用Codeigniter创建一个web应用程序,并创建了一些编辑表单(从mysql数据库中提取当前值)。用户可以通过编辑表单中的数据来编辑当前数据库数据 我想做的是,如果用户更改某些值,则执行某些操作。因此,我不只是想在字段具有特定值时执行操作,而是只在用户更改值并提交表单时执行操作。(特别是,当用户通过将值从“否”更改为“是”来指示她执行了某项任务时,我想做一些事情,例如设置完成任务的时间戳等。) 我试着用谷歌搜索一个解决方案,但我很难找到我需要的。有人能给我指出正确的方向吗?这里唯一

我正在使用Codeigniter创建一个web应用程序,并创建了一些编辑表单(从mysql数据库中提取当前值)。用户可以通过编辑表单中的数据来编辑当前数据库数据

我想做的是,如果用户更改某些值,则执行某些操作。因此,我不只是想在字段具有特定值时执行操作,而是只在用户更改值并提交表单时执行操作。(特别是,当用户通过将值从“否”更改为“是”来指示她执行了某项任务时,我想做一些事情,例如设置完成任务的时间戳等。)


我试着用谷歌搜索一个解决方案,但我很难找到我需要的。有人能给我指出正确的方向吗?

这里唯一真正的解决方案是知道表单输入的初始值,然后将其与提交的值进行比较。您可以将原始值作为一个隐藏的表单字段和一个稍微不同的名称传递给浏览器,然后比较这两个服务器端,如果您不知道原始值是什么,那么这将获得所需的效果。

您是说用户可以编辑数据库中的条目,因此,只需将记录
id
作为隐藏输入字段发送即可

用户提交表单时,使用隐藏字段检索数据库记录并进行必要的比较


顺便说一句,为了防止用户试图修改其他人的记录,建议在
id
字段中添加一个只有您才能验证的校验和,可以使用。或者,如果他们登录了,您可以验证记录的所有权。

我没有使用CodeIgniter,但我肯定已经完成了您在纯PHP站点中所做的工作

在不同的项目中,我遵循了两种思维方式

策略#1:多次写入成本低廉。

如果用户单击“提交”而不是“取消”,则至少更改了一个字段。因此,执行
更新表集名称=%s、电子邮件=%s、性别=%s(其中id=%d
)的成本并不比简单的
更新表集性别=%s(其中id=%d
)的成本高多少。如果你要以WHERE和write为代价,那么写几个额外的字段并不重要,特别是在这样的频率下

所以:不用担心,只要用你在表格中得到的东西更新一切就行了。如果用相同的数据覆盖字段,则无所谓。归根结底,您希望数据库反映表单中返回的所有内容,而不管以前数据库中有什么内容

策略#2:使用会话变量。

如果已使用当前数据填充表单,则可能已将其拉入数组。因此,将数组复制到
$\u会话中
,并比较POST后的字段

策略1更易于编程,但使用的数据库CPU和带宽稍微多一些。策略2对数据库的影响稍微小一些,但牺牲了web服务器上使用的CPU数量,而且更容易出现开发错误

我仍然不知道哪种方法更好,但两者的论点似乎都是正确的。现在,我倾向于选择最简单的解决方案。但我意识到,与数据库集群相比,扩展web集群更容易,因此,如果您正在开发一些非常大的东西,那么最好将更多精力放在优化数据库而不是web服务器上


请注意,如果将会话数据存储在数据库中而不是临时文件中,那么#2实际上对数据库服务器的影响更大。

依赖浏览器提供权威/重要信息是一个非常糟糕的主意。web应用程序安全规则#1:不要相信从客户端获得的任何东西。@ghoti-在这种情况下,这是无关紧要的。在这种情况下,唯一可能发生的事情是更新不会在可能的情况下触发。一个建议是确保使用XSS筛选来确保表单不会被破坏。@Mike我想到的更直接的问题是使用未签名的id字段,我已经更新了问题;不过,感谢您的评论,XSS筛选当然应该始终完成:)或者使用ACL和/或列来指示行所有权,而不是ID字段的校验和。@damianb同意;这将是另一个考虑因素好的,仔细阅读这些建议,我认为我可以在Codeigniter中的表单处理控制器内完成我需要做的事情:我必须将所有发布的数据拉入控制器内的数组(在更新数据库之前)。我也可以将当前数据从数据库拉入控制器(作为一个单独的数组?),然后比较两个数组之间的相关键值。是的,这听起来与我的策略2相当。不过,一定要记住你在优化什么。如果会话由数据库支持,那么使用这种方法实际上会全面增加负载,而不是减少负载。