2010-11-19 5 views
0

Es gibt 6 Felder in der Tabelle namens eblasts. ID, Nachricht, drop_dead, warning1, warning2 und due_date. drop_dead, due_date, warning1 und warning2 sind alle Unix-Zeitstempel. Ich muss eine E-Mail senden, wenn diese Zeit vorbei ist. Ich möchte also das drop_dead-Datum in der Datenbank nachschlagen (was der späteste Zeitpunkt ist, an dem eine E-Mail gesendet werden sollte), wie es mit der aktuellen Zeit verglichen wird. Wenn seine Vergangenheit drop_dead dann nichts tun. Wenn es vor drop_dead ist, dann muss es eine E-Mail senden.Beste Lösung für automatisierte E-Mails basierend auf Unix-Zeitstempel

In dieser E-Mail muss ich noch zwei andere Tabellen (Kontakte und Firmen) Querverweis. Die Kontakte sind über die Spalte company_id in der Kontakttabelle mit jeder Firma verbunden (für eine Firma kann es mehrere Kontakte geben). Ich habe auch eine andere Tabelle, die hat, ob sie geantwortet haben oder nicht (eblast_id, company_id, timestamp). Nur diejenigen, die nicht geantwortet haben, müssen per E-Mail benachrichtigt werden.

Sinn machen? Irgendwelche Ideen, wie man das macht oder wo ich anfangen soll? Mein Gehirn ist gebraten von dem Versuch, das herauszufinden.

Das ist es, was ich bisher gemacht habe ... helfe nur, die Teile zusammenzufügen/die fehlenden Punkte auszufüllen.

$timestamp = time(); 

$drop_dead = mysql_query("SELECT drop_dead, ID, warning_1 FROM eblasts") or die(mysql_error()); 

while ($row = mysql_fetch_array($drop_dead, MYSQL_NUM)) { 
     $last_time[$row[1]] = $row[0]; 
     $last_time[$row[1]] = $row[2]; 
}; 

print_r($last_time); 

foreach($last_time as $key => $value) { 
    if($timestamp < $value){ 
     $final_email[] = $key; 
     }; 
    }; 

if(){ 
    $find_franchise = mysql_query("SELECT * FROM franchisees") or die(mysql_error()); 
    while ($row = mysql_fetch_array($find_franchise, MYSQL_NUM)) { 
     $franchise_id[] = $row[0]; 
    } 
    $find_responded = mysql_query("SELECT franchise_id FROM participation"); 
    while ($row = mysql_fetch_array($find_responded, MYSQL_NUM)) { 
     $part_franchise[] = $row[0];  
    } 
    $to_email_franchise_id = array_diff($franchise_id, $part_franchise); 
} 

Vielen Dank im Voraus.

-Adam

+0

Scheint ziemlich einfach, Adam. Wo kommen Sie konkret auf Probleme? – webbiedave

+0

Ich habe mit etwas zusätzlichen Code bearbeitet, der hoffentlich als Ausgangspunkt für die Diskussion dienen wird. –

Antwort

1

Werfen Sie einen Blick auf die UNIX_TIMESTAMP MySQL-Funktion: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_unix-timestamp

Auf den Punkt gebracht:

SELECT * FROM `eblasts` WHERE `drop_dead` < UNIX_TIMESTAMP(NOW()); 

Der Nachteil dieser Methode ist jedoch, dass der Zeitstempel wird neu bewertet werden auf jede Abfrage, und es wird zu vielen nutzlosen Systemaufrufen führen.

Dies wäre effizienter:

SET @cutoff = UNIX_TIMESTAMP(NOW()); 
SELECT * FROM `eblasts` WHERE `drop_dead` < @cutoff; 

Allerdings, wenn Ihr ursprünglicher Unix-Zeitstempel (die in der DB) direkt von PHP kommt, würde ich vorschlagen, dass Sie Ihre Cutoff-Berechnung mit der time() Funktion von PHP statt Dies gilt insbesondere, wenn Ihr MySQL-Server nicht auf demselben physischen Computer ausgeführt wird. Auf diese Weise vermeiden Sie es, die Nachricht zu spät zu senden, wenn das Datum/die Uhrzeit (oder die Zeitzone) des MySQL-Servers nicht mit denen Ihres Webservers übereinstimmt.

Verwandte Themen