$wpdb->在重复密钥更新时使用准备

时间:2014-04-20 作者:Mayeenul Islam

我只是this code 从$wpdb Codex页,并修改了我现有的插入查询:

$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]
        ) );
因为我需要prevent the duplicate entries 进入数据库。但是,当插入查询正常运行时,重复条目仍会进入数据库。添加ON DUPLICATE KEY UPDATE 部分,我按照s_ha_dum\'s Answer 在另一个线程上。

我做错了什么?

1 个回复
最合适的回答,由SO网友:Mayeenul Islam 整理而成

这是我的错。在@Otto的评论后得到了解决方案:

你这里真的有重复的钥匙吗?user\\u 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
                )
现已修复。多亏了奥托。

更新尽管我说过,它已经解决了,但实际上,它还没有解决。代码不知何故无法工作,甚至无法插入数据(Details here). 因此,在我从其他人那里获得的知识和我的同事阿里夫·哈克先生的帮助下,我提出了两个不同但相互关联的问题:

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

结束