2016-07-24 6 views
0

Versuch, ein Skript auszuführen, um Benutzern ihre individuellen Zeitpläne aus meiner Datenbank zu senden.PHP While-Schleife in einer While-Schleife

Der Code sollte so gehen ... Wählen Sie alle Benutzer aus Tabelle 1, in denen Benutzer ihre wöchentlichen E-Mails wünschen.

Dann diese benutzerkennungen nehmen und eine Abfrage ausführen, die Wochenpläne für jeden Benutzer aus Tabelle 2

zu erhalten, wenn das Datum in der Tabelle 2 ist kleiner als oder gleich 1 Woche ab, wenn der Code ran, und es entspricht nicht dem heutigen Datum, dann setze die Variable $ email_content.

Wenn das Datum in der Tabelle 2 1 Woche überschreitet, dann sollte der Code wissen, dass es getan ist, und hier möchte ich die Informationen für diesen Benutzer mailen() und senden nur diese Informationen, um Nur dieser Benutzer, dann weiter zum nächsten Benutzer.

Wo es Echo "Pause" bedeutet, markiert es im Wesentlichen die Trennung zwischen den einzelnen Benutzer Zeitplan, aber es hallt etwa 20 Mal. Dieser Teil wird idealerweise zu dem, wo ich die mail() -Funktion ablege, damit ich die mail() -Funktion auch 20 mal ausführen kann.

Ich habe eine Tonne verschiedener Varianten dieses Codes ausprobiert, aber ich kann es nicht richtig finden. Zusammenfassend muss ich info1 für user1 bekommen, dann info1 zu user1 Mail, dann bewegen info2 für user2 zu bekommen, dann info2 Mail an Benutzer2, etc ...

<?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

Keine Notwendigkeit für zwei Abfragen. Verwenden Sie einfach eine Unterabfrage. Wo du 'IN ($ id)' sagst anstatt 'IN (SELECT user_id VON XXXXXX WHERE weekly_email = 'Yes)' – siride

+0

Du vergleichst zwei Strings in deinen if-Blöcken, wenn du stattdessen Zeitstempel vergleichen willst. Ist zum Beispiel "Donnerstag"> "Sonntag"? – Drakes

+0

Vielen Dank @siride, ich habe die erste Abfrage in meinem Code los und aktualisiert die 2. mit Ihrer Empfehlung. – Shane

Antwort

0

Nur zu sagen, dass Sie achten sollten Bei einer möglichen SQL-Injection können Sie alle vom Benutzer steuerbaren Strings vor dem Einlesen in die SQL-Anweisung zurückgeben. Zum Beispiel, wenn $row['user_id'] ein String ist, dann müssen Sie ausführen mysqli_escape_string

Scheint so, dass Sie etwas in Ihrem Code vergessen:

$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

Ein wöchentlicher Cron-Job führt dieses Skript aus, und nichts wird vom Benutzer gesteuert. Alle Informationen sind bereits in der Datenbank gespeichert, ich versuche nur spezifische Informationen für bestimmte Benutzer zu extrahieren und sie per E-Mail zu versenden. $ date_email! == date ("m/d/Y l") sagt grundsätzlich, solange das Datum in der Datenbank nicht mit dem heutigen Datum übereinstimmt, dann {run code}. $ x konvertiert im Wesentlichen das heutige Datum (Datum ("m/d/Y l")) in das Datum, 7 Tage von heute. Was ich versuche, ist, Informationen für 1 Benutzer für 1 Woche zu erhalten, dann diese Informationen an diesen Benutzer zu mailen, und dann zum nächsten Benutzer weiterzugehen, und so fort. – Shane

+0

@Shane Sorry, aber vielleicht habe ich dein Problem nicht klar verstanden. Wenn Sie 20 Benutzer haben, müssen Sie natürlich mail() 20 Mal ausführen. Wenn Sie 20 Nachrichten haben, können Sie möglicherweise verschiedene Nachrichten mit der GROUP BY-Technik zusammenführen. –

+0

Es ist in Ordnung. Betrachten Sie und ich sind zwei Benutzer in diesem Szenario. Ich möchte nur Informationen zu mir, zu mir und zu Ihnen verwandten Informationen an Sie senden, solange eine Bedingung erfüllt ist. Wo der Code sagt "Pause" Echo; ist wo ich mail() laufen lassen würde. Mein Code gibt für jede Instanz, bei der ein Datenbankeintrag gefunden wird, einen "Break" aus, was bedeutet, dass die Funktion mail() für jede Instanz ausgeführt wird, in der ein Datenbankeintrag gefunden wird ... was zu viele ist.Tut mir leid, wenn das keine gute Erklärung ist, es ist etwas schwierig, die richtigen Worte zu finden. Ich denke, ich habe eine Idee ... – Shane