I think this is worth changing, but you probably shouldn't make a choice before inserting.
I am only updating the fields that have been changed, this is part of the operation of my DbEntity class that follows the activerecord pattern. It costs a little more to do this because I keep the current recording and the original recordings - just copying when loading the recording.
Reasons - brevity - not very high performance. You can also check concurrent modification by adding a where clause to the old value of the updated fields and throwing the corresponding error.
In the write / update method:
$s1 = ""; foreach ($this->record as $key => $value) { // only update fields that have been changed if ($value != $this->orig_record[$key]) { $s1 .= $comma."`$key`='".mysql_real_escape_string($value)."'"; $comma = ", "; } } $query = "UPDATE ".$this->table." SET $s1 where {$this->id_field}='".$this->get_keyfield()."'"; $query .= $this->extra_sql_update; mysql_query($query); $ar = mysql_affected_rows(); // // the number of affected rows is actually those changed by the update operation, which will // either be zero, or 1. If the query affects more than one row then we have a problem. if ($ar < 0 || $ar > 1) { cbf_error("cbf_dbentity: {$this->table} :: only one row (not $ar) must be affected by an insert operation. $query", E_USER_ERROR); } else { $new_id = $this->get_keyfield(); GlobalEventBus::notify_all(new AuditLogSQL($this->table, "update", $query)); } $this->orig_record = Array(); foreach ($this->record as $key => $value) $this->orig_record[$key] = $value; // // sanity check - ensure that what we have just written is actually there. $this->load($new_id); foreach ($this->orig_record as $key => $value) if (trim($this->record[$key]) != trim($value) && (!$this->record[$key] == "0" && $value="")) cbf_error("cbf_dbentity: {$this->table} :: record differs during write after reload: field $key was \"$value\", after write it is now \"". $this->record[$key]."\"",E_USER_ERROR);
In boot mode
$this->orig_record = Array(); foreach ($this->record as $key => $value) $this->orig_record[$key] = $value;
Richard Harrison
source share