2017-08-11 3 views
0

J'ai un morceau de code qui affichera les résultats et les comparaisons d'un nombre (3) de requêtes de base de données dans un navigateur. Il affiche les différences dans les chiffres de chaque DB. Cela fonctionne et tout va bien. Maintenant, ce que je dois faire est d'oublier la page Web et d'avoir le script php exécuté une fois par jour, disons à 3h du matin, et le script doit chercher toute différence dans les chiffres de DB pour la journée précédente. Si des différences sont découvertes, en utilisant Amazon Simple Notifications Service, un email sera envoyé à tous les abonnés avec les détails de ces différences. Voici la partie de mon code qui est nouveau à partir du script de travail précédent (celui du navigateur):Récupérer les données des jours précédents (script PHP), et envoyer des données en utilisant Amazon SNS

if ($total_results) { 
    foreach ($total_results as $cid => $dates) { 

     foreach($dates as $row) {   
     $dbOne_total = $row['dbOne_total']; 
     $dbTwo_total = $row['dbTwo_total']; 
     $dbThree_total = $row['dbThree_total']; 
     $difference = ($dbTwo_total - $dbOne_total); 
     $difference_bill = ($dbThree_total - $dbOne_total); 


     $mismatchFile = fopen("mismatch.txt", "w"); 
     $issue = ""; 
     while($startDate == date('Y-m-d', strtotime('-1 day'))) { 
      if (($difference_bill > 0) || ($difference > 0)) { 
       $issue = ($row["company"] ." ". $row["company_id"]. " ". "dbTwo Difference". " ". $difference. " "."dbThree Difference". " ". $difference_bill); 
       print_r($issue); 
       topic("DATABASE-MISMATCH")->send("List of mismatches between databases", "Issue: $issue/n"); // for ASN 

      } 
     } 
     fwrite($mismatchFile, $issue); 
     fclose($mismatchFile); 
    } 
} 

$ startDate est une variable que je utilise à travers le code que j'ai requêtes SQL en cours d'exécution qui ont besoin de cette date pour obtenir l'info. Je questionne cette ligne:

while($startDate == date('Y-m-d', strtotime('-1 day'))) { 

Je ne sais pas si strtotime est la meilleure option (je suis inquiet au sujet d'éventuels problèmes de format). Y a-t-il un meilleur moyen d'obtenir les données de la veille? Je me demande si j'aborde ce problème de la bonne façon? J'apprécierais également n'importe quel conseil sur comment la variable $ issue dans le corps d'email d'Amazon SNS, comme liste, ou serait-il mieux de créer un dossier et l'envoyer en pièce jointe? Je suis encore tout à fait un débutant à PHP et donc toute aide, ou un point utile dans la bonne direction, serait tellement appréciée.

Répondre

0

while($startDate == date('Y-m-d', strtotime('-1 day'))) est une approche erronée. Il retourne toujours true et le cycle est infini.

Si vous voulez juste un temps day before, utilisez

$date = new \DateTime('now - 1 day'); 
echo $date->format('Y-m-d'); 

Si vous avez besoin de le faire dans une boucle

$date = new \DateTime(); // now here 
for($i = 1; $i <= 10; $i++) { 
    $date->sub(new \DateInterval('P' . $i . 'D'); // $i days before, $i>0 
}