我试图制作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查询是真的。 谢谢!
答案 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,以避免冗余和可能更快的查询。