drupal_write_record
includes/common.inc, строка 3354
- Версии
- 6
drupal_write_record($table, &$object, $update = array())
Сохраняет запись в базу данных согласно схеме.
Для попущенных параметров заполняются значения по умолчанию, и типы 'serial'
(автоматический инкремент) заполняются ID.
Параметры
$table
Имя таблицы; должно существовать в схеме API.
$object
Объект для записи. Согласно схеме, по умолчанию может быть указан объект, либо ID для типа 'serial'
. Могут быть переданы как тип массив, так и объект.
$update
Если производится обновление, то задает имена полей для основных ключей. Вызывающая функция должна сама "знать", существует ли уже запись в базе для данного объекта. Если задан только один ключ, то вы можете передать простую строку.
Возвращаемое значение
При невозможности создать запись будет возвращено FALSE
. Иначе возвращается SAVED_NEW или
SAVED_UPDATED, в зависимости от выполненной операции. Параметр $object
содержит значения для полей 'serial'
, определяемых параметром $table
. Например, $object
->nid будет записано после вставки новой ноды.
Связанные темы
Код
<?php
function drupal_write_record($table, &$object, $update = array()) {
// Standardize $update to an array.
if (is_string($update)) {
$update = array($update);
}
$schema = drupal_get_schema($table);
if (empty($schema)) {
return FALSE;
}
// Convert to an object if needed.
if (is_array($object)) {
$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.
unset($object->$field);
}
// Build arrays for the fields, placeholders, and values in our query.
if (isset($object->$field)) {
$fields[] = $field;
$placeholders[] = db_type_placeholder($info['type']);
if (empty($info['serialize'])) {
$values[] = $object->$field;
}
else {
$values[] = serialize($object->$field);
}
}
}
// Build the SQL.
$query = '';
if (!count($update)) {
$query = "INSERT INTO {". $table ."} (". implode(', ', $fields) .') VALUES ('. implode(', ', $placeholders) .')';
$return = SAVED_NEW;
}
else {
$query = '';
foreach ($fields as $id => $field) {
if ($query) {
$query .= ', ';
}
$query .= $field .' = '. $placeholders[$id];
}
foreach ($update as $key){
$conditions[] = "$key = ". db_type_placeholder($schema['fields'][$key]['type']);
$values[] = $object->$key;
}
$query = "UPDATE {". $table ."} SET $query WHERE ". implode(' AND ', $conditions);
$return = SAVED_UPDATED;
}
// Execute the SQL.
if (db_query($query, $values)) {
if ($serials) {
// Get last insert ids and fill them in.
foreach ($serials as $field) {
$object->$field = db_last_insert_id($table, $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;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии