如果使用$ wpdb->插入时存在记录,请不要插入并且不要丢失

时间:2018-01-27 12:40:34

标签: php mysql wordpress

我想做什么 我希望能够将记录插入到我的自定义Wordpress表中,但只能为每个唯一的公司名称添加一行。

如果尝试输入具有相同公司名称的第二条记录,我希望脚本优雅地退出(即不返回错误)。

我做了什么

我正在使用Wordpress的$wpdb->insert函数将新行插入到一个非常基本的3列表中,看起来有点像这样:

  

id |公司|名称

我正在使用此代码:

foreach ( $this->tlds_to_insert as $tld_to_insert ) {

            $wpdb->insert(
            'wp2_bnfo_allowedtlds',
                array(
                    'company'=> $this->member_company,
                    'name' => $tld_to_insert,
                ),
                array(
                    '%s',
                    '%s'
                )
            );

    }

表格设置

我已将ID(主键)和公司设置为唯一索引,因为我只希望每家公司有一条唯一记录。

我正在努力解决

我面临的问题是,如果我尝试输入重复的条目,它确实会失败(这很好),但我收到错误通知,说这是重复的,我想避免这个失败通知。

研究我已经阅读了许多StackOverflow Posts但这些往往与在Wordpress之外编写自定义SQL的人有关,我不确定是否/如何使用此代码。< / p>

到目前为止我最好的猜测:我可以创建$wpdb->get_results查询以查看该值是否存在,然后仅运行$wpdb->insert查询(如果不存在)。这似乎很高昂。

任何想法都非常感激。

2 个答案:

答案 0 :(得分:1)

检查记录是否已经存在是正确的行为,但除非您锁定表格,否则它会对竞争条件开放(例如,两个脚本同时进行检查,看到它不存在,以及然后插入)。

$wpdb提供replace方法,应该有帮助,但如果公司已经在那里,我会更改名称,我不知道你是不是很好那个。

您也可以使用INSERT ... ON DUPLICATE KEY UPDATE编写自己的查询,并使用原始SQL,如this answer中所述。

答案 1 :(得分:1)

在插入之前,您必须检查表中是否已存在该名称 所以下面的代码可以帮助您检查

<?php
function checkExist($name)
    {
        global $wpdb;
        $rowcount = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->wp2_bnfo_allowedtlds WHERE name = '$name' ");
        return $rowcount;
    }

    foreach ( $this->tlds_to_insert as $tld_to_insert ) {

                if(checkExist($tld_to_insert) > 0)
                {
                continue;
                }
                else
                {
                    $wpdb->insert(
                    'wp2_bnfo_allowedtlds',
                        array(
                            'company'=> $this->member_company,
                            'name' => $tld_to_insert,
                        ),
                        array(
                            '%s',
                            '%s'
                        )
                    );
                }

        }
?>