我正在使用Codeigniter创建一个Web应用程序,并且我创建了一些编辑表单(从mysql数据库中提取当前值)。用户可以通过编辑表单中的数据来编辑当前数据库数据。
我想要做的是在用户更改某些值时执行某些操作。因此,我不仅希望在字段具有特定值时执行操作,而且仅在用户更改值并提交表单时执行操作。 (具体来说,当用户通过将值从“no”更改为“yes”来表明她执行了某项任务时,我想做一些事情,比如设置完成任务的时间戳等等。)
我试过谷歌搜索解决方案,但我找不到我需要的东西。有人能指出我正确的方向吗?
答案 0 :(得分:7)
我没有使用CodeIgniter,但我确实完成了你在基于PHP的纯网站上所做的事情。
我在不同的项目中遵循了两种思维方式。
策略#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实际上更多成本更高。
答案 1 :(得分:1)
您说用户可以编辑数据库中的条目,因此只需将记录id
作为隐藏输入字段发送。
当用户提交表单时,您使用隐藏字段检索数据库记录并进行必要的比较。
顺便说一句,为了防止用户尝试修改其他记录,建议您向id
字段添加校验和,只有您可以验证,这可以使用hash_hmac
完成。或者,您可以在登录时验证记录所有权。
答案 2 :(得分:0)
这里唯一真正的解决方案是知道表单输入的初始值,然后将其与提交的值进行比较。您可以将原始值作为隐藏的表单字段和稍微不同的名称传递给浏览器,然后比较两个服务器端 - 如果您不知道,应该为您提供所需的效果原来的价值已经是什么了。