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