【问题标题】:Update or insert only columns that changed仅更新或插入已更改的列
【发布时间】:2013-11-26 13:52:09
【问题描述】:

我正在尝试寻找最佳和最有效的方法来通过使用 PHP 的表单更改给定表中的数据。

该场景是一个表中的项目列表,如果您右键单击->编辑一个项目,则会向 MySQL 请求所有数据并填充字段。

用户可以更改或保留任何字段中的数据不变,然后按保存将所有内容发送回 PHP。

简单的方法是只更新所有列,无论它们是否已更改,即:

$this->model->set('name', 'some name string from the form', $itemId);
$this->model->set('price', 'number from the form', $itemId);
...etc...

因此,我可能只更改名称,并使用与收到的数据相同的数据不必要地更新其余列。 (作为一个附带问题,MySQL 是否知道这一点并忽略了幕后的更新?)

执行智能更新的好方法是比较两个数组吗?一个包含原始数据,另一个包含来自用户的数据。如果给定索引的值不匹配,那么它一定已经改变了,更新也是如此?

即一个非常简单的例子:

if($submittedValues['name'] != $originalValues['name'])
{
    ...Update...
}

【问题讨论】:

    标签: php mysql forms performance


    【解决方案1】:

    我猜你回答了你的问题,你可以在PHP 代码中或使用 javascript 比较两个数组,而不是将所有内容发送到服务器,只发送更改后的值。

    但总的来说,如果我重置所有数据,我不会在意,再次影响所有字段的过程可能比比较数组中的新旧数据更快,如果我要进行很多查询,我会非常小心数据库,但它只有一个更新查询


    测试中有趣的是,当用户将字段留空时,请求将发送一个空字符串,最后更新请求将插入一个空字符串,其中NULL 值会更好意义

    【讨论】:

    • 在 NULL 值的情况下,我会让它只清空列中的值。如果它是存储在左联接的表中的值,例如项目序列号,如果不是每个项目都有一个,它会删除一行。
    • 复选框也可能会导致问题,因为如果未勾选它们,它们不会出现在请求中,即您不会得到 ...&checkbox1=&somethingelse=...
    • 是的复选框,如果没有发送任何值,您应该在后端(php脚本)中处理,这意味着它没有被选中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2017-12-06
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    相关资源
    最近更新 更多