Optimisation code pour envoi mail de bon anniversaire

Bonjour,

Je souhaite un script qui envoie un mail pour souhaiter un bon anniversaire aux inscrits de mon site.

J’utilise php 7.4 avec framwork symfony 5.2.4

j’ai créé une commande que je compte intégrer sur cron

je crois que la détection de la date d’anniv passe mal !!

la partie du code est la suivante:

$clients = $this->repo->findAll();
 
        foreach ($clients as $client) {
 
          $birthday = Carbon::parse($client->getBirthday())->format('MM-DD');
 
          $today = Carbon::today()->format('MM-DD');
 
          $birthdaynow = ($birthday == $today);
 
          if ($birthdaynow) {
 
            $email = (new EmailNotification())
                ->to($client->getEmail())
                ->subject("Happy Birthday")
........

La date Anniversaire sur ma BD colonne « Birthday » est de genre 1990-07-06

Merci d’avance

À première vu, je dirai déjà qu’il peut y avoir un problème dans ta conversion de la date au format « YYYY-MM-DD » vers un objet date : tu utilises Carbon::parse, qui essaye de détecter automatiquement le format de la date, mais je ne sais pas comment il se comporte quand la date que tu lui donnes peut correspondre à deux formats différents (1990-07-06 ça peut être le 6 juillet ou le 7 juin…).

Comme dans ton cas tu sais précisément dans quel format la date est, je pense qu’il est préférable d’utiliser les fonctions de date standard de PHP pour les dates (strptime et strftime), où tu spécifies systématiquement le format, plutôt qu’un parseur plus complexe qui essaye de deviner le format de date.

Si tu utilises Doctrine pour modéliser tes objets et faire les requêtes en base, tu dois normalement même pouvoir te passer complètement de toutes ces conversions explicites, en indiquant sur ton objet que le champ birthday est de type Date. La conversion en objet Date sera alors automatique, et tu pourras directement comparer $client->getBirthday() à $today (en l’initialisant avec date.today() ).

Autre petit truc, même si c’est un détail et pas la raison pour laquelle ça ne marche pas, sort de la boucle la ligne :

$today = Carbon::today()->format('MM-DD');

Puisque cette date est constante, inutile de la recalculer à chaque itération de la boucle.

même sans carbon c’est pareil

foreach ($clients as $client) {

          $birthDay = $client->getBirthday();
			$birthday = $birthDay->format('d-m');
          echo "afficher $birthday ";
			
			$today = date('d-m');
          echo "afficher $today ";
			

          if ($birthday == $today) {
 $email = (new EmailNotification())

Et du coup, ça veut dire quoi « c’est pareil » ?

Parce que si tu ne nous en dit pas un peu plus sur ce qu’il se passe par rapport à ce qui est attendu, c’est compliqué d’aider hein…

Je voulais dire par c’est pareil, que ça envoi pas le mail aux personnes dont l’anniversaire est aujourd’hui.
PS: sachant que la partie mail est bien configurée en bas de code cité

Certes… Mais du coup, ça donne quoi quand tu traces un peu l’exécution du code ?

Tu as ajouté des echo, qu’est ce que ça donne ?

Et le bloc if, est-ce que tu rentres dedans ou pas ?

Debugger du code quand on l’a sous la main et qu’on peut l’exécuter, c’est déjà pas toujours simple, mais sans aucune info sur comment il s’exécute, ça devient presque impossible…

1 « J'aime »