Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中的其他while循环中运行while循环?_Php_Mysql - Fatal编程技术网

如何在PHP中的其他while循环中运行while循环?

如何在PHP中的其他while循环中运行while循环?,php,mysql,Php,Mysql,我正试图使PHP代码,将自动发送电子邮件,每天晚上所有客户的电子邮件发送在MySQL中激活。电子邮件将包含PDF文件,其中包含来自MySQL的交付数据 我已经整理了如何每晚发送邮件,以及如何从MySQL数据创建PDF。问题是,当我运行脚本时,它将只向第一个激活了电子邮件发送的客户发送电子邮件(sendEmail=1)。所以看起来PHP是先运行的,而循环只有一次。当数据从MySQL收集到PDF文件时,有第二个while循环。但在运行第二个循环之后,PHP似乎也会停止第一个循环 这是while循环。

我正试图使PHP代码,将自动发送电子邮件,每天晚上所有客户的电子邮件发送在MySQL中激活。电子邮件将包含PDF文件,其中包含来自MySQL的交付数据

我已经整理了如何每晚发送邮件,以及如何从MySQL数据创建PDF。问题是,当我运行脚本时,它将只向第一个激活了电子邮件发送的客户发送电子邮件(sendEmail=1)。所以看起来PHP是先运行的,而循环只有一次。当数据从MySQL收集到PDF文件时,有第二个while循环。但在运行第二个循环之后,PHP似乎也会停止第一个循环

这是while循环。我已删除所有PDF文件创建者和电子邮件代码:
// Check if Email is activated
try {
  $resultsCustomerEmail = $db->query("
            SELECT id, name, email
            FROM customer
            WHERE sendEmail = 1
            ");
} catch (Exception $e) {
  echo "Data could not be retrieved from the database - customer table";
  exit;
}

while ($tempDBCustomerEmail = $resultsCustomerEmail->fetch(PDO::FETCH_ASSOC)) {

  $startdate = date('Y-m-d');
  $enddate = date('Y-m-d');

  try {
    $results = $db->query("
              SELECT delivery.id, date_format(delivery.timestamp,'%d.%m.%Y %H:%i:%s') as timestamp
              FROM delivery
              WHERE delivery.customer = " . $tempDBCustomerEmail['id'] . " AND
                date(delivery.timestamp) BETWEEN '" . $startdate . "' AND '" . $enddate . "'
              ORDER BY delivery.id ASC
              ");
  } catch (Exception $e) {
    echo "Data could not be retrieved from the database";
    exit;
  }

  // Data
  while ($tempDB = $results->fetch(PDO::FETCH_ASSOC)) {
    $timestamp = $tempDB['timestamp'];
    $deliveryId = $tempDB['id'];

  }
}

?>
有没有人建议我应该更改什么,以便第一个while循环的运行次数与第一个MySQL查询的运行次数相同。 谢谢

一圈 好消息是这里不需要两个循环

SELECT customer.id, customer.name, customer.email,
  delivery.id, date_format(delivery.timestamp,'%d.%m.%Y %H:%i:%s') as timestamp
          FROM delivery INNER JOIN customer ON
          delivery.customer = customer.customer

          WHERE  AND
            date(delivery.timestamp) BETWEEN :strt AND :end
            AND customer.id = :id
          ORDER BY delivery.id ASC
这种连接将通过一个循环在一个查询中获得结果,并且可能会避免数据库被大量查询击中并导致失败

准备好的声明 服务器可以通过另一种方式,通过您的代码当前允许的SQL注入,让它屈服。这就是我重新编写它以使用占位符的原因。现在您需要准备它,然后通过传递参数来执行它

$stmt = $db->prepare($sql);
$stmt->execute( array("id"=>$customer_id, "strt"=>$startdate, "end"=>$enddate));
规范化
不太清楚为什么要在产品表中存储
customer
,我假定这是客户名称或客户电子邮件。您应该将客户id保存在此处,以避免冗余和可能更快的查询。

使用
内部联接时,请将联接条件放在
上的
,而不是
中的
。MySQL对它们一视同仁,但它的风格更好。感谢您的快速响应感谢您的快速响应!内部连接工作正常。尽管我注意到FPDF导致了只创建一个PDF的问题。我将FPDF代码的一部分从循环中移出,现在它也可以工作了。谢谢你的帮助!感谢占位符提醒!我需要在我的所有查询中使用这些。我将在下一步修改它们。我只将客户名称和电子邮件存储到客户表中。我在其他表上使用customerID。我应该给那些字段起个更好的名字。喜欢CustomerID。谢谢你的澄清。很高兴能帮上忙