簡體   English   中英

如何在PHP中的其他while循環中運行while循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM