Mit dieser schicken Funktion kann man sehr elegant Daten in seiner Datenbank abspeichern ohne den SQL-Code dafür schreiben zu müssen.
Unterstützte Datenbank-Operationen sind INSERT und UPDATE.
Die Datenbank-Tabelle muss ein Primary Key aufweisen, damit man diese Funktion nutzen kann.
Die Schlüssel oder Eigenschaften des Objects bilden dabei immer den Spaltennamen.
Parameter:
$table Der Name der Tabelle, die muss in der Schema-Api vorhanden sein.
$object Das Object was geschrieben werden soll. Das Object ist eine Referenz, die Standardwerte werden wie in der Schema-API entprechend gefüllt, ebenfalls die ID bei Serial Typ(en). Es kann sowohl ein Array als auch ein Object übergeben werden.
$update Wenn dies ein UPDATE ist, müssen hier die Namen der Primary Keys angegeben werden. Ob der Datensatz bereits in der Datenbank vorhanden ist, muss selbst vorher überpüft werden. Wenn es nur 1 Schlüssel gibt, muss nur ein einfach String übergeben werden.
Rückgabe:
Bei einem erfolglosen schreiben des Datensatz, wird FALSE zurückgegeben. Ansonsten SAVED_NEW oder SAVED_UPDATED, abhängig davon, welche Operation durchgeführt wird. Die $opject Parameter enthaltene Werte für alle Serial-Felder, welche durch $table definiert sind. Zum Beispiel, $object->nid wird nach dem einfügen einer Node zur Verfügung stehen.
Beispiel:
$table = 'po_re_importer';
$record = new stdClass;
$record->langcode = $langcode;
$record->importtime = 0;
$record-
>md5hash =
md5_file($file-
>filename);
if (!$result) {
watchdog('locale',
'New translation files from @module module are ready for importing under !url.',
array(
'@module' => $modulename,
'!url' =
> l(t('Po Re-Importer'),
'admin/build/translate/poreimporter'))
);
}
else if ($record->md5hash <> $result->md5hash) {
watchdog('locale',
'Updated translation files from @module module are ready for importing under !url.',
array(
'@module' => $modulename,
'!url' =
> l(t('Po Re-Importer'),
'admin/build/translate/poreimporter'))
);
$record->imported = 0;
}
Code der Funktion:
<?php
// Standardize $update to an array.
$update =
array($update);
}
return FALSE;
}
// Convert to an object if needed.
$object = (object) $object;
$array = TRUE;
}
else {
$array = FALSE;
}
$fields =
$defs =
$values =
$serials =
$placeholders =
array();
// Go through our schema, build SQL, and when inserting, fill in defaults for
// fields that are not set.
foreach ($schema['fields'] as $field => $info) {
// Special case -- skip serial types if we are updating.
if ($info['type'] ==
'serial' && count($update)) {
continue;
}
// For inserts, populate defaults from Schema if not already provided
if (!isset($object-
>$field) && !count($update) && isset($info['default'])) {
$object->$field = $info['default'];
}
// Track serial fields so we can helpfully populate them after the query.
if ($info['type'] == 'serial') {
$serials[] = $field;
// Ignore values for serials when inserting data. Unsupported.
}
// Build arrays for the fields, placeholders, and values in our query.
if (isset($object-
>$field)) {
$fields[] = $field;
if (empty($info['serialize'])) {
$values[] = $object->$field;
}
else {
}
}
}
// Build the SQL.
$query = '';
$query =
"INSERT INTO {".
$table .
"} (".
implode(', ',
$fields) .
') VALUES ('.
implode(', ',
$placeholders) .
')';
}
else {
$query = '';
foreach ($fields as $id => $field) {
if ($query) {
$query .= ', ';
}
$query .= $field .' = '. $placeholders[$id];
}
foreach ($update as $key){
$values[] = $object->$key;
}
$query =
"UPDATE {".
$table .
"} SET $query WHERE ".
implode(' AND ',
$conditions);
}
// Execute the SQL.
if ($serials) {
// Get last insert ids and fill them in.
foreach ($serials as $field) {
}
}
}
else {
$return = FALSE;
}
// If we began with an array, convert back so we don't surprise the caller.
if ($array) {
$object =
(array) $object;
}
return $return;
}
?>