7

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

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

我试过用谷歌搜索一个解决方案,但我找不到我需要的东西。谁能指出我正确的方向?

4

3 回答 3

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 和 write 的费用,那么让 write 增加几个额外的字段并不重要,尤其是在它发生的频率上。

所以:不用担心,只需使用您在表单中获得的内容更新所有内容。如果你用相同的数据覆盖一个字段,那没关系。归根结底,您希望您的数据库反映表单中返回的所有内容,而不管之前数据库中的内容。

策略#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

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

于 2012-05-29T01:19:49.860 回答