Проверьте, успешно ли db-> update с Codeigniter, когда потенциально не обновляются строки
Я использовал $this->db->affected_rows()
, чтобы проверить, были ли обновления успешными. Но это не работает, когда пользователь вводит одни и те же данные, которые уже хранятся (поскольку ни один столбец фактически не обновляется). Мое обходное решение заключалось в том, чтобы получить сохраненные данные, сравнить с введенными данными, обновить, если они разные, вернуть константу NO_CHANGE, если она та же. С данными JSON существует дополнительный шаг синтаксического анализа.
Есть ли более простой способ проверить, не возникла ли ошибка с обновлением? Как и в, что-то, что не требует предварительного хранения сохраненных данных?
Ответы
Ответ 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
}