【问题标题】:How to email all users with user-specific information.如何通过电子邮件向所有用户发送特定于用户的信息。
【发布时间】:2013-01-24 09:59:45
【问题描述】:

我已经为一个网站建立了一个竞赛系统,它的工作原理是用户登录,根据现实生活中的事件(特定对象的销售)提交选票,然后在月底,选择随机选票,该选票的所有者是获胜者。

我被要求创建一个脚本,该脚本将通过电子邮件向数据库中的所有用户发送他们在系统中的当前选票数量。

我当前的登录/注册系统是经过大量编辑的 HTML-Form-Guies Simple PHP Registration System 版本。

我知道我想做的伪代码。

一步一步,需要的方法是这样的。

调用 EmailUsersTotalEntries,用数据库中的所有用户填充一个数组,选择数组中的第一个条目,用户 1,找到用户 ID 为 1 的 itemsold 列中所有行的总和。然后发送用户一个一封电子邮件,其中包含从 userid = 1 的选票中选择 sum(itemsold) 的结果;到用户 1。然后循环转到用户 2 并执行相同的操作,直到它向数据库中的每个用户发送电子邮件。

以下是我编写的或来自登录系统的一些方法,它们将用于完成此操作。我唯一的问题是我不知道如何创建一个循环,以便它从用户 1 开始,然后一直到用户 2,我不知道如何在数据库中查询数据库/循环中任何用户的 user_id目前正在开启。

