WPDB Ekleme veya varsa Güncelleme


21

Ben genel olarak WPDB veya SQL aşina değilim ama benim proje için özel bir tablo var ve buna bazı meta veriler atamaya çalışıyorum. Olmasını istediğim şey bir satır varsa, güncelleyin ve eklemezseniz. WPDB Codex hem Ekle hem de Güncelleme okudum ama ne gerçekten "ya da" bir duruma gitti. Ben güncelleme ile çalışabilir düşündüm, bu yüzden şimdiye kadar benim kod şöyle görünüyor:

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

WordPress "EĞER Güncelleme, ELSE Ekle" gibi bir şey var mı, ya da bunu başarmak için özel SQL çalıştırmam gerekiyor mu, yoksa tablomda bir kimlik olup olmadığını görmek için önce veritabanını sorgulamam gerekiyor mu? ya da tak?

Yanıtlar:


23

İlk olarak, prepareyanlış kullanıyorsunuz . Sen var gibi $wpdb->update'sarılı argümanları s $wpdb->prepareböyle. Bu işe yaramaz. Aslında, updatetek bir argüman geçiyorsunuz - çıktı prepare. Aşağıdaki gibi basit bir şey deneyin ve bunun neden işe yaramadığını göreceksiniz:

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

Ve senin için $wpdb->update()koşarprepare .

İkincisi, bu ben olsaydım, yardımcı fonksiyon şişkinliğini atla ve uygun bir ON DUPLICATE KEY UPDATEsorgu yaz:

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

Bu post_id, bir UNIQUEdizin veyaPRIMARY KEY olduğunu varsayar . Tablonuzun yapısını düşündüğüm şeyse, veritabanının işlemesine izin verin.


Bu delicesine faydalı oldu ... Zaman ayırdığınız için teşekkürler s_ha_dum!
Jake

Hazırlamak benim için yanlış döndürür - başka db hatası yok. Sorguyu phpmyadmin'de manuel olarak çalıştırıyorsanız, beklendiği gibi çalışır. Ayrıca değişkenlerin ne olması gerektiğini kontrol ettiler .. Herhangi bir fikir?
16'da trainoasis

1
Post_id, PRIMARY KEY değilse ne olur?
Mike Kormendy

18

Eğer denedin $wpdb->replace. WP Kodeksi'ne göre:

Varsa tablodaki bir satırı değiştirin veya satır yoksa tabloya yeni bir satır ekleyin.

Bazı eklentiler kendim denedim ve benzersiz kimlikleri çoğaltma hataları, vb önlemek için çalışırken çalışır.

Kodeks'de daha fazla bilgi


Özel sorgu yapmadıysa bu benim için çalıştı - replace ()
trainoasis

Bu sorunun doğru cevabıdır.
Tyler Jones

6
$wpdb->replacekaydın tümünün yıkıcı bir üzerine yazılması olduğunu belirtmek gerekir , oysa $wpdb->updatesadece $datadizide yer alan belirli alanları günceller
MatthewLee

0

Önce satırın mevcut olup olmadığını kontrol etmelisiniz.

Büyük olasılıkla, güncellemeye çalıştığınız satırın kimliğini veya birincil anahtarını almayı denemek isteyeceksiniz, $wpdb->updateeğer yaparsa veya $wpdb->insertyapmıyorsa


14
Kimlik veya birincil anahtarın var olup olmadığını nasıl kontrol edeceğinizin bir örneği, bunu gerçekten yararlı bir cevap haline getirecektir. Bu neredeyse soruyu tekrarlamak gibidir.
Jake
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.