Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/11/2010, 11h37   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Par défaut Insérer du php dans le corps d'un mail html

Bonjour,

J'aurais souhaité reprendre la discussion car j'ai pratiquement les mêmes difficultés à insérer une balise php au sein d'un mail php (fonction mail()).
Le post a été taggé résolu mais je ne vois pas bien, pour ma part, où placer ces balises.
En fait, pour mon site de vente en ligne, j'envoie à chaque étape de la commande, un mail qui reprends des informations importantes.
Tout fonctionne parfaitement bien, la boundery fonctionne à merveille, les clients mails reçoivent, selon leurs disposition, un mail en txt ou en html, le tout avec des variables bien prises en compte mais là où je sèche, c'est de pouvoir insérer dans la partie HTML un tableau dynamique contenant une ou plusieurs lignes d'articles (issus de la bdd).


Voici mon code:
Code :
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
<?php 
	$date = $row_rsRappelCommandes['date'];
    $date = preg_replace('!^([0-9]{4})+-([0-9]{2})+-([0-9]{2})$!', '$3/$2/$1', $date);  
    $nom = $row_rsRappelCommandes['nom'];
    $prenom = $row_rsRappelCommandes['prenom']; 
    $expediteur = $row_rsRappelCommandes['email']; 
    $to = $expediteur;

$boundary = "-----=".md5(uniqid(rand()));
$sujet = "mon_sujet"; 
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/alternative; boundary=\"$boundary\"\r\n";
$header .= "Bcc: info@mondomaine.com\n";
$header .= 'From: '.$prenom.' '.$nom.' <'.$expediteur.'>'."\r\n"; 
$header .= "\r\n";
$msg = "Je vous informe que ceci est un message au format MIME 1.0 multipart/alternative.\r\n";
$msg .= "--$boundary\r\n";
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$msg .= "Content-Transfer-Encoding:8bit\r\n";
$msg .= "\r\n
Bonjour $prenom $nom,\r\n";
$msg .= "\r\n";
$msg .= "--$boundary\r\n";
$msg .= "Content-Type: text/html; charset=\"ISO-8859-1\"\r\n";
$msg .= "Content-Transfer-Encoding: 8bit\r\n";
$msg .= "\r\n";
$msg .= "<html><body><table><tr><td><div align='center'><a href='http://www.mondomaine.com/accueilfr.php'><img src='http://www.mondomaine.com/img/bandeau2_new.gif' width='650' height='122'></a></div></td>
        </tr>
	    <tr>
         <td>Bonjour $prenom $nom</td>
        </tr>
	    <tr>
         <td>c'est ici que je voudrais intégrer un tableau qui est une boucle php do...while contenant éventuellement plusieurs lignes d'articles commandés</td>
        </tr></table></body></html>";
$msg .= "\r\n";
$msg .= "--$boundary--\r\n";
mail($to, $sujet, $msg, $header);
?>
Est ce une syntaxe approximative ?
Suis je hors sujet?
Faut-il passer cette boucle sur une variable qui serait elle même exploitable par cette fonction mail.
Je sais que tout est déjà en php mais si je mets une "enclave php" en mettant une balise de fin et que je reprends ensuite le déroulement normal du mail, j'ai alors un warning de syntaxe (à priori).

C'est bête, je le sais, mais je sèche.
Merci de vos réponses.
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 19h41   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Le msg que tu envoies est stocké dans une variable $msg.
Remplace :

Code :
<td>c'est ici que je voudrais intégrer un tableau qui est une boucle php do...while contenant éventuellement plusieurs lignes d'articles commandés</td>
Par :

... $products étant une variable contenant le tableau HTML de produits à transmettre par email.

Exemple :

Code :
1
2
3
4
5
6
7
8
9
$products = '<table>' ;
foreach ( $cart as $product ) { // Parcours du caddie
    $products .= '<tr>' ;
    $products .= "<td>{$product['name']}</td>" ;
    $products .= "<td>{$product['quantity']}</td>" ;
    $products .= '<td>...</td>' ;
    $products .= '</tr>' ;
}
$products .= '</table>' ;
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 21h09   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Alors c'est nettement mieux, mais foreach ne parcours que la première ligne, donc je peux faire pareil avec des variables.
Mais je cherche pourquoi..
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 07h50   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Merci Séb.
C'est déjà nettement mieux. J'obtiens une liste en faisant une boucle do while, mais mes opérateurs ne sont pas pris en compte, ils sont simplement renvoyés tels quels.
Pour le calcul de la TVA, c'est assez génant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$products = $products = '<table>' ;
do {  // Parcours du caddie
        $products .= '<tr>' ;
	$products .= "<td>{$row_panier['reference']}</td>" ;
        $products .= "<td>{$row_panier['nom']} {$row_panier['pres']}</td>" ;
        $products .= "<td>{$row_panier['quantite']}</td>" ;
	$products .= "<td>{round(($row_panier['prixArticle']+$row_panier['trp'])/1.055,2)} €</td>" ;
	$products .= "<td>...</td>" ;
	$products .= '</tr>' ;
} while ($row_panier= mysql_fetch_assoc($panier));
$products .= '</table>' ;
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 08h09   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
On n'avait pas déjà pointé qu'il ne fallait pas un do/while ?

