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 :

envoi de mail avec requête SQL dans corps du message


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut envoi de mail avec requête SQL dans corps du message
    Bonjour,

    J'ai mis une tache CRON en place pour pouvoir recevoir un récapitulatif de toutes les commandes du jour par la suite.
    Ma tache CRON m'envoie bien un mail mais je n'arrive pas à trouver des solutions pour recevoir ce tableau dans le corps de ce message ( normalement c'est sensé etre un PDF mais commençons simple), actuellement je n'ai noté qu'en dur, je devrai mettre les variables mais cela ne marche pas, je déclare peut etre mon code dans le mauvais sens
    Actuellement j'ai crée une requête pour exporter ma BDD en PDF via un bouton .
    Ce code, vu qu'il marche très bien, j'aimerai pouvoir le réutilisé dans mon deuxième fichier qui marche très bien dans l'envoi de mail
    Je suis une grande débutante en PHP,

    code de l'export

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    <?php 
    //connexion à ma BDD perso
    $connect = mysqli_connect("..", "..", "..", "..");
     
     
    if(isset($_POST["submit"]))
    {
     $query = "SELECT identifiant,nom,prenom,adresse,complementAdresse,ville,codePostal,mail,fixe,portable,kit,tube,aiguille,adaptateur,cartonSmall,cartonBig,etiquetteChronopost,enveloppeBulle,commentaire,dateCommande FROM exemple";
     $res = mysqli_query($connect, $query);
     if(mysqli_num_rows($res) > 0)
     {
     $export = '
     <table> 
     <tr> 
     
     <th>identifiant</th> 
     <th>nom</th> 
     <th>prenom</th>
     <th>adresse</th> 
     <th>complement adresse</th>
     <th>ville</th>
     <th>code postal</th>
     <th>mail</th>
     <th>fixe</th>
     <th>portable</th>
     <th>nbre de kits</th>
     <th>nbre de tubes</th>
     <th>nbre aiguilles</th>
     <th>nbre adaptateur</th>
     <th>nbre petit carton</th>
     <th>nbre grand carton</th>
     <th>nbre etiquette chronopost</th>
     <th>nbre enveloppe bulle</th>
     <th>commentaire</th>
     <th>date commande</th>
     
     </tr>
     ';
     while($row = mysqli_fetch_array($res))
     {
     $export .= '
     <tr>
    
     <td>'.$row["identifiant"].'</td> 
     <td>'.$row["nom"].'</td> 
     <td>'.$row["prenom"].'</td>
     <td>'.$row["adresse"].'</td> 
     <td>'.$row["complementAdresse"].'</td> 
     <td>'.$row["ville"].'</td> 
     <td>'.$row["codePostal"].'</td>
     <td>'.$row["mail"].'</td>
     <td>'.$row["fixe"].'</td>
     <td>'.$row["portable"].'</td>
     <td>'.$row["kit"].'</td>
     <td>'.$row["tube"].'</td>
     <td>'.$row["aiguille"].'</td>
     <td>'.$row["adaptateur"].'</td>
     <td>'.$row["cartonSmall"].'</td>
     <td>'.$row["cartonBig"].'</td>
     <td>'.$row["etiquetteChronopost"].'</td>
     <td>'.$row["enveloppeBulle"].'</td>
     <td>'.$row["commentaire"].'</td>
     <td>'.$row["dateCommande"].'</td>
     
    
     
     
    
    
     
     
     </tr>
     ';
     }
     $export .= '</table>';
     header('Content-Type: application/xls');
     header('Content-Disposition: attachment; filename=commande-ifce.xls');
     echo $export;
     }
    }
     
    ?>
    code pour envoi de mail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    // Plusieurs destinataires
    $to  = '';
     
    // Sujet
    $subject = 'Calendrier des anniversaires pour Août';
     
    // message
    $message = '
         <html>
          <head>
           <title>Calendrier des anniversaires pour Août</title>
          </head>
          <body>
           <p>Voici les anniversaires à venir au mois d\'Août !</p>
           <table>
            <tr>
             <th>Personne</th><th>Jour</th><th>Mois</th><th>Année</th>
            </tr>
            <tr>
             <td>Josiane</td><td>3</td><td>Août</td><td>1970</td>
            </tr>
            <tr>
             <td>Emma</td><td>26</td><td>Août</td><td>1973</td>
            </tr>
           </table>
          </body>
         </html>
         ';
     
    // Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
    $headers[] = 'MIME-Version: 1.0';
    $headers[] = 'Content-type: text/html; charset=iso-8859-1';
     
    // En-têtes additionnels
    $headers[] = 'To: ';
    $headers[] = 'From: ';
    $headers[] = 'Cc: ';
    $headers[] = 'Bcc: ';
     
    // Envoi
    mail($to, $subject, $message, implode("\r\n", $headers));

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Qu'est-ce qui ne fonctionne pas exactement ?
    Le mail s'envoie bien ? Si oui, quel est le problème ?

    Pour info, par défaut, il n'est pas possible d'envoyer des mails en localhost (vu qu'il s'agit d'une CRON ici, j'imagine qu'on est bel et bien sur un serveur)

    Les codes présentés semblent être des placeholders qui présentent +/- ce que vous faites mais on sait très bien comment envoyer des mails en PHP donc c'est pas la peine de nous montrer comment il faudrait faire
    Montrez-nous plutôt comment vous faites actuellement ^^

    Quelques remarques :
    • Pour le corps du message, il n'est pas nécessaire de mettre tous les balises HTML, juste le corps du message est suffisant
    • Pour les headers, je pense qu'il est normalement incorrect d'écrire des headers en partie comme c'est écrit ici : To:, autant ne rien mettre à ce moment-là
    • Content-type: text/html ceci est le plus important pour pouvoir envoyer des mails au format HTML donc bien vu
    • charset=iso-8859-1 on est plus dans les années 90, préférez le format UTF-8 (pareil au niveau du dev) ça évite de s'arracher les cheveux ^^
    • Sinon, tout semble correct à première vue mais on voit que le code a été bcp modifié pour être mis sur le forum...
    • Pour ce qui est de la construction du tableau, si ça fonctionne pour le fichier XLS, ça devrait fonctionner, faut juste créer une fonction qui créé le tableau en HTML, et n'afficher les headers que là où c'est nécessaire
    • Pour joindre un fichier au mail, il faut d'abord le sauvegarder quelque part sur le serveur, le joindre via les headers de mail() (et p-e supprimer le fichier après l'envoi)


    PS : en vérifiant via la documentation, je me rends compte que vous avez copié/collé l'exemple de base de la doc PHP : https://www.php.net/manual/fr/functi...p#example-3073
    A moins que vous ayez un problème à faire fonctionner cet exemple, et comme je le disais, ça ne sert à rien de nous montrer un code par défaut, on sait comment fonctionne la fonction mail() ^^


    EDIT : Voici le genre de code que j'expliquais avec l'utilisation d'une fonction.
    J'ai également retirer le PHP pour toute la partie HTML car c'est quand même vachement embêtant et compliqué d'écrire plein d'HTML dans un string PHP (en plus on a pas droit à l'indentation, ni à la colorisation syntaxique)
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <?php
    //connexion à ma BDD perso
    $connect = mysqli_connect("..", "..", "..", "..");
     
    // On crée une function qui va s'occuper de créer le tableau
    // De cette façon, on pourra facilement l'intégrer à plusieurs endroits
    function export($echo = true) {
        $connect = $GLOBALS['connect'];
        $query = "SELECT identifiant,nom,prenom,adresse,complementAdresse,ville,codePostal,mail,fixe,portable,kit,tube,aiguille,adaptateur,cartonSmall,cartonBig,etiquetteChronopost,enveloppeBulle,commentaire,dateCommande FROM exemple";
        $res = mysqli_query($connect, $query);
        // ob_start() permet de "temporiser la sortie"
        // en gros, on va empêcher tout affichage jusqu'à utiliser ob_get_clean() pour récupérer ce qui a été intercepté
        ob_start();
        if (mysqli_num_rows($res) > 0) :
            ?>
            <table> 
                <tr> 
                    <th>identifiant</th> 
                    <th>nom</th> 
                    <th>prenom</th>
                    <th>adresse</th> 
                    <th>complement adresse</th>
                    <th>ville</th>
                    <th>code postal</th>
                    <th>mail</th>
                    <th>fixe</th>
                    <th>portable</th>
                    <th>nbre de kits</th>
                    <th>nbre de tubes</th>
                    <th>nbre aiguilles</th>
                    <th>nbre adaptateur</th>
                    <th>nbre petit carton</th>
                    <th>nbre grand carton</th>
                    <th>nbre etiquette chronopost</th>
                    <th>nbre enveloppe bulle</th>
                    <th>commentaire</th>
                    <th>date commande</th>
     
                </tr>
                <?php while ($row = mysqli_fetch_array($res)) : ?>
                    <tr>
                        <td><?= $row["identifiant"]; ?></td> 
                        <td><?= $row["nom"]; ?></td> 
                        <td><?= $row["prenom"]; ?></td>
                        <td><?= $row["adresse"]; ?></td> 
                        <td><?= $row["complementAdresse"]; ?></td> 
                        <td><?= $row["ville"]; ?></td> 
                        <td><?= $row["codePostal"]; ?></td>
                        <td><?= $row["mail"]; ?></td>
                        <td><?= $row["fixe"]; ?></td>
                        <td><?= $row["portable"]; ?></td>
                        <td><?= $row["kit"]; ?></td>
                        <td><?= $row["tube"]; ?></td>
                        <td><?= $row["aiguille"]; ?></td>
                        <td><?= $row["adaptateur"]; ?></td>
                        <td><?= $row["cartonSmall"]; ?></td>
                        <td><?= $row["cartonBig"]; ?></td>
                        <td><?= $row["etiquetteChronopost"]; ?></td>
                        <td><?= $row["enveloppeBulle"]; ?></td>
                        <td><?= $row["commentaire"]; ?></td>
                        <td><?= $row["dateCommande"]; ?></td> 
                    </tr>
                <?php endwhile; ?>
            <?php endif; ?>
        </table>
        <?php
        // On va intercepter tous les contenus affichés depuis ob_start() et les mettre dans une variable
        $export_content = ob_get_clean();
        // Par défaut on peut echo la variable mais on peut faire en sorte de la retourner
        if ($echo) {
            echo $export_content;
        }
        return $export_content;
    }
     
    if (!empty($_POST['action'])) {
        switch ($_POST['action']) {
            case 'export':
                header('Content-Type: application/xls');
                header('Content-Disposition: attachment; filename=commande-ifce.xls');
                export();
                break;
            case 'mail':
                $to = "email@domain.tld";
                $subject = "Export de données";
                $message = "<p>Résultat de l'export : </p>" . export(false);
                $headers = [
                    'Content-Type: text/html; charset=UTF-8',
                ];
                mail($to, $subject, $message, $headers);
                break;
        }
    }

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Je sais concernant l'encodage, je l'ai modifié en UFT-8 ( c'était pas très grave )
    Je sais concernant l'envoi de mail donc il est sur mon hébergement ( sinon je ne recevrai pas le mail)
    En faite, ce sont 2 fichiers séparés..
    au début pour cette histoire de tableau Excel, j'avais proposé un bouton pour qu'il exporte le fichier sauf qu'il le veuille par mail automatisé.
    Donc au début, j'ai pris un fichier pour un envoi du mail pour mettre en place le CRON ( c'étais une première pour moi de mettre en place ceci et je ne savais mm pas quel était le script PHP)
    Entre temps, j'ai essayé de mixer un peu les 2 fichiers pour obtenir un résultat.
    Je reçois bien donc ce mail avec mon tableau de mes données SQL sauf que j'ai essayé de mettre un peu de style, seul le tableau Excel prend mon style et nom le corps de mon message .
    Je devrai peut etre enlever ce fichier Excel car si je reçois par mail , j'en n'ai plus besoin.( dans un premier temps, car la demande initiale, c'est en mail automatisé avec un ce fichier en PDF)
    Mais je vais étape par étape
    Maintenant, il faudra que je teste si la mise à jour lors de ma BDD interviens bien dans le mail et que je reçois bien les nouvelles commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    <?php
    //connexion à ma BDD perso
    $connect = mysqli_connect("..b", "..", "..", "..");
     
     
     
    $query = "SELECT identifiant,nom,prenom,adresse,complementAdresse,ville,codePostal,mail,fixe,portable,kit,tube,aiguille,adaptateur,cartonSmall,cartonBig,etiquetteChronopost,enveloppeBulle,commentaire,dateCommande FROM exemple";
    $res = mysqli_query($connect, $query);
    $export = '
    <h1 style="text-align:center"> recapitulatif de toutes les commandes </h1>
     <table> 
    
     <tr  style="border:1px solid black; height:30px"> 
    
     <th>identifiant</th> 
     <th>nom</th> 
     <th>prenom</th>
     <th>adresse</th> 
     <th>complement adresse</th>
     <th>ville</th>
     <th>code postal</th>
     <th>mail</th>
     <th>fixe</th>
     <th>portable</th>
     <th>nbre de kits</th>
     <th>nbre de tubes</th>
     <th>nbre aiguilles</th>
     <th>nbre adaptateur</th>
     <th>nbre petit carton</th>
     <th>nbre grand carton</th>
     <th>nbre etiquette chronopost</th>
     <th>nbre enveloppe bulle</th>
     <th>commentaire</th>
     <th>date commande</th>
     
     </tr>
     ';
    while ($row = mysqli_fetch_array($res)) {
        $export .= '
        
     <tr  style="border-right:1px solid black; margin:10px">
    
     <td>' . $row["identifiant"] . '</td> 
     <td>' . $row["nom"] . '</td> 
     <td>' . $row["prenom"] . '</td>
     <td>' . $row["adresse"] . '</td> 
     <td>' . $row["complementAdresse"] . '</td> 
     <td>' . $row["ville"] . '</td> 
     <td>' . $row["codePostal"] . '</td>
     <td>' . $row["mail"] . '</td>
     <td>' . $row["fixe"] . '</td>
     <td>' . $row["portable"] . '</td>
     <td>' . $row["kit"] . '</td>
     <td>' . $row["tube"] . '</td>
     <td>' . $row["aiguille"] . '</td>
     <td>' . $row["adaptateur"] . '</td>
     <td>' . $row["cartonSmall"] . '</td>
     <td>' . $row["cartonBig"] . '</td>
     <td>' . $row["etiquetteChronopost"] . '</td>
     <td>' . $row["enveloppeBulle"] . '</td>
     <td>' . $row["commentaire"] . '</td>
     <td>' . $row["dateCommande"] . '</td>
     
    
     
     
    
    
     
     
     </tr>
     ';
    }
    $export .= '</table>';
    header('Content-Type: application/xls');
    header('Content-Disposition: attachment; filename=commande-ifce.xls');
    echo $export;
     
     
     
    // Sujet
    $subject = 'commandes IFCE';
     
    // Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
    $headers[] = 'MIME-Version: 1.0';
    $headers[] = 'Content-type: text/html; charset=utf-8';
     
    // En-têtes additionnels
    $headers[] = 'To:..;
    $headers[] = 'From: ..;
    $headers[] = 'Cc: ..';
    $headers[] = 'Bcc: ..';
     
    // Envoi
    mail($to, $subject, $export, implode("\r\n", $headers));
    Nom : 2022-05-18_16h20_27.png
Affichages : 114
Taille : 17,7 Ko

    J'ai bien lu ton mail sauf que mon fichier PDF dois être généré par ma BDD ( dur de le stocker et de l'effacer non ?) donc ca me parait bien compliqué

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Déjà, les mails c'est compliqué... tant à envoyer qu'à rédiger
    Donc je déconseillerais d'afficher un tableau complexe dans le corps du mail car c'est compliqué à styliser (et limité également)

    Je ne vois aucun style dans ce tableau (à part à la ligne 14 : <tr style="border:1px solid black; height:30px">)
    En effet, si vous souhaitez ajouter du CSS dans votre mail, il faut joindre la feuille de style... et c'est là que les problèmes commencent
    Car on ne peut pas joindre de feuille de style. Mais il est possible d'écrire la CSS du mail à l'intérieur des tags <style></style> et de joindre ça à l'email ?
    Oui mais pas suffisant car certains clients mails ne le liront pas. Il faudra également ajouter du style inline (comme pour la ligne 14) pour bien faire

    J'ai bien lu ton mail sauf que mon fichier PDF dois être généré par ma BDD ( dur de le stocker et de l'effacer non ?) donc ca me parait bien compliqué
    Non c'est pas dur, sinon je n'aurais pas dit de le faire... mais là je travaille en mode "boule de cristal" ^^ vu qu'il n'y a ni explications précises, ni code
    En plus, vous parlez tout le temps de PDF mais le seul code qu'on voit parle d'un fichier Excel. Le format de fichier importe peu dans l'histoire mais c'est juste pour dire que je me base uniquement sur le code que j'ai pu voir

    Normalement, on génère un fichier qu'on va sauvegarder sur le serveur. Dans le cadre d'un PDF, on a le choix de l'output directement dans le navigateur ou pas. Si c'est le cas, le fichier n'est pas sauvegardé.
    Si le fichier a été sauvegardé (et uniquement s'il a été sauvegardé), on voit pouvoir l'ajouter aux attachements de notre mail.
    Ensuite, libre à vous de savoir s'il faut garder ce fichier sur le serveur pour une raison ou pour une autre mais souvent il n'est utile qu'à l'envoi du mail donc il suffit de le supprimer après que le mail a bien été envoyé.
    Il est également possible de supprimer le fichier que le fichier ait été envoyé ou non... ça dépend du code. Si par exemple vos fichiers ont toujours le même nom, si vos données peuvent changer d'une seconde à l'autre, si les exports sont différents... etc. A l'inverse, si vous avez beaucoup de données et qu'un export prend plusieurs heures, je garderais le fichier en cache et ne le supprimerais que si le mail a été envoyé histoire de ne pas devoir le regénérer s'il y a eu un problème durant l'envoi

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Bonjour,

    Effectivement j'ai essayé d'imprimer le mail et je n'ai que la moitié de mon tableau :-(

    J'avais juste mis des lignes au tableau coté style :-)

    Erreur de ma part en te parlant de PDF, aux dernières nouvelles, il s'agissait bien d'un fichier Excel ( car par la suite, il voudrons peut etre des statistiques)
    Leur demande n'est pas très clair, il me laisse leur proposé des solutions :-)
    Ne sachant pas vraiment encore son utilité , dur t'en dire plus ( est ce pour gérer les stocks ou pour voir les commandes du jour etc...)
    Apres c'est pas très grave, je devrai juste modifié ma requête selon leur besoins )

    Effectivement, ce fichier Excel dois être en pièce jointe.
    Encore jamais fait ce style de code :-(

    J'apprend chaque jour depuis 10 mois

    As tu un exemple ou un lien à me conseillez pour ce style :-)
    J'ai déjà vu de la documentation concernant les pièces jointes mais aucune généré depuis la BDD
    Je suis peut etre pas assez précise dans mes recherches google ?

    Mon export est petit enfin tout dépend, actuellement j'extrait toute la BDD mais au fil des commandes, celui risque d'être ingérable ( je sais , j'aurai pu mettre une * au lieu d'écrire toutes mes tables)
    Reste a voir les données qu'il veulent car actuellement à chaque commande, ils reçoivent un mail


    Pour te faire un résumé de ce travail, j'ai du créer un formulaire en PHP sur un site WordPress car ne sachant pas modifié les plugins de contact , je devais y mettre une api soap pour un remplissage automatique des champs mais aussi pour bloquer ce formulaire juste à nos clients
    Je n'enregistrais aucune donnée , cette demande est venue après :-)
    J'ai donc relié mon fichier de mon formulaire à une base de données et j'ai crée un bouton sur une page web pour exporter ce fichier .
    Sauf qu'ils aimeraient ne pas ce rendre sur cette page web pour extraire ce fichier mais le recevoir directement par mail :-)
    Donc je suis partie sur une tâche CRON

  6. #6
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Hello,

    En fait j'ai l'impression qu'il y a effectivement un petit soucis dans la réflexion

    J'ai l'impression que tu cherches un script qui fasse l'export dans un attachement
    En réalité, ça n'existe pas. Le seul truc qui existe c'est une succession d'étapes pour aboutir au résultat final

    Les étapes sont :
    1. récupérer les données
    2. créer le fichier
    3. sauvegarder le fichier
    4. écrire un mail et y attacher le fichier
    5. envoyer le mail
    6. supprimer le fichier


    Tu arrives déjà à récupérer les données via la requête SQL
    Maintenant il faudrait créer un fichier Excel, pour cela je te conseille PhpSpreadsheet
    Il suffit alors de construire un tableau PHP comme un tableau Excel

    Pour ce qui est d'envoyer des pièces jointes, c'est pas mal compliqué et je conseillerais plutôt d'utiliser une libraire
    Dans ce cas-ci, vu que tu es sur Wordpress, le plus simple est d'utiliser la fonction wp_mail() à la place de mail()Voici un exemple de code où j'ai créé une fonction qui récupère les données (ici c'est statique mais faut imaginer que tu crée le tableau à partir de ta requête SQL)
    Cette fonction prend un paramètre afin qu'elle sache si elle doit output le fichier (et donc forcer le téléchargement dans le cadre d'un fichier XLS) ou l'enregistrer sur le disque

    Attention, il faut évidemment remplacer les 2 premiers require_once() avec le chemin d'accès adéquat (et il faut évidemment avoir d'abord "installé" PhpSpreadsheet)
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
     
    // On charge les fichiers de Wordpress afin d'avoir accès à ses fonctions
    require_once(__DIR__ . '/../wp-load.php');
    // On charge la libraire PhpSpreadsheet afin de pouvoir construire le fichier Excel
    require_once(__DIR__.'/vendor/autoload.php');
     
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
     
    function export($save_file = false) {
        $data_to_save = [
            ['Nom', 'Prénom', 'Date de naissance'],
            ['Tarte', 'Ampion', '01/05/1990'],
            ['Foo', 'Bar', '16/10/1979'],
            ['Wolfgang Amadeus', 'Mozart', '27/01/1756'],
        ];
     
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->fromArray($data_to_save, NULL, 'A1');
     
        $filename = "myfile.xlsx";
        $filepath = __DIR__ . '/' . $filename;
     
        // redirect output to client browser
        if (!$save_file) {
            header('Content-Disposition: attachment;filename="' . $filename . '"');
            header('Cache-Control: max-age=0');
     
            $writer = new Xlsx($spreadsheet);
            $writer->save('php://output');
        } else {
            // Sinon on sauvegarde le fichier à un endroit du serveur qu'on va retourner
            $writer = new Xlsx($spreadsheet);
            $writer->save($filepath);
        }
        return $filepath;
    }
     
    $attachment = export(true);
    echo PHP_EOL . '<pre>$attachment: ' . print_r($attachment, true) . '</pre>' . PHP_EOL;
    // On prépare l'envoi de notre mail
    $to = "adresse.email@domain.tld";
    $subject = "Test d'exportation de données";
    $message = [
        "<p>Bonjour</p>",
        "<p>Ci-joint vous trouverez les données exportées au format XLSX.</p>",
    ];
    $headers = [
        'Content-type: text/html; charset=utf-8',
    ];
    // Envoie du mail
    wp_mail($to, $subject, implode(PHP_EOL, $message), $headers, $attachment);
     
    // Dans notre cas, quoi qu'il arrive on supprime le fichier 
    unset($attachment);

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 574
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Envoyer un message journalier avec la liste de toutes les commandes du jour suppose qu'il y a relativement peu de commandes chaque jour, sans quoi le courriel sera illisible et inexploitable.
    Mais admettons.

    De plus, la structuration de la requête et du tableau présenté dans le courriel impliquent un nombre limité d'articles potentiellement commandés, sans quoi la largeur du tableau sera énorme, et là aussi ce message sera illisible : chaque client ne commandant que quelques articles parmi les centaines ou milliers possibles, la plupart des colonnes du tableau auront une quantité à zéro... Sans intérêt du coup.

    Quel est le contexte ?

  8. #8
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut fichier excel en piece jointes
    Effectivement ma requête fonctionne bien,
    Je reçois le mail avec la tacheCRON et l'export en excel se faisais bien également quand j'ai mis un bouton export .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Extraction
     
        </title>
    </head>
    <body>
        <form method="post" action="export.php">
            <input type="submit" name="submit" value="Export" />
            </form>
    </body>
    </html>
    J'aimerai donc enregistrer ce fichier que je crée mais celui-ci devrai etre enregistré automatiquement (pour qu'il sois à jour en tant réel)
    C'est cela qui me bloque. ( actuellement j'appuie sur un bouton au moment que j'en n'ai besoin )
    Dois je prévoir une tache CRON qui enregistre ce fichier au lieu de l'envoyer ? et une deuxième pour l'envoyer?

    Actuellement chaque commande arrive par mail et aucune gestion, surtout quand il faut rechercher une commande d'un client ( elle dois reprendre Ts les mails un par un , donc un tableau mois par mois, ou semaine par semaine serait plus rapide)
    Je ne sais pas combien de commandes, il reçoivent par jour car actuellement les données du formulaire ne sont pas enregistrées.
    Ils veulent presque ts les champs dans le résumé sauf les coordonnées postales et téléphonique du client ( cela ne vas pas me faire gagner beaucoup de place )
    Effectivement chaque client peut commander peut etre une seule chose et toutes les autres champs peuvent être vide ( surtout le champ commentaires)

  9. #9
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Je vous ai mis un code complet qui fait ce que vous demandez...

    J'ai tout mis dans une fonction de sorte qu'on puisse choisir si on veut enregistrer le fichier ou le télécharger
    Et donc garder le mode d'avant (appui sur un bouton) ou envoyer par email (et donc sauvegarder le fichier)

  10. #10
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Je ne me suis jamais servi de bibliothèque PHP et j'en n'ai jamais installé

  11. #11
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Comme souvent dans ces cas-là, il suffit de lire la documentation.

    En ce qui concerne PhpSpreadsheet (qui permet de créer des fichiers Excel), elle est disponible ici : https://phpspreadsheet.readthedocs.io/en/latest/

    En l'occurrence, le chapitre Getting started explique comment installer et débuter avec la librairie

  12. #12
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Je ne possède pas composer pour installer les librairies et je ne m'en suis jamais servi :-(

    Je cherche déjà de la documentation sur ceci pour comprendre ou dois je l'installer .

  13. #13
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Comme indiqué sur le site de Composer, il suffit d'aller sur la page Download : https://getcomposer.org/download/
    Et là dans la première phrase il y a le lien vers un installeur pour Windows :
    Download and run Composer-Setup.exe - it will install the latest composer version whenever it is executed.

  14. #14
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    c'est pas que je veux pas, je n'arrive pas à lancer l'installation depuis hier donc je cherche pourquoi je peux pas. je ne peux pas faire suivant si je selectionne rien mais y'a rien que je peux selectionner
    Je suis bloqué à ce niveau làNom : 2022-05-24_14h00_58.png
