WPDB Вставить или, если существует, Обновить


21

Я не очень знаком с WPDB или SQL в целом, но у меня есть настраиваемая таблица для моего проекта, и я пытаюсь присвоить ей некоторые метаданные. То, что я «хотел бы», - это если строка существует, обновите ее, а если не вставьте. Я прочитал «Вставить и обновить» в Кодексе WPDB, но ни один из них не попал в ситуацию «или» или «. Я думал, что смогу работать с обновлением, поэтому мой код выглядит так:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

Есть ли в WordPress что-то вроде «если существует обновление, вставка ELSE», или мне нужно запустить собственный SQL для этого, или мне сначала нужно запросить базу данных, чтобы узнать, существует ли идентификатор в моей таблице, ТОГДА решите, нужно ли обновлять это или вставить это?

Ответы:


23

Во-первых, вы используете prepareнеправильно. Похоже, у вас есть $wpdb->updateаргументы, обернутые $wpdb->prepareтаким образом. Это не сработает. По сути, вы передаете updateодин аргумент - вывод prepare. Попробуйте что-нибудь простое, например, следующее, и вы поймете, почему это не сработает:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

И $wpdb->update()бежит prepareза тобой .

Во-вторых, если бы это был я, я пропускаю функцию-помощник и напишу правильный ON DUPLICATE KEY UPDATEзапрос:

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);

Это предполагает, что post_idэто UNIQUEиндекс илиPRIMARY KEY . Если ваша структура таблицы такая, как я думаю, пусть база данных справится с этим.


Это было безумно полезно ... Спасибо за ваше время s_ha_dum!
— Джейк

Prepare возвращает false для меня - никаких других ошибок БД. Если запрос выполняется вручную в phpmyadmin, он работает как положено. Также проверил, что переменные такие, какими они должны быть. Есть идеи?
— trainoasis

1
Что если post_id не ПЕРВИЧНЫЙ КЛЮЧ?
— Майк Корменди

18

Вы пробовали $wpdb->replace. Согласно WP Codex:

Замените строку в таблице, если она существует, или вставьте новую строку в таблицу, если строка еще не существовала.

Я пробовал себя в некоторых плагинах, и он работает, пытаясь избежать ошибок дублирования уникальных идентификаторов и т. Д.

Больше информации в кодексе


Это сработало для меня, в то время как пользовательский запрос не
— помог

Это правильный ответ на вопрос.
— Тайлер Джонс

6
Стоит отметить, что $wpdb->replaceэто разрушительная перезапись всей записи, тогда как $wpdb->updateобновляются только определенные поля, включенные в $dataмассив
— MatthewLee

0

Вы должны проверить, существует ли строка в первую очередь.

Скорее всего, вы захотите получить идентификатор или первичный ключ для строки, которую вы пытаетесь обновить, тогда, $wpdb->updateесли это произойдет или $wpdb->insertнет


14
Пример того, как проверить, существует ли идентификатор или первичный ключ, действительно сделал бы этот ответ полезным. Это почти как повторение вопроса.
— Джейк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.