WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

wpdb::update()publicWP 2.5.0

Обновляет указанные данные в указанной строке таблицы.

Метод включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo'].

НЕ вставляет данные если их нет в БД - только обновляет существующие данные.

Метод класса: wpdb{}

Работает на основе: wpdb::query(), wpdb::process_fields()

Хуков нет.

Возвращает

int|false.

  • число - сколько строк было обработано
  • 0 - запрос был выполнен корректно, но ни одна строка не была обработана. Если в БД уже есть данные и вы пытаетесь обновить, указав точно такие же данные, то wpdb::update() вернет 0.
  • false - запрос провалился или ошибка запроса.

Так как возвращается 0, если никакие поля не были обновлены (изменены), но запрос был выполнен корректно, проверку результата запроса на ошибку нужно делать с учетом типа возвращаемых данных $res === false.

Использование

global $wpdb;
$wpdb->update( $table, $data, $where, $format, $where_format );
$table(строка) (обязательный)
Название таблицы, данные в которой нужно обновить.
$data(массив) (обязательный)

Данные, которые нужно обновить в формате [ 'название колонки' => 'новое значение' ].

Если в значении указать NULL, то в значение будет установлено в NULL, соответствующий формат при этом игнорируется.

$where(массив) (обязательный)
Ассоциированный массив с условием выборки строк таблицы данные в которых нужно обновить (SQL WHERE). Формат массива: [ 'название колонки' => 'чему равно' ]. Если указать несколько элементов в массиве, то указанные условия будут объедены через AND - т.е. должны будут совпасть все условия, а НЕ какое-либо одно. Если в значении указать NULL то в запросе получим сравнение IS NULL, соответствующий формат при этом игнорируется.
$format(массив/строка)

Массив форматов данных которые будут ассоциированы с указанными значениями в параметре $data. Если указана строка, то она (формат) будет ассоциирован со всеми данными. При указании формата, WordPress переводит переданные данные в указанный формат перед созданием запроса. Возможные форматы:

  • %s - строка
  • %d - целое число
  • %f - дробное число

Если не указать, то для всех значений $data будет указан формат строка, если иное не указано в свойстве wpdb::$field_types.
По умолчанию: null

$where_format(массив/строка)
Тоже самое что и $format, только для $where данных.
По умолчанию: null

Примеры

0

#1 Обновим строку ID которой равен 1

Значение первой колонки строка, значение второй колонки число:

$wpdb->update( 'table',
	[ 'column1' => 'value1', 'column2' => $_GET['val'] ],
	[ 'ID' => 1 ]
);
0

#2 Тоже самое с указанием типов передаваемых данных

$wpdb->update( 'table',
	[ 'column1' => 'value1', 'column2' => $_GET['val'] ],
	[ 'ID' => 1 ],
	[ '%s', '%d' ],
	[ '%d' ]
);
0

#3 Demo

$wpdb->update( 'table', [ 'column' => 'foo', 'field' => 'bar' ], [ 'ID' => 1 ] );
$wpdb->update( 'table', [ 'column' => 'foo', 'field' => 1337 ], [ 'ID' => 1 ], [ '%s', '%d' ], [ '%d' ] );

Заметки

Список изменений

С версии 2.5.0 Введена.

Код wpdb::update() WP 6.4.3

public function update( $table, $data, $where, $format = null, $where_format = null ) {
	if ( ! is_array( $data ) || ! is_array( $where ) ) {
		return false;
	}

	$data = $this->process_fields( $table, $data, $format );
	if ( false === $data ) {
		return false;
	}
	$where = $this->process_fields( $table, $where, $where_format );
	if ( false === $where ) {
		return false;
	}

	$fields     = array();
	$conditions = array();
	$values     = array();
	foreach ( $data as $field => $value ) {
		if ( is_null( $value['value'] ) ) {
			$fields[] = "`$field` = NULL";
			continue;
		}

		$fields[] = "`$field` = " . $value['format'];
		$values[] = $value['value'];
	}
	foreach ( $where as $field => $value ) {
		if ( is_null( $value['value'] ) ) {
			$conditions[] = "`$field` IS NULL";
			continue;
		}

		$conditions[] = "`$field` = " . $value['format'];
		$values[]     = $value['value'];
	}

	$fields     = implode( ', ', $fields );
	$conditions = implode( ' AND ', $conditions );

	$sql = "UPDATE `$table` SET $fields WHERE $conditions";

	$this->check_current_query = false;
	return $this->query( $this->prepare( $sql, $values ) );
}
4 комментария
    Войти