Moi je suis plutot partisan du découpage des chaines :
Code :
1
2
3
4
5
6
7
8
9
10
11
$products = $products = '<table>' ;
 while ($row_panier= mysql_fetch_assoc($panier)) {  // Parcours du caddie
        $products .= '<tr>' ;
	$products .= '<td>' . $row_panier['reference'] . '</td>' ;
        $products .='<td>'  .$row_panier['nom'] . ' ' . $row_panier['pres'] .'</td>' ;
        $products .= '<td>' . $row_panier['quantite'] .'</td>' ;
	$products .= '<td>' . round(($row_panier['prixArticle']+$row_panier['trp'])/1.055,2) . ' €</td>' ;
	$products .= "<td>...</td>" ;
	$products .= '</tr>' ;
}
$products .= '</table>' ;
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 08h45   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
A première vue, il manque la première ligne d'articles, mais les opérateurs fonctionnent...
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 13h24   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Pardon pour ce rythme plutôt lent, je n'avais pas eu l'occasion de répondre.

J'ai opté pour do while, plus facile puisque la condition est évaluée à la fin, mon tableau est donc complet. Mais c'est surtout car je ne sais pas comment initialiser le compteur avant while pour que la condition soit vraie.
Pourquoi pas do while Sabotage ?
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 13h32   #8
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
Envoyé par zorbo Voir le message
J'ai opté pour do while, plus facile puisque la condition est évaluée à la fin, mon tableau est donc complet.
Je ne vois pas le rapport.

Citation:
Mais c'est surtout car je ne sais pas comment initialiser le compteur avant while pour que la condition soit vraie.
Quel compteur ?

Citation:
Pourquoi pas do while Sabotage ?
Que vaut $row_panier à la 1re exécution de ta boucle ?
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 16h48   #9
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Je me suis sans doute mal exprimé, php est un langage que j'apprends avec le temps, mais la programmation n'est pas mon métier.

J'ai cru comprendre qu'avec do while, le bloc d'instructions est exécuté avant de tester la condition, ce qui suppose que la première ligne de mon tableau est affichée aussi.

Quant au compteur, je voulais dire la valeur initiale.

$row_panier correspond à la deuxième ligne du tableau à la première exécution de while.
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 16h57   #10
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
Envoyé par zorbo Voir le message
J'ai cru comprendre qu'avec do while, le bloc d'instructions est exécuté avant de tester la condition
Tout à fait.

Citation:
ce qui suppose que la première ligne de mon tableau est affichée aussi.
Le pb est que la boucle sera exécutée qque soit la valeur du tableau, qu'il y ait qque chose à afficher ou pas.

Citation:
Quant au compteur, je voulais dire la valeur initiale.
Il n'y a pas de valeur initiale dans le bout de script que tu as fourni ;-)

Citation:
$row_panier correspond à la deuxième ligne du tableau à la première exécution de while.
$row_panier ne vaut rien à la 1re exécution du do/while.
A la 2nde exécution du do/while $row_panier contiendra le 1er enregistrement, etc.
Est-ce réellement le comportement voulu ?

Equivalences strictes entre do/while et while :

Code :
1
2
3
while ( $tuple = mysql_fetch_assoc($rs) ) {
    // Afficher enregistrement
}
Code :
1
2
3
4
5
6
7
 
do {
    $tuple = mysql_fetch_assoc($rs) ;
    if ( $tuple !== FALSE ) {
        // Afficher enregistrement
    }
} while ( $tuple !== FALSE ) ;
La 2e méthode est bcp plus verbeuse, voilà pourquoi nous ne la rencontrons jamais pour parcourir un jeu d'enregistrements.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 18h24   #11
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Citation:
Envoyé par zorbo Voir le message
J'ai opté pour do while, plus facile puisque la condition est évaluée à la fin, mon tableau est donc complet. Mais c'est surtout car je ne sais pas comment initialiser le compteur avant while pour que la condition soit vraie.
Pourquoi pas do while Sabotage ?

Si il te manque la première ligne, c'est que avant le code que nous montre tu as déjà fait :
Code :
$row_panier= mysql_fetch_assoc($panier) ;
or tu peux supprimer cette ligne et utiliser uniquement un while.
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 18h38   #12
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Oui, Seb, je comprends déjà mieux.
Il est temps que je conclue cette affaire, merci à vous, Seb et Sabotage pour votre aide précieuse, et votre patience.
Mon mail de confirmation de commande est déjà en route, il est parfaitement fonctionnel, mon php s'est enrichi.
Mais je me contenterai pour l'instant, car le temps me manque, d'une boucle do while exécutée, certes, une fois pour rien, mais cela n'a, en l'occurrence, aucune importance.
Alors merci encore à vous et bon vent.
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 19h24   #13
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Citation:
Envoyé par zorbo Voir le message
Mais je me contenterai pour l'instant, car le temps me manque, d'une boucle do while exécutée, certes, une fois pour rien, mais cela n'a, en l'occurrence, aucune importance.
En fait elle n'est exécutée pour rien que si ta requête ne renvoie aucun enregistrement, là ça fera une erreur PHP, donc ça peut avoir de l'importance ;-)
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 10h48   #14
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 48
Points : 10
Points : 10
Joker-eph
"Si il te manque la première ligne, c'est que avant le code que nous montre tu as déjà fait :
Code :
$row_panier= mysql_fetch_assoc($panier) ;
Tu as parfaitement raison, j'ai trouvé cette ligne bien au-dessus. Car initialement, la page affichaitdéjàle tableau (un récapitulatif de commande, identique ou presque à celui que je retourne en mail).
Ce qui fait que la déclaration de requête contenait cette fameuse ligne.
Ce qui nous fait deux lignes identiques avant l'exécution du while seul et la boucle ne commence donc qu'au 2ème enregistrement.
Bien vu, j'aurais pu trouver ça avant mais non.

Alors merci infiniment à vous trois.
zorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h52.


 
 
 
 
Partenaires

Hébergement Web