WPDB Insertまたは存在する場合は更新


21

私はWPDBやSQL全般に精通しているわけではありませんが、プロジェクト用のカスタムテーブルがあり、それにメタデータを割り当てようとしています。私が「したい」ことは、行が存在する場合、更新し、挿入しない場合です。WPDB CodexでInsertとUpdateの両方を読みましたが、どちらも「どちらか」の状況にはなりませんでした。私はアップデートで作業できると思ったので、これまでのコードは次のようになります:

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

WordPressには「IF exists Update、ELSE Insert」のようなものがありますか、これを実現するためにカスタムSQLを実行する必要がありますか、またはテーブルにIDが存在するかどうかを確認するために最初にデータベースを照会する必要がありますか?それかそれを挿入しますか?

回答:


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_idUNIQUEインデックスまたはであるPRIMARY KEYことを前提としています。テーブル構造が私が考えているものである場合、データベースに処理させます。


これはめちゃくちゃ便利でした... s_ha_dumをありがとうございました!
ジェイク14

Prepareはfalseを返します-他のdbエラーはありません。phpmyadminでクエリを手動で実行すると、期待どおりに機能します。また、変数が本来あるべきものであることを確認しました。
-trainoasis

1
post_idがプライマリキーでない場合はどうなりますか?
マイクコルメンディ

18

試し$wpdb->replaceましたか?WP Codexによると:

テーブル内の行が存在する場合はそれを置換するか、行がまだ存在しない場合はテーブルに新しい行を挿入します。

私はいくつかのプラグインで試してみましたが、一意のIDの重複エラーなどを回避しようとすると機能します。

コーデックスの詳細


これは私にとってはうまく
いき

これは質問に対する正しい答えです。
タイラージョーンズ

6
それは価値それが指摘され$wpdb->replace、一方、レコード全体の破壊的な上書きである$wpdb->updateのみに含まれる特定のフィールド更新$dataアレイ
MatthewLee

0

最初に行が存在するかどうかを確認する必要があります。

ほとんどの場合、あなたが、その後、IDまたはアップデートしようとしている行の主キーを取得しようとしたいと思う$wpdb->updateそれがない場合、または$wpdb->insertそれをしません


14
IDまたは主キーが存在するかどうかを確認する方法の例は、これが本当に役立つ答えになるでしょう。これはほとんど質問を繰り返すようなものです。
ジェイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.