WPDB Insert หรือถ้ามีอยู่ Update


21

ฉันไม่คุ้นเคยกับ WPDB หรือ SQL ทั่วไป แต่ฉันมีตารางที่กำหนดเองสำหรับโครงการของฉันและฉันพยายามกำหนดข้อมูลเมตาให้กับมัน สิ่งที่ฉันต้องการ "เกิดขึ้น" คือถ้ามีแถวอยู่ให้อัปเดตและไม่แทรก ฉันอ่านทั้งการแทรกและการปรับปรุงใน WPDB Codex แต่ไม่ได้เข้าไปในสถานการณ์ "อย่างใดอย่างหนึ่งหรือ" ฉันคิดว่าฉันสามารถทำงานกับการอัปเดตได้ดังนั้นโค้ดของฉันจะมีลักษณะดังนี้:

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

WordPress มีอะไรเช่น "IF อยู่ Update, ELSE แทรก" หรือฉันจำเป็นต้องเรียกใช้ SQL ที่กำหนดเองเพื่อให้บรรลุนี้หรือฉันต้องค้นหาฐานข้อมูลก่อนเพื่อดูว่ามี ID อยู่ในตารางของฉันหรือไม่จากนั้นตัดสินใจว่าจะอัปเดต มันหรือใส่มัน?

คำตอบ:


23

ก่อนอื่นคุณใช้prepareอย่างไม่ถูกต้อง คุณดูเหมือนจะมี$wpdb->updateข้อโต้แย้งห่อหุ้ม$wpdb->prepareเช่นนั้น นั่นไม่ได้ผล ผลคุณผ่านupdateเดียว argument-- 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สำหรับคุณ

ประการที่สองถ้าเป็นฉันฉันข้ามฟังก์ชั่นตัวช่วย bloat และเขียน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!
Jake

เตรียมส่งคืนเท็จสำหรับฉัน - ไม่มีข้อผิดพลาด db อื่น ๆ หากเรียกใช้แบบสอบถามด้วยตนเองใน phpmyadmin จะทำงานได้ตามที่คาดไว้ ตรวจสอบด้วยว่าตัวแปรคือสิ่งที่ควรเป็น .. ความคิดใด ๆ
trainoasis

1
จะเกิดอะไรขึ้นถ้า post_id ไม่ใช่คีย์หลัก
Mike Kormendy

18

คุณเคยลอง$wpdb->replaceไหม ตามที่ WP Codex:

แทนที่แถวในตารางหากมีอยู่หรือแทรกแถวใหม่ในตารางหากยังไม่มีแถว

ฉันลองตัวเองในปลั๊กอินบางตัวแล้วก็ทำงานเมื่อพยายามหลีกเลี่ยงข้อผิดพลาดการทำซ้ำรหัสที่ไม่ซ้ำกัน ฯลฯ

ข้อมูลเพิ่มเติมใน codex


สิ่งนี้ใช้ได้สำหรับฉันในขณะที่ข้อความค้นหาที่กำหนดเองไม่ได้ - ขอบคุณที่กล่าวถึง replace ()
trainoasis

นี่คือคำตอบที่ถูกต้องสำหรับคำถาม
Tyler Jones

6
เป็นที่น่าสังเกตว่า$wpdb->replaceเป็นการเขียนทับที่ทำลายล้างของเรคคอร์ดทั้งหมดในขณะที่$wpdb->updateอัพเดตเฉพาะฟิลด์ที่รวมอยู่ใน$dataอา
เรย์เท่านั้น

0

คุณควรตรวจสอบว่าแถวนั้นมีอยู่ก่อนหรือไม่

เป็นไปได้ว่าคุณต้องการลองรับ ID หรือคีย์หลักสำหรับแถวที่คุณพยายามอัปเดต$wpdb->updateหากเป็นเช่นนั้นหรือ$wpdb->insertเป็นไปไม่ได้


14
ตัวอย่างของวิธีการตรวจสอบว่ามี ID หรือคีย์หลักอยู่หรือไม่จะทำให้คำตอบนี้มีประโยชน์หรือไม่ นี้เป็นเกือบเหมือนย้ำคำถาม
Jake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.