2010-11-27 7 views
0

J'essaye d'envoyer des courriels automatisés par au timestamp. J'ai un ensemble d'horodatages Unix dans une base de données. Je les tire, puis essaye de les comparer les uns aux autres. La partie qui casse à la fin. Foreach ne renvoie pas les ID eblast corrects. Je pense que je soustrais correctement les timestamp unix mais je ne suis pas sûr. Je veux que l'instruction if ne se déclenche que si l'horodatage de la base de données est 15 minutes avant l'horodatage actuel. Je ne veux que le feu si c'est n'importe quand avant 15 minutes de l'horodatage de la DB. Si c'est après l'horodatage de la DB alors ne rien faire. J'espère que cela a du sens.Array fois trouver un qui est 15 min avant le temps

session_start(); 
date_default_timezone_set('America/Chicago'); 

error_reporting(E_ALL); 
include 'DB.php'; 

$timestamp = time(); 

echo 'Timestamp:'; 
echo $timestamp; 
echo '------'; 

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

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

//this is the ID's of eblasts that need an email sent based on their drop_dead NOT on warning1, warning2 and due_date. 
print_r($final_email_id); 

foreach($final_email_id as $key => $value) { 
$query = mysql_query("SELECT warning_1 FROM eblasts WHERE ID = '$key'") or die(mysql_error()); 
$find_warning_1 = mysql_fetch_row($query); 
$warning_1[$key] = $find_warning_1[0]; 
} 
//this is the warning_1 numbers where the ID's of the array are the ID's of the eblast. 
print_r($warning_1); 

foreach($final_email_id as $key => $value) { 
$query = mysql_query("SELECT warning_2 FROM eblasts WHERE ID = '$key'") or die(mysql_error()); 
$find_warning_2 = mysql_fetch_row($query); 
$warning_2[$key] = $find_warning_2[0]; 
} 

//this is the warning_2 numbers where the ID's of the array are the ID's of the eblast. 
print_r($warning_2); 

foreach($final_email_id as $key => $value) { 
$query = mysql_query("SELECT due_date FROM eblasts WHERE ID = '$key'") or die(mysql_error()); 
$find_due_date = mysql_fetch_row($query); 
$due_date[$key] = $find_due_date[0]; 
} 

//this is the due date numbers where the ID's of the array are the ID's of the eblast. 
print_r($due_date); 

//Add 900 because its 15 minutes in seconds ... 
$run_time = $timestamp + 900; 

foreach($warning_1 as $key => $value){ 
$diff_time = $run_time - $warning_1[$key]; 
echo '-----'; 
echo $diff_time; 
echo '-----'; 
if($diff_time < 900 && $diff_time > 0){ 
echo 'different'; 
echo $diff_time; 
$_SESSION['eblast_id'] = $key; 
include 'warning_1.php'; 
} 
}; 

Répondre

1

En supposant que les warning_x champs sont horodatages aussi, cela devrait faire l'affaire:

$timestamp = time(); 

$query = sprintf(
    'SELECT id, warning_1' . 
    ' FROM eblast' . 
    ' WHERE (UNIX_TIMESTAMP(warning_1) - %u) BETWEEN 1 AND 899', 
    $timestamp 
); 

while ($row = mysql_fetch_array($query, MYSQL_NUM)) { 
    $ids[$row[0]] = $row[1]; 
}; 

var_dump($ids); 
... 
+0

Nice - mais où le serveur MySQL et le serveur exécutant la DB ne sont pas dans le même fuseau horaire et je fait un ensemble timezone to CST au début du script ... ça ne tourne pas rond? –

+0

Oui, cela pourrait causer des problèmes, selon la configuration de la base de données. J'ai mis à jour mon message pour refléter cela. – aefxx

+1

+1 - faites-le dans la base de données, pas en PHP. Votre vie sera plus facile si vous travaillez toujours avec les horodateurs UTC et convertissez les fuseaux horaires lorsque vous faites des entrées/sorties à l'utilisateur. –

0

Pourquoi ne modifiez-vous pas votre première requête SQL pour sélectionner uniquement les enregistrements avec une colonne d'horodatage inférieur à l'heure actuelle moins une valeur de 15 minutes de secondes?