Chèn WPDB hoặc nếu tồn tại Cập nhật


21

Tôi không quen với WPDB hay SQL nói chung nhưng tôi có một bảng tùy chỉnh cho dự án của mình và tôi đang cố gắng gán một số siêu dữ liệu cho nó. Điều tôi "muốn" xảy ra là nếu một hàng tồn tại, hãy cập nhật nó và nếu không chèn nó. Tôi đã đọc cả Chèn và Cập nhật trong Codex WPDB nhưng không thực sự gặp phải tình huống "hoặc hoặc". Tôi nghĩ rằng tôi có thể làm việc với bản cập nhật, vì vậy mã của tôi cho đến nay trông như thế này:

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

WordPress có bất cứ thứ gì như "IF tồn tại Cập nhật, ELSE Chèn" hay tôi cần chạy SQL tùy chỉnh để đạt được điều này hay tôi cần truy vấn cơ sở dữ liệu trước để xem ID có tồn tại trong bảng của tôi không. nó hay chèn nó?

Câu trả lời:


23

Đầu tiên, bạn đang sử dụng preparekhông chính xác. Bạn dường như có $wpdb->updatenhững lý lẽ được gói gọn trong $wpdb->prepaređó. Điều đó sẽ không làm việc. Trong thực tế, bạn đang truyền updatemột đối số duy nhất-- đầu ra của prepare. Hãy thử một cái gì đó đơn giản như sau và bạn sẽ thấy tại sao nó không hoạt động:

$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()chạy preparecho bạn .

Thứ hai, nếu đây là tôi, tôi bỏ qua chức năng trợ giúp phình to và viết một ON DUPLICATE KEY UPDATEtruy vấn thích hợp :

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

Điều này giả định rằng đó post_idlà một UNIQUEchỉ số hoặcPRIMARY KEY . Nếu cấu trúc bảng của bạn là những gì tôi nghĩ, hãy để cơ sở dữ liệu xử lý nó.


Điều này cực kỳ hữu ích ... Cảm ơn bạn đã dành thời gian cho s_ha_dum!
Jake

Chuẩn bị trả về false cho tôi - không có lỗi db nào khác. Nếu chạy truy vấn thủ công trong phpmyadmin, nó hoạt động như mong đợi. Cũng kiểm tra xem các biến là những gì họ nên được .. Bất kỳ ý tưởng?
đào tạo

1
Điều gì xảy ra nếu post_id không phải là KHÓA CHÍNH?
Mike Kormendy

18

Các bạn đã thử $wpdb->replace. Theo WP Codex:

Thay thế một hàng trong một bảng nếu nó tồn tại hoặc chèn một hàng mới trong một bảng nếu hàng đó chưa tồn tại.

Tôi đã thử bản thân mình trong một số plugin và nó hoạt động khi cố gắng tránh các lỗi trùng lặp ID duy nhất, v.v.

Thêm thông tin trong bộ luật


Điều này làm việc cho tôi trong khi truy vấn tùy chỉnh không - cảm ơn vì đã đề cập thay thế ()
đào tạo vào

Đây là câu trả lời chính xác cho câu hỏi.
Tyler Jones

6
điều đáng chú ý $wpdb->replacelà ghi đè phá hủy toàn bộ hồ sơ, trong khi $wpdb->updatechỉ cập nhật các trường cụ thể có trong $datamảng
MatthewLee

0

Bạn nên kiểm tra xem hàng tồn tại trước.

Rất có thể bạn sẽ muốn thử lấy ID hoặc khóa chính cho hàng bạn đang cố cập nhật, sau đó $wpdb->updatenếu nó không hoặc $wpdb->insertcủa nó thì không


14
Một ví dụ về cách kiểm tra xem ID hoặc khóa chính có thực sự làm cho câu trả lời này hữu ích không. Điều này gần giống như nhắc lại câu hỏi.
Jake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.