我有以下代碼可以洗掉一周內未驗證其電子郵件地址的用戶帳戶。查詢按我的預期作業,但洗掉功能只洗掉第一條記錄,我不知道為什么。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);
}
}
uj5u.com熱心網友回復:
您正在回圈 WHERE 陳述句,正如您所觀察到的那樣,該陳述句將適用于第一個實體,但隨后的陳述句不會,因為您正在添加 WHERE 陳述句,例如
回圈 1:電子郵件地址 = email1
回圈 2:電子郵件 = email1 和電子郵件 = email2
回圈 n:其中 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:電子郵件地址 = email1
回圈 2:其中電子郵件 = email2
回圈 n:WHERE 電子郵件 = 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.
}
因此,了解執行此操作的各種方法很重要...... IE 還有其他方法。但是對于這種情況,應該沒問題(著名的遺言)。
uj5u.com熱心網友回復:
進一步使用 or_where 的 TimBrownlaw 的回答也有效:
foreach($query->result() as $row)
{
$this->db->or_where('email', $row->email);
$this->db->delete($tables);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/431247.html
標籤:代码点火器
上一篇:Otp未在資料庫中發布
