Codeigniter:在更新中获取受影响的字段

时间:2010-03-03 21:30:55

标签: php mysql codeigniter

有一种方法可以在更新查询后修改哪些字段?

我想跟踪XXX用户修改的字段...使用有效记录的任何方式?

3 个答案:

答案 0 :(得分:2)

我需要这个确切的功能所以我写了这段代码。它返回受影响的字段数。

功能开始:

function mysql_affected_fields($sql)
{

    // Parse SQL update statement
    $piece1 = explode( "UPDATE ", $sql);
    $piece2 = explode( "SET", $piece1[1]);
    $sql_parts['table'] =  trim($piece2[0]);

    $piece1 = explode( "SET ", $sql);
    $piece2 = explode( "WHERE", $piece1[1]);
    $sql_parts['set'] =  trim($piece2[0]);

    $fields = explode (",",$sql_parts['set']);
    foreach($fields as $field)
    {
        $field_parts = explode("=",$field);
        $field_name = trim($field_parts[0]) ;
        $field_value = trim($field_parts[1]) ;
        $field_value =str_replace("'","",$field_value);
        $sql_parts['field'][$field_name] = $field_value;
    }

    $piece1 = explode( "WHERE ", $sql);
    $piece2 = explode( ";", $piece1[1]);
    $sql_parts['where'] =  trim($piece2[0]);

    // Get original field values
    $select = "SELECT * FROM ".$sql_parts['table']." WHERE ".$sql_parts['where'];

    $result_latest = mysql_query($select) or trigger_error(mysql_error()); 

    while($row = mysql_fetch_array($result_latest,MYSQL_ASSOC))
    {
        foreach($row as $k=>$v)
        {
            if ($sql_parts['field'][$k] == $v)
            {

            }
            else 
            {
                $different++;       
            }
        }
    }


return $different;

}

答案 1 :(得分:1)

使用活动记录无法轻松获得此功能,但如果您只支持一种特定的数据库类型(比方说MySQL),您可以随时使用触发器吗?

或者,亚当是对的。如果你有UPDATE的WHERE标准,你可以在执行UPDATE之前选择它,然后循环浏览旧版本和新版本。

这正是Triggers的创作工作,但当然这太过依赖于数据库,这使得这个便携式的yada yada yada变得不那么容易了。

答案 2 :(得分:0)

溶液

操作的指令:

  1. SELECT行,该用户想要修改
  2. UPDATE
  3. 计算所选内容与更新之间的差异
  4. 将差异存储在某处(或邮寄,展示,无论如何)
  5. 简单