-2

我正在尝试为我正在编写的网络应用程序设置电子邮件“系统”。如果您在用户表中的角色是

3

并且您的帐户状态是

'活性'

然后当新用户注册或发送登录请求时,所有管理员都会收到电子邮件。到目前为止,我只是对电子邮件进行硬编码,但在营销应用程序时,公司不希望必须编写代码来更改电子邮件。所以我试图“动态地”做到这一点

我的模型在很大程度上要感谢 Thomas!:

    {
        $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 失败了,但我不知道为什么甚至如何纠正我的错误。

如果有人能告诉我我在这里做错了什么,那就太好了,

4

3 回答 3

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;
于 2013-03-16T17:34:49.457 回答
-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 数组项一项一项并必须将其返回到数组(而不是简单的字符串变量)


然后检查您的解码功能可以处理数组。

于 2013-03-16T18:40:48.960 回答
-3

您的 admin_email 函数看起来有点奇怪

  • 您正在调用 PDO 语句变量$admin_email,而它不包含任何电子邮件。它使您的代码非常自我混淆。
  • 您正在以不应使用的方式使用 try..catch 运算符。
  • 太多过度ifs
  • 什么都没做$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();
}

它将返回一个包含管理员电子邮件的数组。

于 2013-03-16T16:40:58.723 回答