【问题标题】:Logging profile updates in PHP在 PHP 中记录配置文件更新
【发布时间】:2014-10-23 08:17:40
【问题描述】:

我的社交媒体网站上有一个编辑个人资料页面。

当用户点击表单上的提交时。我运行一个更新查询来明显更新数据库中的用户字段。

如何优化此方案以包含更新特定字段的日志记录?

所以例如

一种情况可能是:

克里斯更新了他的头像。

另一种情况是:

克里斯更新了他的个人资料,公司:

  • 电子邮件
  • 用户名
  • 地址
  • 地址 2

谁能提供解决方案?

我觉得不需要代码,因为它只是一个更新查询。

谢谢

【问题讨论】:

    标签: php mysql updates profile user-profile


    【解决方案1】:

    写出表格时,将当前状态保存在$_SESSION-变量中。检查提交的表单并与$_SESSION-变量中的数据进行比较。然后只对已更改的表单进行更新。

    if($_SESSION['name'] != $myform['name']) { $sql[] = "name = '{$myform['name']}'"; }
    if($_SESSION['img'] != $myform['img']) { $sql[] = "img = '{$myform['img']}'"; }
    $sqlstring = "UPDATE mytable SET " . implode(",",$sql);
    // run the sql
    

    编辑:实现日志记录:

    // populate the variables (name, img) from the db/session with the highest revision number.
    // ie SELECT * FROM mytable where userid = $userid ORDER BY revision DESC LIMIT 1
    $revision = $_SESSION['revision'] + 1;
    $sql = "INSERT INTO mytable SET img = '$img', name='$name', revision='$revision'"; 
    

    【讨论】:

    • 对,这是一种只更新需要更新的字段的方法。很清楚,我还没有实现它。实际问题呢,记录更改?我应该制作一个单独的数据库表吗?
    • 对不起。我只是在同一个表中添加一个修订号,实际上不进行更新,而是添加一个包含所有数据的新行以及更高的修订号。
    • revision 是更新的版本?比如说采用修订版 3,最新的而不是修订版 1 的原始更新?
    【解决方案2】:

    您是否将所有这些信息都放在了$_SESSION 中?如果是这样,您可以取消设置会话并使用新信息再次声明它。

    【讨论】:

    • 是的,所有内容都在 $_FORM[] 中,是 $_SESSION 的副本
    • 当用户更新时,我假设它是在一个表单中。因此,您所做的是取消设置 $_SESSION 或 $_FORM,并仅使用发布的值再次声明它。
    【解决方案3】:

    您可以使用自定义设置器/获取器来执行此操作。检查下面的代码。

    您还可以添加额外的检查以确保值已更改,或使用魔术方法使事情更加动态。

    class MyObject
    {
        protected $modifiedFields = array();
        public function setField($value) {
            if (!in_array('field', $this->modifiedFields)) {
                $this->modifiedFields[] = 'field';
            }
        }
    }
    

    如果您有修改过的字段,则只需运行更新查询以仅包含这些字段。

    【讨论】: