Sisipkan WPDB atau jika ada Perbarui

21

Saya tidak gila terbiasa dengan WPDB atau SQL pada umumnya, tetapi saya memiliki tabel khusus untuk proyek saya dan saya mencoba untuk menetapkan beberapa metadata untuk itu. Apa yang saya "ingin" terjadi adalah jika ada baris, perbarui dan jika tidak, sisipkan. Saya sudah membaca kedua Masukkan dan Perbarui dalam Codex WPDB tetapi tidak benar-benar pergi ke situasi "baik atau". Saya pikir saya bisa bekerja dengan pembaruan, jadi kode saya sejauh ini terlihat seperti ini:

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

Apakah WordPress memiliki sesuatu seperti "JIKA ada Pembaruan, Sisipan LAIN", atau apakah saya perlu menjalankan SQL kustom untuk mencapai ini, atau apakah saya perlu query database terlebih dahulu untuk melihat apakah ID ada di meja saya LALU memutuskan apakah akan memperbarui atau memasukkannya?

Howdy_McGee
sumber

Jawaban:

23

Pertama, Anda menggunakan preparesalah. Anda sepertinya punya $wpdb->updateargumen $wpdb->prepareseperti itu. Itu tidak akan berhasil. Akibatnya, Anda memberikan updateargumen tunggal - output dari prepare. Coba sesuatu yang sederhana seperti berikut ini dan Anda akan melihat mengapa itu tidak berhasil:

$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)
  )
);

Dan $wpdb->update()lari prepareuntukmu .

Kedua, jika ini saya, saya melewatkan fungsi helper mengasapi dan menulis ON DUPLICATE KEY UPDATEkueri yang tepat :

$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);

Ini mengasumsikan bahwa itu post_idadalah UNIQUEindeks atauPRIMARY KEY . Jika struktur tabel Anda adalah apa yang saya pikirkan, biarkan database yang menanganinya.

s_ha_dum
sumber
Ini sangat berguna ... Terima kasih atas waktu Anda s_ha_dum!
Jake
Siapkan pengembalian salah untuk saya - tidak ada kesalahan db lainnya. Jika menjalankan kueri secara manual di phpmyadmin, ia berfungsi seperti yang diharapkan. Juga memeriksa bahwa variabel adalah apa yang seharusnya. Ada ide?
trainoasis
1
Bagaimana jika post_id bukan KUNCI UTAMA?
Mike Kormendy
18

Sudahkah Anda mencoba $wpdb->replace. Menurut WP Codex:

Ganti baris dalam tabel jika ada atau masukkan baris baru dalam tabel jika baris belum ada.

Saya telah mencoba sendiri di beberapa plugin dan berhasil ketika mencoba untuk menghindari kesalahan duplikasi ID unik, dll.

Info lebih lanjut dalam naskah kuno

e-crespo
sumber
Ini bekerja untuk saya sementara permintaan khusus tidak - terima kasih untuk menyebutkan ganti ()
trainoasis
Ini adalah jawaban yang benar untuk pertanyaan itu.
Tyler Jones
6
Perlu dicatat bahwa $wpdb->replaceini adalah penulisan ulang yang merusak dari seluruh catatan, sedangkan $wpdb->updatehanya pembaruan bidang spesifik yang termasuk dalam $dataarray
MatthewLee
0

Anda harus memeriksa apakah baris ada terlebih dahulu.

Kemungkinan besar Anda ingin mencoba untuk mendapatkan ID atau kunci utama untuk baris yang Anda coba perbarui, maka $wpdb->updatejika itu atau $wpdb->inserttidak.

felipelavinz
sumber
14
Contoh cara memeriksa apakah ID atau kunci utama ada akan benar-benar menjadikan ini jawaban yang berguna. Ini hampir seperti mengulangi pertanyaannya.
Jake