2016-07-24 6 views
0

Пытается запустить сценарий, чтобы отправлять пользователям свои индивидуальные расписания из моей базы данных.PHP While Loop In Loop Loop

Код должен выглядеть следующим образом: выберите всех пользователей из Таблицы 1, где пользователи хотят получать еженедельную электронную почту.

Затем возьмите эти user_ids и выполнить запрос, чтобы получить еженедельные графики для каждого пользователя из таблицы 2.

Если дата в таблице 2 меньше или равно 1 недели с момента, когда код RAN, и он не соответствует сегодняшней дате, а затем задает переменную $ email_content.

Если дата в Таблице 2 превышает 1 неделю, код должен знать, что это сделано, и здесь вы хотели бы продолжить и отправить() информацию, собранную для этого пользователя, и отправить только эту информацию, чтобы только этого пользователя, а затем перейти к следующему пользователю.

Там, где говорится, что эхо «ломать», это по существу означает разделение между расписанием каждого пользователя, но оно повторяется примерно 20 раз. Эта часть в идеале станет местом, где я помещаю функцию mail(), поэтому я не могу выполнить функцию mail() 20 раз.

Я пробовал тонну различных вариантов этого кода, но, похоже, не понял. Подводя итог, мне нужно получить Info1 для user1, то почта Info1 к user1, а затем перейти к получить info2 для user2, то почта info2 Пользователю2 и т.д ...

<?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)' say вместо '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 Job запускает этот скрипт, и ничто не контролируется пользователем. Вся информация уже хранится в базе данных, я просто пытаюсь извлечь информацию, определенную для определенных пользователей, и отправить ее им по электронной почте. $ date_email! == date ("m/d/Y l") в основном говорит, если дата в базе данных не равна сегодняшней дате, тогда {run code}. $ x по существу преобразует сегодняшнюю дату (дата («m/d/Y l»)) в дату, 7 дней с сегодняшнего дня. То, что я пытаюсь сделать, это получить информацию для 1 пользователя в течение 1 недели, затем отправить эту информацию этому пользователю, а затем перейти к следующему пользователю и т. Д. – Shane

+0

@Shane Извините, но, может быть, я не понял вашу проблему четко. Если у вас 20 пользователей, вам, разумеется, придется запускать почту() 20 раз. Если у вас есть 20 сообщений, возможно, вы можете объединить разные сообщения, используя технику GROUP BY. –

+0

Все нормально. Рассмотрим, что вы и я являемся двумя пользователями в этом сценарии. Я просто хочу отправить вам информацию, связанную со мной, и информацию, связанную с вами, вам, пока выполняется условие. Где код говорит echo «break»; где я буду запускать почту(). Мой код повторяет «break» для каждого экземпляра, где найдена запись в базе данных, что означает, что функция mail() будет запущена для каждого экземпляра, где будет найдена запись в базе данных ... чего слишком много.Извините, если это не очень хорошее объяснение, сложно найти правильные слова. Я думаю, что у меня есть идея, хотя ... – Shane