Codeigniter: Получить затронутые поля в обновлении - PullRequest
2 голосов
/ 04 марта 2010

Есть ли способ узнать, какие поля были изменены после запроса на обновление?

Я хочу отслеживать, какое поле XXX изменено пользователем ... какие-либо способы использования активных записей?

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Мне нужна была именно эта функциональность, поэтому я написал этот код. Возвращает количество полей, которые были затронуты.

ФУНКЦИЯ НАЧИНАЕТСЯ:

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 голос
/ 04 марта 2010

Нет способа использовать активную запись, чтобы получить это легко, но если вы поддерживаете только один конкретный тип базы данных (скажем, MySQL), вы всегда можете использовать триггеры?

Или Адам прав. Если у вас есть критерий WHERE для вашего ОБНОВЛЕНИЯ, вы можете ВЫБРАТЬ его перед выполнением ОБНОВЛЕНИЯ, а затем сравнить все старые и новые версии.

Это именно тот тип работы, для которого были созданы триггеры, но, конечно, он слишком полагается на БД, что делает его менее переносимым yada yada yada.

0 голосов
/ 04 марта 2010

решение

Инструкция:

  1. SELECT строка, которую пользователь хочет изменить
  2. UPDATE это
  3. Вычислить различия между выбранным и обновить его
  4. Сохраните различия где-нибудь (или отправьте по почте, покажите, что угодно)

простой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...