我想做什么 我希望能够将记录插入到我的自定义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
查询(如果不存在)。这似乎很高昂。
任何想法都非常感激。
答案 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'
)
);
}
}
?>