方法如下: 这是主要方法,它会调用子方法来收集用户,然后发送实际的电子邮件。 我不确定 TotalEntries 是否应该是一个数组

 function EmailTotalEntries()
{
    if(empty($_POST['email']))
    {
        $this->HandleError("Email is empty!");
        return false;
    }
    $user_rec = array();
    if(false === $this->GetUsers($user_rec)) 
    {
        return false;
    }
    **/* $TotalEntries = array();  */**
    if(false === $this->GetTotalEntriesForEmail($user_rec, $TotalEntries)
    {
        return false;
    }

    //At this point, I have an array, user_rec, populated with all the data from my users table, and an array $TotalEntries that will have nothing since its trying to pull from user_rec, which usually is one user but right now is all of the users.
   //This is where I know I should have already started the loop, so chosen the first element in user_rec, and applied the GetTotalEntriesForEmail method, then the SendUserEmail method, then gone to the top of the loop and gone to the second user_rec element and repeat.

    if(false === $this->SendUsersEmail($user_rec, $TotalEntries))  
    {
        return false;
    }
    return true;
}

这是收集用户的方法

function GetUsers(&$user_rec)
{
    if(!$this->DBLogin())
    {
        $this->HandleError("Database login failed!");
        return false;
    }   

    $result = mysql_query("Select * from $this->tablename",$this->connection);  

    $user_rec = mysql_fetch_assoc($result);

    return true;
}

这是我编写的用于获取已登录用户的 TotalEntries 的方法(检查他的控制面板以查看他有多少条目)

function GetTotalEntries()
{
    if(!$this->CheckLogin())
    {
        $this->HandleError("Not logged in!");
        return false;
    }

    $user_rec = array();
    if(!$this->GetUserFromEmail($this->UserEmail(),$user_rec))
    {
        return false;
    }
    $qry = "SELECT SUM(itemsold) AS TotalEntries FROM entries WHERE user_id = '".$user_rec['id_user']."'";
    $result = mysql_query($qry,$this->connection);
    while($row = mysql_fetch_array($result))
                      {                         
     echo    $row['TotalEntries'];
                      }



}

这就是我认为需要对其进行调整以在电子邮件中工作的方式。

function GetTotalEntriesForEmail($user_rec, &$TotalEntries)
{
     if(!$this->DBLogin())
    {
        $this->HandleError("Database login failed!");
        return false;
    }  


    $qry = "SELECT SUM(itemsold) FROM entries WHERE user_id = '".$user_rec['id_user']."'"; //$user_rec['id_user'] should the be id of the user the loop is currently on.
    $result = mysql_query($qry,$this->connection);
    $TotalEntries = mysql_fetch_assoc($result);
            return true;

}

这是实际的电子邮件

function SendUsers($user_rec, $TotalBallots)
{
    $email = $user_rec['email']; //should be the for the user the loop is currently on.

    $mailer = new PHPMailer();

    $mailer->CharSet = 'utf-8';

    $mailer->AddAddress($email,$user_rec['name']); //user the loop is currently on.

    $mailer->Subject = "Total Ballots to Date";

    $mailer->From = $this->GetFromAddress();

    $mailer->Body ="Hello ".$user_rec['name']."\r\n\r\n". //Same thing
    "To date you have: "/* .$TotalBallots. */" ballots.\r\n" //Same thing

    if(!$mailer->Send())
    {
        return false;
    }
    return true;
}    

我不太擅长 PHP,这整件事对我来说是一次学习经历,非常感谢您的帮助。

如果我还不清楚,也许用另一种语言举个例子会更清楚,所以这就是我想做的,但是在 java 中

for(x = 0; x <= user_rec.length; x++)
{
 int ballots = getTotalEntriesForUser(x); 
 sendEmailToUser(ballots)
}

如果我还不够清楚,请告诉我,我会尽力澄清。

我如何将上述代码与一个循环结合起来,该循环将向所有用户逐一发送一封电子邮件,每封电子邮件对发送到的用户都是唯一的?

【问题讨论】:

    标签: php mysql loops for-loop


    【解决方案1】:

    你的函数是类的一部分吗?您不一定需要他们这样做。这是我的建议,您可以根据需要将其转换为函数或类。此外,您可能需要考虑研究和使用 MySQLi,并利用它使用的类。同样,所有只是我的建议。

    在不知道你的表结构的情况下,我只是猜测一下。

    $sql = mysql_query("SELECT u.*,
                               u.user_id AS user,
                               COALESCE(SUM(e.itemssold), 0) AS total_items
                        FROM users u
                        LEFT JOIN entries e ON e.user_id = u.user_id
                        GROUP BY u.user_id");
    
    while($row = mysql_fetch_array($sql))
    {
        $user  = $row['user'];
        $email = $row['user_email'];
        $items = $row['total_items'];
    
        yourEmailFunction($email, $items);
    }
    

    这会根据匹配的用户 ID 从您的用户表和条目表中提取信息。它将用户表中的用户 ID 设置为用户,因此您以后不必尝试区分两者。要了解 COALESCE 功能,read here。 while() 函数将遍历它从该 SQL 语句中提取的每个用户。

    这还没有经过任何测试,但这基本上就是您所需要的。只需传递用户的电子邮件和项目总数,然后编写您的电子邮件函数以将该信息发送到该电子邮件地址。

    但是,如果您知道您的函数可以正常工作,并且想要使用 for 循环,例如您在 Java 中提供的循环,那么您可以使用 PHP 编写它。

    for($x = 0; $x <= count($user_rec); $x++)
    {
        $ballots = getTotalEntriesForUser($x);
        sendEmailToUser($ballots);
    }
    

    【讨论】:

    • 你和e是什么?我的数据库的设置方式,它与两个表、用户和条目的竞争。 (contest.users 和竞赛条目)
    • 在我的 users 数据库中,需要的列是 id_user 和 email,而在 entries 表中,user_id(应该与用户的 id_user 匹配)和 itemsold
    • 哦!我明白。让查询正常工作,我确切地看到了它的作用,我可以使用它,谢谢!
    • u 和 e 是为每个表指定的短名称,以便在查询中参考。您可以将它们更改为您想要的任何内容,甚至不使用它们。如果你不这样做,那么你需要使用完整的表名,其中我在列名之前有 u 和 e。就像我在回答中所说的那样,我不知道您的数据库结构,所以我只是在猜测您的表名和列名。根据需要更改它们。我很高兴它对你有用。
    • 现在我有 $sql = mysql_query(query, connection); while($row = mysql_fetch_array($sql)) { $user = $row['user']; $user_email = $row['email']; $user_name = $row['name']; $items = $row['total_items']; SendUserStatusReport($user_name, $user_email, $items);为什么要包含 $user = $row['user'];在你的时候?它是做一些需要的事情,还是只是告诉我我可以选择在电子邮件中包含 user_id?
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 2014-11-23
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多