2016-07-24 191 views
0

嘗試運行腳本以通過電子郵件將用戶的個人日程安排從我的數據庫發送給用戶。PHP雖然在While循環中循環

代碼應該像這樣...從表1中選擇用戶希望每週發送電子郵件的所有用戶。

然後取這些user_ids並運行一個查詢以從表2

如果在表2中的日期小於或等於1周從當代碼是RAN獲取每週日程安排爲每個用戶,並且它不等於今天的日期,然後設置變量$ email_content。

如果表2中的日期超過1周,那麼代碼應該知道它已完成,並且這裏是想繼續並且mail()爲該用戶收集的信息並僅發送該信息到只有那個用戶,然後繼續到下一個用戶。

它說回聲「中斷」,它基本上標記每個用戶的時間表之間的分離,但它回聲約20次。這部分理想情況下會成爲我放置mail()函數的地方,所以我不能讓它執行20次mail()函數。

我已經試過了這段代碼的一大堆不同的變體,但似乎無法弄清楚它的正確性。總之,我需要獲得用戶1 INFO1,然後郵寄INFO1爲user1,然後轉移到獲取用戶2 INFO2,然後郵寄INFO2的user2,等...

<?php 

// GET USERS WHO WANT THEIR WEEKLY SCHEDULE EMAILED TO THEM (Table 1) 
$sql = "SELECT * FROM XXXXXXX WHERE weekly_email = 'Yes'"; 
$result = mysqli_query($connection, $sql); 
while ($row = mysqli_fetch_array($result)) { 
    $id .= "'" . $row['user_id'] . "', "; 
} 
$id = trim($id, ', '); 

// GET THOSE USERS' SCHEDULES (Table 2) 
$sql_email = "SELECT * FROM XXXXXXXX WHERE user_id IN ($id) ORDER BY user_id, date, start_time ASC"; 

$result_email = mysqli_query($connection, $sql_email); 

while ($row_email = mysqli_fetch_array($result_email)) { 
    $truck_name_email = $row_email['truck_name']; 
    $location_name_email = $row_email['location_name']; 
    $date_email = $row_email['date']; 
    $address_email = $row_email['address']; 
    $x = strtotime("7 days"); 

    $start_email = $row_email['start_time']; 
    $end_email = $row_email['end_time']; 

    if ($date_email <= date("m/d/Y l", $x)) { 

     if ($date_email !== date("m/d/Y l")) { 
      if (!empty($address_email)) { 
       $address_email2 = explode(",", $row_email['address'], 2); 
       $email_content = $date_email . substr($date_email, 11) . " - " 
        . $location_name_email . ", " . $address_email2[0] . ", " 
        . $start_email . "-" . $end_email . "<br/>"; 

       echo $email_content; 
      } elseif (empty($address_email)) { 
       $email_content .= $date_email . " - " . $location_name_email 
        . ", " . $start_email . "-" . $end_email . "<br/>"; 

       echo $email_content; 
      } 
     } 
    } 
    if ($date_email >= date("m/d/Y l", $x)) { 
     echo "break"; 
     // break; 
    } 
} 
+0

無需兩個查詢。只需使用子查詢。如果你有'IN($ id)'而不是'IN'(SELECT user_id FROM XXXXXX WHERE weekly_email ='Yes)' – siride

+0

當你想比較時間戳時,你比較if塊中的兩個字符串。例如「星期四」>「星期天」? – Drakes

+0

謝謝@siride,我擺脫了我的代碼中的第一個查詢,並根據您的建議更新了第二個查詢。 – Shane

回答

0

只是說你應該注意對潛在的SQL注入,在進入SQL語句之前將任何用戶可控的字符串轉義。例如,如果$row['user_id']是一個字符串,則必須執行mysqli_escape_string

好像你忘了你的代碼的東西:

$x = strtotime("7 days"); 

    $start_email = $row_email['start_time']; 
    $end_email = $row_email['end_time']; 

    if ($date_email <= date("m/d/Y l", $x)) { 

     if ($date_email !== date("m/d/Y l")) { // I think that you have a $x here? 
      if (!empty($address_email)) { 
       $address_email2 = explode(",", $row_email['address'], 2); 
       $email_content = $date_email . substr($date_email, 11) . " - " 
        . $location_name_email . ", " . $address_email2[0] . ", " 
        . $start_email . "-" . $end_email . "<br/>"; 
+0

每週一次的Cron作業運行這個腳本,沒有什麼是用戶控制的。所有信息都已存儲在數據庫中,我只是試圖提取特定用戶的信息,並通過電子郵件發送給他們。 $ date_email!== date(「m/d/Y l」)基本上是說,只要數據庫中的日期不等於今天的日期,那麼{run code}。 $ x基本上將今天的日期(日期(「​​m/d/Y l」))轉換爲日期,距離今天7天。我想要做的是獲取1周用戶的信息,然後將該信息通過電子郵件發送給該用戶,然後轉到下一個用戶,等等。 – Shane

+0

@Shane對不起,但也許我不明白你的問題。如果你有20個用戶,那麼你當然必須運行20次郵件()。如果你有20條消息,那麼你可以使用GROUP BY技術合併不同的消息。 –

+0

沒關係。考慮你和我在這種情況下是兩個用戶。我只想在符合條件時向您發送與我相關的信息,以及與您相關的信息。代碼說回聲「破」的地方;是我將運行郵件()的地方。我的代碼對於找到數據庫條目的每個實例都回顯「break」,這意味着對於找到數據庫條目的每個實例都會運行mail()函數......太多了。對不起,如果這不是一個好的解釋,找到合適的單詞有點棘手。我認爲我有一個想法,雖然... – Shane