【问题标题】:MySQL to Populate ForeachMySQL 填充 Foreach
【发布时间】:2012-01-16 05:39:03
【问题描述】:

我正在重建我不久前编写的通讯系统。原始系统基于使用平面文件系统,我想将其转换为 MySQL。我剩下的就是重建最终功能。我的问题是我需要为存储在数据库中的每封电子邮件使用一个循环。我认为每个循环是执行此操作的最佳方法,但是如何将 MySQL 和 foreach 一起使用?这是我当前的代码:

    $run = mysql_query("SELECT email FROM newsletter");    

    foreach ($run as $value) { 
        mail($value, $subject, $_POST['message'], $headers);
    }     

我尝试了很多不同的方法,但似乎没有任何效果。我什至尝试过这样的事情:

        $run = mysql_query("SELECT email FROM newsletter");    
    $email = mysql_fetch_array($run, MYSQL_ASSOC)
    $cols = implode (', ', $email);
    $run2 = mysql_query("SELECT $cols FROM newsletter");    
    while($emaillist = mysql_fetch_array($run2, MYSQL_ASSOC)){ 
        foreach ($emaillist as $value) { 
            mail($value, $subject, $_POST['message'], $headers);
        }                                                                       
    } 

这是基于我认为的其他一些示例。它没有给出任何错误,但它不发送电子邮件。我将不胜感激一些帮助。

【问题讨论】:

  • Dwight,请选择下面的accept 答案,除非您对此主题还有其他问题。

标签: php mysql email newsletter


【解决方案1】:

您必须获取结果。你不能使用 foreach,你会想要使用 while。

$handle = mysql_query("SELECT email FROM newsletter");    

while ($row = mysql_fetch_assoc( $handle ) )
{
    mail( $row['email'], $subject, $_POST['message'], $headers);
}

http://us3.php.net/mysql_fetch_assoc

【讨论】:

  • @Johan 是的,这太可怕了 - 您应该在问题上发表评论,并附上您正在谈论的内容的链接,以便 OP 能够了解该问题。 :) ... n/m - 刚刚看到你的答案。
  • 我考虑到了这一点并将其添加到我的脚本中。我的网站可能充满了很多安全风险,但我知道所有功能,也不知道大部分时间何时使用它们。我有很多人告诉我很多不同的事情。
  • @DwightAaronPotvin 如果您切换到使用带有绑定参数的 PDO,您将是安全的。
【解决方案2】:

这个伪代码

$run = mysql_query("SELECT email FROM newsletter");    

foreach ($run as $value) { 
    mail($value, $subject, $_POST['message'], $headers);
}   

可以正确改写为:

$result = mysql_query("SELECT body, emailaddress, subject  FROM emails");    
if (!$result) { die('error in mysql_query: '.mysql_error())}
while ($row = mysql_fetch_array($result) {
  $body = $row['body'];
  $address = $row['address'];
  $subject = $row['subject'];
  //do stuff with that data.
  //never use $_POST data directly, always feed it though `htmlentities` 
  //before outputting it (screen or email) 
  //or through mysql_real_escape_string() before inputting it in a DB.
  $echo htmlentities($body);  //sanitize your output or suffer XSS-attacks
  .....
}

如果您想使用一个 SELECT 的输出作为另一个 select 的输入不要使用循环,而是使用连接:

SELECT e.body, e.subject, e.header, e.whatever FROM emails e
INNER JOIN newsletter n ON (n.id = e.newsletter_id)
WHERE n.id = 1466

【讨论】:

  • 只有电子邮件地址被存储到数据库中。我的系统非常基础。其他所有内容都是在我上面添加的那个非常小的 sn-p 之外预定义和设置的。由于电子邮件是我唯一需要的东西,我认为 Tim G 走在了正确的轨道上。虽然我的主机刚刚宕机,所以我无法测试任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多