web-dev-qa-db-ja.com

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

私は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を実行する必要がありますか。それを挿入する?

18
Howdy_McGee

まず、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を実行します

次に、これが私の場合、ヘルパー関数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_idUNIQUEインデックスまたはPRIMARY KEY であると仮定します。あなたのテーブル構造が私の考えであるものであれば、データベースにそれを処理させてください。

20
s_ha_dum

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

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

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

コーデックスの詳細情報

16
e-crespo

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

ほとんどの場合、更新しようとしている行のIDまたは主キーを取得して、更新されている場合は$wpdb->update、更新されていない場合は$wpdb->insertを取得します。

0
felipelavinz