CodeIgniter 删除查询在 foreach 循环中不起作用?
CodeIgniter delete query does not work in foreach loop?
我有以下代码可以删除一周内未验证其电子邮件地址的用户帐户。查询按预期工作,但删除函数只删除了第一条记录,我不明白为什么。 print_r 生成了我预期的完整结果,但删除功能不知何故被忽略了。关于如何删除所有相关记录的任何想法?
public function databaseupdate () //REMOVES ALL UNVERIFIED EMAIL ACCOUNTS OLDER THAN 1 WEEK - REQUIRES MANUAL BUTTON PRESS BY ADMIN
{
$verified = 'no';
$tables = array('register', 'profiles', 'profilesmember');
$deletedate = date('Y-m-d', strtotime('-7 days'));
$this->db->select('email');
$this->db->where('is_email_verified', $verified);
$this->db->where("DATE_FORMAT(created_date,'%Y-%m-%d') <='$deletedate'");
$this->db->from('register');
$query = $this->db->get();
foreach($query->result() as $row)
{
$email = $row->email;
$this->db->where('email', $email);
$this->db->delete($tables);
// print_r($email);
}
}
您正在循环执行 WHERE 语句,正如您所观察到的,它将在第一个实例中起作用,但随后的语句将不起作用,因为您正在添加诸如
之类的 WHERE 语句
循环 1:WHERE email = email1
循环 2:WHERE email = email1 AND email = email2
循环 n:WHERE email = email1 AND email = email2 AND ..... email = emailn
它会继续建设。它的行为与您在上面使用多个 WHERE 语句的查询中使用的行为完全相同。
因此您需要对查询执行重置。
$this->db->reset_query();
所以你的循环可能看起来像...
foreach($query->result() as $row)
{
$this->db->where('email', $row->email);
$this->db->delete($tables);
$this->db->reset_query();
}
那么你会得到你所期待的。
循环 1:WHERE email = email1
循环 2:WHERE email = email2
循环 n: WHERE email = emailn
虽然上述“可行”,但您应该考虑您要在这里实现的目标...
您想创建一个要从多个表中删除的电子邮件列表。
请注意:我们不知道这些表是如何相关的等等,所以请注意留下“孤立”记录的可能性。有很多方法可以解决这个问题,但它不在讨论范围内。
选项 是检查您是否有一些结果,构建 where 查询然后执行删除。所以它只是到数据库的“1 次旅行”,而不是“n 次旅行”。
// Did we get any results to delete?
if($query AND $query->num_rows()) {
foreach($query->result() as $row)
{
// Build the WHERE Statement
$this->db->or_where('email', $row->email);
}
$this->db->delete($tables); // Execute the Delete.
}
因此了解执行此操作的各种方法很重要...即还有其他方法。但是对于这种情况,应该没问题(著名遗言)。
TimBrownlaw 使用 or_where 的回答更进一步:
foreach($query->result() as $row)
{
$this->db->or_where('email', $row->email);
$this->db->delete($tables);
}
我有以下代码可以删除一周内未验证其电子邮件地址的用户帐户。查询按预期工作,但删除函数只删除了第一条记录,我不明白为什么。 print_r 生成了我预期的完整结果,但删除功能不知何故被忽略了。关于如何删除所有相关记录的任何想法?
public function databaseupdate () //REMOVES ALL UNVERIFIED EMAIL ACCOUNTS OLDER THAN 1 WEEK - REQUIRES MANUAL BUTTON PRESS BY ADMIN
{
$verified = 'no';
$tables = array('register', 'profiles', 'profilesmember');
$deletedate = date('Y-m-d', strtotime('-7 days'));
$this->db->select('email');
$this->db->where('is_email_verified', $verified);
$this->db->where("DATE_FORMAT(created_date,'%Y-%m-%d') <='$deletedate'");
$this->db->from('register');
$query = $this->db->get();
foreach($query->result() as $row)
{
$email = $row->email;
$this->db->where('email', $email);
$this->db->delete($tables);
// print_r($email);
}
}
您正在循环执行 WHERE 语句,正如您所观察到的,它将在第一个实例中起作用,但随后的语句将不起作用,因为您正在添加诸如
之类的 WHERE 语句循环 1:WHERE email = email1
循环 2:WHERE email = email1 AND email = email2
循环 n:WHERE email = email1 AND email = email2 AND ..... email = emailn
它会继续建设。它的行为与您在上面使用多个 WHERE 语句的查询中使用的行为完全相同。
因此您需要对查询执行重置。
$this->db->reset_query();
所以你的循环可能看起来像...
foreach($query->result() as $row)
{
$this->db->where('email', $row->email);
$this->db->delete($tables);
$this->db->reset_query();
}
那么你会得到你所期待的。
循环 1:WHERE email = email1
循环 2:WHERE email = email2
循环 n: WHERE email = emailn
虽然上述“可行”,但您应该考虑您要在这里实现的目标...
您想创建一个要从多个表中删除的电子邮件列表。
请注意:我们不知道这些表是如何相关的等等,所以请注意留下“孤立”记录的可能性。有很多方法可以解决这个问题,但它不在讨论范围内。
选项 是检查您是否有一些结果,构建 where 查询然后执行删除。所以它只是到数据库的“1 次旅行”,而不是“n 次旅行”。
// Did we get any results to delete?
if($query AND $query->num_rows()) {
foreach($query->result() as $row)
{
// Build the WHERE Statement
$this->db->or_where('email', $row->email);
}
$this->db->delete($tables); // Execute the Delete.
}
因此了解执行此操作的各种方法很重要...即还有其他方法。但是对于这种情况,应该没问题(著名遗言)。
TimBrownlaw 使用 or_where 的回答更进一步:
foreach($query->result() as $row)
{
$this->db->or_where('email', $row->email);
$this->db->delete($tables);
}