【问题标题】:MYSQL fetch_array creating infinite loop;MYSQL fetch_array 创建无限循环;
【发布时间】:2016-01-24 02:33:03
【问题描述】:

我在创建和实现时事通讯 PHP 文件时遇到问题。

<?php
include_once "connect_to_mysql.php";
$sql = mysql_query("SELECT * FROM news WHERE received='0' LIMIT 20");
$mail_body = "";
while($row = mysql_fetch_array($sql)){
    $id = $row["ID"];
    $name = $row["name"];
    $email = $row["email"];

    $mail_body= "Test message";
    $subject = "PHP Newsletter";
    $headers = "From: no-reply@pageaddress.com\r\n";
    $headers = "Content-type: text/html\r\n"; //To musi byc zawarte jeśli nasz email będzie w formie HTML
    $to = "$email";

    $mail_result = mail($to, $subject, $mail_body, $headers) or die ("Error!");

    if ($mail_result) {
        mysql_query("UPDATE news SET received='1' WHERE email='$email' LIMIT 1");
    } else {
        echo ("Some freaking error :o!");
    }

}
?>

我确实与我的数据库有关联。我确实将一封电子邮件 - 我的电子邮件放入了这个数据库。我在我的表中将收到的默认设置为 0。因此,当循环开始时,它应该从我的数据库中获取数组 --> 发送电子邮件 --> 将接收到的设置为 '1' 并停止 --> 从表中获取另一封电子邮件并执行相同操作。

但问题是,当我输入这个地址http://.../blast_script.php 时,脚本一直在向我发送电子邮件。我必须从我的数据库中删除该表才能停止它。

如何防止这个无限循环只向数据库中的每封电子邮件发送一条消息?

【问题讨论】:

  • 您的电子邮件地址是否多次出现在新闻表中?此外,您不应该使用 mysql_* 库,因为它们已被弃用,请查看 PDO 或 MySQLi。
  • 只使用一次。我10分钟前输入了blast_script.php地址,9.5分钟前删除了表,仍然不断收到邮件!
  • 不使用UPDATE-query 时,您的代码是否完美运行?
  • 请注意,PHP 的mysql_xxx() 函数已被弃用,并且在很长一段时间内都被认为已过时。您应该强烈考虑将您的代码转换为使用mysqliPDO 库。
  • 如果你使用 js 或 jquery 来执行这个 .php 文件。那么可能这将是js问题。

标签: php mysql email newsletter


【解决方案1】:

按照上述查询的编写方式,您将收到正好 20 封电子邮件,因为您将第一次选择限制为 20 个结果。

我认为您没有理由陷入无限循环。你做了什么来逐个调试每个语句?

【讨论】:

    【解决方案2】:

    你应该检查一下:

    mysql_query("UPDATE news SET received='1' WHERE email='$email' LIMIT 1");
    

    通过检查数据库中收到的是否为 1 来工作。

    如果不是,那么您知道接收到的内容没有正确更新导致无限循环。

    如果您想对此进行测试并且不想收到 20 封电子邮件,请更改以下代码:

    $sql = mysql_query("SELECT * FROM news WHERE received='0' LIMIT 20");
    

    $sql = mysql_query("SELECT * FROM news WHERE received='0' LIMIT 1");
    

    【讨论】:

      【解决方案3】:

      尝试在 fetch 循环之前添加:

      $run_count = 1;
      

      然后在循环中添加:

      echo "The loop has been run $run_count times";
      $run_count++;
      

      这将告诉您是 fetch 循环被命中太多次,还是问题出在其他地方

      同时检查 $mail_result 的值是你在每个循环中所期望的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-20
        • 2021-08-11
        • 1970-01-01
        • 2015-01-24
        • 2016-03-21
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多