IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[PHP 5.4] Problème foreach avec PDO


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut [PHP 5.4] Problème foreach avec PDO
    Bonjour,

    j'ai un problème un peu curieux et je ne trouve pas le pourquoi du comment !

    J'ai un code de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql = "SELECT * FROM du_listing_emails_clients WHERE actif = 1";
    $r = $this->pdo->query($sql);
     
    $liste = $r->fetchAll(PDO::FETCH_ASSOC);
    Jusque là tout va bien, ma liste contient 317 lignes.
    Ensuite je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach ( $liste as $destinataire) {
        $res = $email->envoiEmailEnqueteClients ( $destinataire['email'], $fichier );
     
    }
    La fonction envoiEmailEnqueteClients utilise PHPMailer pour envoyer un email avec une PJ.

    Pour les tests, j'ai mis mon adresse email partout de sorte que je dois recevoir 317 emails !

    Sauf que j'en reçois plus de 420 ! Comme si la boucle recommençait plusieurs fois...

    J'ai fait un test en faisant juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $i = 0;
    foreach ( $liste as $destinataire) {
        //$res = $email->envoiEmailEnqueteClients ( $destinataire['email'], $fichier );
        $i++;
    }
    var_dump($i);
    Et là j'ai bien uniquement mes 317 lignes.

    Est-ce que ça aurait un rapport avec le temps d'envoi du mail (plus long) qui ferait que la boucle perd les pédales ???

    Merci d'avance à tous

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    C'est possible, ce qui est sûr c'est qu'un serveur de mail qui reçoit 317 messages vers la même adresse mail à la même seconde et avec le même message risque lui en effet de perdre un peu les pédales

    Bref, je pense que tu n'auras pas de problème si tu en envoies vers 317 adresses mails différentes, mais pour faire respirer un peu le serveur de mail, tu peux faire une pause de 5 secondes tous les 100 mails par exemple.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    En fait j'ai fait un essai en faisant un sleep(1) entre chaque email mais ça ne change rien. Je vais essayer un sleep un peu plus long tous les 100 mails voir si ça change quelque chose...

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Si tu as de "gros" besoins d'envoi de mail une solution est d'utiliser un cron pour envoyer les mail par paquets de X mail...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    En fait non, je n'ai pas de gros besoin, juste 300 emails une fois dans l'année pour une collègue...

    Ceci dit, j'ai fait un autre test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $liste = $oListing->getListingClients();
     
    foreach ( $liste as $key => $destinataire) {
        $res = $email->envoiEmailEnqueteClients ( $destinataire['email'], $fichier );
        if ($res == true) {
          $oListing->updateEnvoiEmail($destinataire['idemail_client']);
        }
        sleep(5);
        $i++;
      }
      var_dump ( $i);
    J'ai limité le nombre d'envois à 5 avec une pause de 5 secondes entre chaque envoi. Et en plus je mets un champ email_envoye à 1 dans la bdd lorsque l'email est parti.

    à la fin $i donne bien 5, mais j'ai 10 lignes de bdd mises à 1 et 10 mails reçus.

    Donc on dirait que la page s’exécute 2 fois ! Et je ne comprends absolument pas pourquoi étant donné qu'elle ne fait rien d'autre et qu'il n'y a aucune autre boucle.

    J'ai déjà eu ce problème aussi avec des update en bdd au lieu d'envoi d'email sans jamais comprendre pourquoi. Pourtant mon site fonctionne très bien en dehors de ça...

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Je ne vois nulle part dans ta boucle que tu sort quand $i = 5 ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Je ne vois nulle part dans ta boucle que tu sort quand $i = 5 ?
    J'ai pas besoin de sortir, j'ai limité dans ma requête à 5 lignes, donc mon $liste contient 5 éléments.
    J'ai essayé aussi "au cas où" de faire un break; si $i=5 mais ça ne change rien...

Discussions similaires

  1. [PDO] [PHP 5.3] Problème de connexion persistante avec PDO
    Par Benjamin Delespierre dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/03/2012, 14h24
  2. [PHP-JS] Problème affichage avec structure if
    Par kitty2006 dans le forum Langage
    Réponses: 31
    Dernier message: 07/09/2006, 18h01
  3. [PHP-JS] Mini problème avec les "" et les ''
    Par grumly22 dans le forum Langage
    Réponses: 15
    Dernier message: 22/06/2006, 13h52
  4. [Tableaux] Problème de foreach avec des checkboxes
    Par nanor21 dans le forum Langage
    Réponses: 10
    Dernier message: 15/05/2006, 01h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo