web-dev-qa-db-ja.com

行が更新されない可能性があるときに、Codeigniterでdb-> updateが成功したかどうかを確認します

$this->db->affected_rows()を使用して、更新が成功したかどうかを確認しています。ただし、これは、ユーザーが既に保存されている同じデータを入力すると機能しません(実際に更新される列がないため)。私の回避策は、保存されたデータを取得し、入力されたデータと比較し、異なる場合は更新し、同じ場合はNO_CHANGE定数を返すことです。 JSONデータでは、追加の解析ステップがあります。

更新にエラーがなかったことを確認する簡単な方法はありますか?たとえば、保存されたデータを事前に取得する必要がないものは何ですか?

24

正しく理解できれば、トランザクションを使用して、更新でエラーが発生しなかったことを確認できます。

$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エラーがなかったことを検証するだけです。

詳細情報へのリンクはこちら Code Igniter Active Record Transaction

42
user2844810

Mirov codeigniterを使用している場合、データは入力フィールドの値に何らかの変更がある場合にのみ更新され、$this->db->affected_rows()は0より大きい値を返します。

2つのフィールドnameemailがあるとします。フィールドを変更せずにフォームを送信しようとすると、$this->db->affected_rows()は0を返し、そうでない場合は1を返します。

より良いアプローチは使用することです

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

私の「回避策」は非常に簡単です-always updatedフィールドを含めることです。たとえば、フィールドがあり、日付と時刻の値を秒で更新する場合、他の更新値が同じであっても、日付と時刻の秒は常に異なります。

ボーナスは、最後の更新が行われた日付のdbレコードに日付があることです。

4
cartalot

なぜこれだけを使用できないのかわかりません:

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