web-dev-qa-db-ja.com

$ wpdb-> ON DUPLICATE KEY UPDATEで準備する

$ wpdb Codexページから this code を取り出し、既存のInsertクエリを変更しました。

$table = $wpdb->prefix . 'user_req';

$post_id = explode('_', $_POST['post_id']);
$user_id = $_POST['user_id'];
$wpdb->insert( 
        $table,
        array(
            'user_id' => $user_id,
            'post_id' => $post_id[1]
        ),
        array( 
            '%d',
            '%d'
        )
    );

に:

$wpdb->query( $wpdb->prepare( 
            "
                INSERT INTO {$wpdb->prefix}user_req
                ( user_id, post_id )
                VALUES ( %d, %d )
                ON DUPLICATE KEY UPDATE
                user_id = VALUES(user_id), post_id = VALUES(post_id)
            ", 
            $user_id, 
            $post_id[1]
        ) );

私はデータベースへの重複エントリを防ぐ必要があるからです。しかし、挿入クエリが正しく機能している間は、重複エントリがデータベースに入力されています。 ON DUPLICATE KEY UPDATE部分を追加するために、私は別のスレッドで s_ha_dumのAnswer に従いました。

何がおかしいのですか?

1
Mayeenul Islam

それは私のせいです。 @ Ottoのコメントの後に解決策を得た:

あなたは実際にここに重複したキーを持っていますか? user_reqの構造やキーとインデックスは何ですか?

これが私のSQLクエリがどうあるべきかです:

INSERT INTO {$wpdb->prefix}user_req
                ( user_id, post_id )
                VALUES ( %d, %d )
                WHERE NOT EXISTS (
                  SELECT * FROM
                  {$wpdb->prefix}user_req.user_id = user_id
                  AND
                  {$wpdb->prefix}user_req.post_id = post_id
                )

今すぐ修正しました。 Ottoに感謝します。

更新

私が言ったけれども、それは解決された、しかし実際には、それはそうではない。どういうわけかコードがうまくいっておらず、データを挿入することすらできませんでした( 詳細はこちら )。それで、私が他の人から得た知識と、そして私の同僚のアリフル・ハケ氏の助けを借りて、私はそれを2つの異なるけれども連動した質問でしました:

    $alreadyGot = $wpdb->get_results(
                        "SELECT
                        COUNT(*) AS TOTALCOUNT
                        FROM {$table}
                        WHERE ( user_id = $user_id AND post_id = $post_id[1] )
                            AND ( order_id = '' )"
                    );

    $count = $alreadyGot[0]->TOTALCOUNT; //if there's any duplicate, it'd return 1

    // if the count return 1, do nothing, but else insert the data
    if( $count > 0 ) {
        //do nothing
    } else {
        $wpdb->insert( 
            $table,
            array(
                'user_id' => $user_id,
                'post_id' => $post_id[1]
            )
        );
    }
0
Mayeenul Islam