Подтвердить что ты не робот

Проверьте, успешно ли db-> update с Codeigniter, когда потенциально не обновляются строки

Я использовал $this->db->affected_rows(), чтобы проверить, были ли обновления успешными. Но это не работает, когда пользователь вводит одни и те же данные, которые уже хранятся (поскольку ни один столбец фактически не обновляется). Мое обходное решение заключалось в том, чтобы получить сохраненные данные, сравнить с введенными данными, обновить, если они разные, вернуть константу NO_CHANGE, если она та же. С данными JSON существует дополнительный шаг синтаксического анализа.

Есть ли более простой способ проверить, не возникла ли ошибка с обновлением? Как и в, что-то, что не требует предварительного хранения сохраненных данных?

4b9b3361

Ответ 1

Если я правильно понимаю, вы можете использовать транзакции, чтобы убедиться в отсутствии ошибки в обновлении:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
    // generate an error... or use the log_message() function to log your error
}

Просто помните, что это только подтверждает, что во всех запросах внутри транзакции не было ошибок SQL.

Здесь ссылка для дополнительной информации Активная транзакция записи кода Igniter

Ответ 2

В дополнение к принятому решению для ответа вы можете развернуть код следующим образом, чтобы отличать результаты affected_rows и trans_status от результатов/ошибок.

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();
// was there any update or error?
if ($this->db->affected_rows() == '1') {
    return TRUE;
} else {
    // any trans error?
    if ($this->db->trans_status() === FALSE) {
        return false;
    }
    return true;
}

Ответ 3

Mirov Когда мы работаем с codeigniter, данные обновляются только при изменении значения входного поля, а затем $this->db->affected_rows() будет возвращать значение больше 0.

Предположим, что у нас есть два поля name и email, если мы попытаемся представить форму без изменения какого-либо поля, тогда $this->db->affected_rows() вернет 0 else, он вернет 1.

поэтому лучше использовать

if($this->db->affected_rows() >=0){
  return true; //add your code here
}else{
  return false; //add your your code here
}

Ответ 4

мой "обходной путь", который довольно прост, - это включить поле, которое всегда обновляется. например, если у вас есть поле и обновить его с указанием даты и времени с секундами - тогда время в секундах всегда будет отличаться, даже если другие значения обновления остаются неизменными.

бонус - у вас есть дата в записи db, когда последнее обновление было выполнено.

Ответ 5

Я не уверен, почему мы не можем просто использовать это:

if ($this->db->update('table',$array) === FALSE){
    // generate an error... or use the log_message() function to log your error
}