Affichages : 82
Taille : 13,8 Ko

  15. #15
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Il faut installer PHP sur la machine
    Une fois installé, il faudra renseigner le chemin pour y accéder

  16. #16
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    J'ai déjà PHP
    Je suis sur Mamp

  17. #17
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Alors il faut renseigner le chemin vers l'exécutable PHP

  18. #18
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    j'ai réussi à l'installer sauf que je ne suis pas sur de l'avoir installé ou je voulais.
    Mia si j'installe sur mon Mamp, je l'aurai qu'en local et quand je voudrais mettre mon site en ligne , j'aurai un problème si cela n'estpas installé :-)
    La je suis sur un exemple pour tester si j'arrive à télécharger cette bibliothèque, mais je n'ai pas les mm résultats que les vidéos que je trouve sur google
    Nom : 2022-05-24_17h19_52.png
Affichages : 72
Taille : 78,7 Ko

  19. #19
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Effectivement, il faudra également que Composer soit installé sur le serveur mais même si c'est pas possible, il est possible de simplement uploader le dossier vendors créé en local
    C'est juste que c'est 10 fois plus rapide et propre d'installer par Composer ^^

    Pour votre erreur, je ne sais pas pourquoi vous essayez d'installer ce package car je n'ai jamais parlé de lui
    Toujours est-il que ça dernière mise à jour date de 2019. Il ne semble plus suivi donc je déconseillerais de l'utiliser

    Je vous conseillerais donc de repartir sur mon post #6 et l'utilisation de PhpSpreadsheet pour créer un fichier Excel.

  20. #20
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Je voulais tester ce package juste pour voir si composer était bien installé .
    J'ai tellement de choses a apprendre :-)

Discussions similaires

  1. [ODS] Envoi MAIL avec macro variable dans corps du mail
    Par alex.a dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 15/04/2016, 11h43
  2. [OL-2007] gestion d'envoi de mail avec deux boites dans outlook
    Par donfino dans le forum Outlook
    Réponses: 0
    Dernier message: 03/05/2011, 09h56
  3. Réponses: 1
    Dernier message: 18/01/2009, 21h23
  4. Problème avec requête SQL dans VBA
    Par Mimisio dans le forum VBA Access
    Réponses: 10
    Dernier message: 13/07/2007, 11h00

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