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!
Джейк

Підготовка повертає помилкові для мене - ніяких інших db помилок. Якщо запуск запиту виконується вручну в phpmyadmin, він працює як очікувалося. Також перевірили, що змінні - якими вони повинні бути. Будь-які ідеї?
траїноз

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.