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

时间:2017-01-16 16:34:06

标签: php mysql

我试图制作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查询是真的。 谢谢!

1 个答案:

答案 0 :(得分:0)

一个循环

好消息是你不需要两个循环

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,以避免冗余和可能更快的查询。