Php 查询数据库,然后从用户所在的子数据库发送电子邮件

Php 查询数据库,然后从用户所在的子数据库发送电子邮件,php,mysql,sql,email,Php,Mysql,Sql,Email,我有一个订阅表,下面是模式 +-------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+----------------+ | id

我有一个订阅表,下面是模式

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)          | YES  |     | NULL    |                |
| sub_to      | int(11)          | YES  |     | NULL    |                |
| date_subbed | varchar(255)     | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
非常基本,下面是一个示例行

+----+---------+--------+------------------------+
| id | user_id | sub_to | date_subbed            |
+----+---------+--------+------------------------+
| 23 |      13 |      2 | 08/19/2014 07:44:49 pm |
+----+---------+--------+------------------------+
都是些很基本的东西。所以user
13
本质上是user
2
的子对象。因此,让我们假设另一个用户加入该站点,并使用user
14
subs-to-user
5
创建另一行

现在用户
2
和用户
5
在站点上发布消息,并将其插入数据库。我希望订阅某人的用户能够收到一封包含最新帖子的电子邮件

//Get user subs
$stmt = $con->prepare("SELECT * FROM subscription");
$stmt->execute();

foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $key) {
    print_r($key);
}
我已经尝试过foreach循环,但看不出它是如何工作的。因此,总结一下,我想在用户发布新帖子时向其发送电子邮件。我将每24小时发送一封电子邮件,这样我就不会杀死服务器。我想确保它也是全自动的。我知道如何做24小时的事情,但当我说自动化时,我的意思是它将自己查询和发送电子邮件。有什么建议或想法吗

           $sql="select email id from subscription"; 
           $rs=mysql_query($sql); //resultset
           if(mysql_num_rows($rs)>0) //checking whether anyone subscribed the user or not
           {
                 while($d=mysql_fetch_array($rs))
                 {
                     $sql1="select * from subscription where sub_to in ('".$d["user_id"]."')";
                     $rs1=mysql_query($sql1);

                     while($ds=mysql_fetch_array($rs1)
                     {

                         $to=$ds["email_id"];//assuming the field for email id
                         $subject="";
                         $msg="";  
                         @mail($to,$subject,$msg);
                     }

                 }

           }

我试着用SQLFiddle来做你说的,但是用当前的模式来尝试似乎是不可能的。在上面的链接中,我有很多关于如何完全重新设计模式的评论。这个查询是一个非常令人头痛的问题,除非你建立一个新的模式,否则它是不可伸缩的。

我想出来了。只需使用
ob\u start()
,并循环遍历每个用户。选择他们订阅的帖子。然后在循环内部通过电子邮件将其发送给每个用户。我使用了这个查询

    $sql="select email id from subscription";
    $rs=mysql_query($sql); //resultset
    if(mysql_num_rows($rs)>0) //checking whether anyone subscribed the user or not
    {
       while($d=mysql_fetch_array($rs))
       {               
            $sql1="select email id from subscription where sub_to in('".$d["user_id"]."')";
            $rs1=mysql_query($sql1);
            while($ds=mysql_fetch_array($rs1))
            {
                  $to=$ds["email_id"];//assuming the field for email id
                  $subject="";
                  $msg="";  
                  @mail($to,$subject,$msg);
            }//inner while end
       }//outer while end
    }
SELECT
    articles.*
    FROM
    articles
    INNER JOIN subscriptions ON articles.from_id = subscriptions.sub_to
    INNER JOIN users ON subscriptions.user_id = users.id
    WHERE
    users.email = :email

您应该使用
date
datetime
在数据库中存储日期,而不是作为字符。如果必须将它们存储为字符,请使用YYYY-MM-DD HH24:MI:SS格式。是的,我知道。我只是用它来测试。但是谢谢:)@gordonlinoff为什么你会故意做错事“但只是为了测试”?!?!我不是几个小时前回答的吗?那个问题怎么了?它可能会被关闭。那就不要@BarmarI不做特定的用户。我想通过所有的用户,并发送电子邮件给所有的人谁是subbed的东西。和
mysql
。。。。真的吗?那现在电子邮件部分呢?我必须循环浏览所有用户并通过电子邮件向他们发送其内容……选择电子邮件正在浏览的用户,将其连接到一个逗号分隔的列表中。把它放到“收件人”字段中,你就可以做到!我觉得我让事情变得更难了。所以我在自己的计算机上尝试SQL,它看起来是什么样子,我得到的只是
Array()
,不知道为什么会发生这种情况,尽管我有记录……这是一个相当复杂的问题,所以你实际上过于简化了,我仍然认为,如果这是一个真正的应用程序,它不会很好地扩展,除非你@Idris还有什么你感兴趣的吗?php循环本身进行邮件处理?那么您使用了什么查询?就可交付性而言,您可能希望从php调用一封邮件(),收件人字段包括收到邮件的所有用户。如果要处理大量邮件,请尽可能少地使用mail(),因为我已更新查询。为什么我要尽量少用
mail()
?需要太多的电力@这里有一些东西叫做垃圾邮件评级和发件人分数,如果你不小心的话,你所有的邮件都会直接放在收件人的垃圾邮件文件夹中。当您使用尽可能少的mail()时,它还将减少脚本的运行时间possible@J-Dizzle有点离题,但我只是好奇:假设我只想给10个收件人打一次电话
mail()
,我能让他们都在
收件人:
中,同时不让他们看到彼此的地址吗?我知道我可以把它们放在
BCC:
哪些服务器正是为了这个目的,但这在接收端可能看起来很奇怪,因为
TO
一个
CC
将是空的。只是想知道。我正在运行下面的测试,看看“to:”头会发生什么:。。。我现在正在邮件服务器上等待,但是如果您想测试它,请用有效的电子邮件替换$mailto中的电子邮件。我不认为用BCC:header发送给收件人会有多奇怪。