[英]How can I run while loop inside other while loop in PHP?
我正在嘗試制作PHP代碼,該代碼將每晚自動向所有在MySQL中激活了電子郵件發送功能的客戶發送電子郵件。 電子郵件將包含PDF文件,該文件將包含來自MySQL的傳遞數據。
我已經整理出了每天晚上如何發送郵件以及如何從MySQL數據創建PDF。 問題是當我運行腳本時,它將僅向已激活電子郵件發送功能的第一位客戶發送電子郵件(sendEmail = 1)。 因此,似乎PHP首先在while循環中運行一次。 當數據從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,以避免冗余和可能更快的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.