2013-03-16 288 views
-2

我正在嘗試爲我正在編寫的Web應用程序設置一個電子郵件「系統」。漂亮得多,如果你在用戶表的作用是PHP Foreach循環+ PDO

和您的帳戶狀態

'激活'

那麼當一個新用戶註冊,或發送登錄請求所有管理員將通過電子郵件發送。到目前爲止,我只是對電子郵件進行了硬編碼,但當涉及到營銷應用程序時,公司不希望進入代碼來更改電子郵件。所以我試圖做到「動態」

我的模型大部分要感謝托馬斯! :

{ 
     $sql = "SELECT * from users WHERE status = 'Activated' and role = 3"; 
     $admin_email = $this -> db -> conn_id -> prepare($sql); 
     $admin_email -> execute(); 
     $emails = array(); 

     if ($admin_email) 
     { 
      if ($admin_email -> rowCount() > 0) 
      { 
       foreach ($admin_email -> fetchall() as $row) 
       { 
        $emails[] = $this -> encrypt -> decode($row['email']); 
       } 
       return $emails; 
      } 
     } 
    } 

和控制器:

 { 

     $this -> load -> model('login_model'); 
     $this -> load -> library('email'); 
     $this -> load -> library('encrypt'); 

     $emails = $this -> login_model -> admin_email(); 

     $first = $this -> input -> post('fname'); 
     $last = $this -> input -> post('lname'); 
     $email = $this -> input -> post('email'); 

     $this -> email -> from($email); 
     $this -> email -> to($emails); 
     $this -> email -> reply_to($email); 
     $this -> email -> subject('' . $first . ' ' . $last . ' Account Request'); 
     $this -> email -> message('{unwrap}Hello this is ' . $first . ' ' . $last . ', I am requesting to be added to the staff log-in.{/unwrap}'); 

     if (!$this -> email -> send()) 
     { 
      $this -> session -> set_flashdata('email', 'Email Was Not Sent!'); 
      $this -> request_account(); 
     } else 
     { 
      $this -> session -> set_flashdata('login', 'Request Sent!'); 
      redirect('login_controller/index', 'location'); 
     } 
    } 

只是從我的觀察深入到這個更多:

  1. 第一行返回的作品就好了,但是出於測試目的,我有兩個管理員帳戶,就像我剛纔所說,第一個只收到電子郵件。並說如果我刪除第一行(第一個管理員),然後第二個得到它。所以我覺得我的foreach失敗了,但我不知道爲什麼甚至是如何糾正我的錯誤。

如果任何人能告訴我什麼,我做錯了什麼,這將是巨大的,

+0

更改此$ dbemail = $ row ['email'];'到'$ dbemail = $ row'並再次測試 – 2013-03-16 17:27:01

+0

給出正確答案後關閉問題$ this - > logic === 0 – RaGe10940 2013-03-18 00:31:22

回答

0

你的函數只返回一個單一的電子郵件不管,所以你可能想嘗試

$sql = "SELECT email from users WHERE status = 'Activated' and role = 3"; 
    $admin_email = $this -> db -> conn_id -> prepare($sql); 
    $admin_email -> execute(); 

    $emails = array(); // initialize empty array 

    if ($admin_email) 
    { 
     $encryptedEmails = $admin_email->fetchAll(); 
     foreach ($encryptedEmails as $row) 
     { 
      $emails[] = $this->encrypt->decode($row['email']); // insert the email at the end of the array 
     } 
    } 

    return $emails; 
+0

仍然只發送到第一行,我的其他管理員帳戶的電子郵件沒有得到通知。 – RaGe10940 2013-03-17 00:49:44

+0

有趣的是,如果您單獨運行SQL查詢,它會返回2封電子郵件?該函數是否返回數組中的2封電子郵件? – 2013-03-17 01:19:35

+0

我修好了,你會笑的。你的答案是最接近的,所以我要+1,並檢查你 – RaGe10940 2013-03-17 01:27:34

-3

你ADMIN_EMAIL功能看起來有點怪

  • 你調用PDO聲明變量$admin_email,而它不包含任何電子郵件。它使您的代碼非常自我模糊。
  • 您正在使用try..catch操作符不應該使用的方式。
  • 太多過度if小號
  • 四大皆空到$row['email']
  • 有一些奇怪的decode()功能我懷疑是無用的或基於一些錯誤的假設。

所以,我決定重寫這個功能更明智的方式

function admin_email() 
{ 
    $sql = "SELECT email from users WHERE status = 'Activated' and role = 3"; 
    $stm = $this->db->conn_id->prepare($sql); 
    $stm->execute(); 
    return $stm->fetchAll(); 
} 

它將返回管理電子郵件的數組。

+0

我的電子郵件被加密,解碼功能刪除加密,然後返回該電子郵件的無加密版本。 – RaGe10940 2013-03-16 16:43:41

+0

我使用一個名爲codeigniter的php MVC,當帳戶被創建時,電子郵件被加密,現在我需要將它們解碼以正確發送到正確的電子郵件地址 – RaGe10940 2013-03-16 16:46:35

+0

已更新OP。仍然沒有結果。 – RaGe10940 2013-03-16 17:00:46

-1

什麼(編輯:刪除了我的第一個答案....)

也許(我不是當然)你不應該在你foreach循環中使用兩個變量。
編號:http://php.net/manual/fr/control-structures.foreach.php

如果你這樣做:

 foreach ($admin_email -> fetch() as $row) 
      { 
       $row = $row['email']; 
      } 

      $email = $this -> encrypt -> decode($admin_email); 

你編碼的郵件現在應該$ ADMIN_EMAIL數組中....作爲在foreach一個處理$ ADMIN_EMAIL陣列項目之一,並有將其返回給數組(而不是簡單的字符串變量)


然後檢查您的解碼函數是否可以處理數組。