public function update($table, $fieldvalues, $keyfields)
{
ksort($fieldvalues);
ksort($keyfields);
$keyfieldvalues = array();
foreach ($keyfields as $keyfield => $keyvalue) {
if (is_numeric($keyfield)) {
// if the key is numeric, assume we were handed a simple list of fields that are keys and fetch its value from $fieldvalues
$keyfieldvalues[$keyvalue] = $fieldvalues[$keyvalue];
} else {
// otherwise we were handed a key => value pair, use it as-is
$keyfieldvalues[$keyfield] = $keyvalue;
}
}
if ($this->exists($table, $keyfieldvalues)) {
$qry = "UPDATE {$table} SET";
$values = array();
$comma = '';
foreach ($fieldvalues as $fieldname => $fieldvalue) {
$qry .= $comma . " {$fieldname} = ?";
$values[] = $fieldvalue;
$comma = ' ,';
}
$qry .= ' WHERE 1=1 ';
foreach ($keyfieldvalues as $keyfield => $keyvalue) {
$qry .= "AND {$keyfield} = ? ";
$values[] = $keyvalue;
}
return $this->query($qry, $values);
} else {
// We want the keyfieldvalues to be included in
// the insert, with fieldvalues taking precedence.
$fieldvalues = $fieldvalues + $keyfieldvalues;
return $this->insert($table, $fieldvalues);
}
}