Ik denk dat het de moeite waard is om te veranderen - maar waarschijnlijk niet de moeite waard om een selectie uit te voeren voor het invoegen.
Ik werk alleen de velden bij die zijn gewijzigd, het maakt deel uit van de werking van mijn DbEntity-klasse die een activerecord-patroon volgt. Het kost weinig extra om dit te doen omdat ik het huidige record en de originele records bewaar - gewoon kopiëren wanneer een record wordt geladen.
Redenen zijn beknoptheid - niet echt prestaties. U kunt ook controleren op gelijktijdige wijziging door een waar-clausule toe te voegen aan de oude waarde van de bijgewerkte velden en de juiste fout te genereren.
In de schrijf-/updatemethode:
$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 de laadmethode
$this->orig_record = Array();
foreach ($this->record as $key => $value)
$this->orig_record[$key] = $value;