Probleme de boucle WHILE.

Petit nouveau ! | 7 Messages

20 nov. 2012, 18:42

Bonjour à toutes et à tous,

Je me replonge dans le développement après quelques années pour des fin professionnelle (personnel, c pour me faire un outil...)

Je voudrais envoyer a une liste de ma base de donnes un mail. Le souci c'est que j'ai erreurs aléatoire... Des champs qui ne s'affiche pas... Des décalages...

Et je n'arrive pas a voir d’où viennent mes erreurs.

Quand je mets le code en PHP, je ne peux pas poster mon message... Quelqu'un sait pourquoi ?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 nov. 2012, 19:33

Salut,



pour ton code, édit ton message ça devrait aller, car sans lui on peux pas vraiment t'aider.

La fonction mail de php n'est pas prévue pour envoyer des messages en masse (cf doc).

Ensuite il est possible que tu ne traite pas correctement le formulaire (s

Les erreurs c'est dans le mail ?

si oui, est ce que tu le mail est au format html ? si oui vérifie qu'il soit correctement formaté c'ets une source d'ennui.

Pour le reste on attent le code :D


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 7 Messages

22 nov. 2012, 12:18

Bonjour et merci pour votre réponse.

Comme je n'arrive pas à éditer mon message, j’essaie avec ce nouveau, et j'ai toujours ce message d'erreur :

This message was flagged as spam and has been denied.

J'ai toujours ce message, même en éditant...

Comment je peux faire.

Merci

Petit nouveau ! | 7 Messages

23 nov. 2012, 11:05

Bonjour,

Bon, j'ai enfin réussi...

Code : Tout sélectionner

<?php include 'Test/fonctions.php'; $date = date("d-m-Y"); $heure = date("H:i"); connec_db(); $auth=mysql_query("SELECT * FROM t_envois_ext where date_envois_ext=now()"); $result=mysql_fetch_object($auth); mysql_close(); $commentaire_ext=($result->comm_envois_ext); connec_db(); $envois=mysql_query("SELECT * FROM t_connexions"); while ($go_id = mysql_fetch_array($envois)){ $destinataire_id = $go_id[0]; $envois_m=mysql_query("SELECT * FROM t_profile WHERE id_connexions='$destinataire_id'"); $go = mysql_fetch_array($envois_m); $destinataire = $go[13]; $auth=mysql_query("SELECT * FROM t_lots WHERE id_residences='$_res' AND (etat_lots='Libre' OR etat_lots='Option') ORDER BY id_lots ASC"); $row = mysql_fetch_array($auth); $id=$row[1]; $res=mysql_query("SELECT * FROM t_residences WHERE id_residences='$id'"); $result=mysql_fetch_object($res); $residence=($result->nom_residences); $message_html = '<html>'; $message_html .= '<head>'; $message_html .= '<title>Etat Stocks</title>'; $message_html .= '</head>'; $message_html .= '<body>'; $message_html .= '<table border="1">'; $message_html .= '<tr>'; $message_html .= '<td colspan="13">Bonjour,<br/><br/>Ce mail est g&eacute;n&eacute;r&eacute; automatiquement, veuillez ne pas repondre SVP.<br/><br/>'.$commentaire_ext.'<br/><br/>Merci.</td>'; $message_html .= '</tr>'; $message_html .= '<tr>'; $message_html .= '<td colspan="13">Etat des stocks au '.$date.' a '.$heure.'</td>'; $message_html .= '</tr>'; $message_html .= '<tr>'; $message_html .= '<td colspan="13">'; $message_html .= '<table aligne="center">'; $message_html .= '<tr aligne="center">'; $message_html .= '<td bgcolor="#FFCC33">Option</td>'; $message_html .= '<td>, pour les lots optionn&eacute;s, vous pouvez vous mettre en liste d\'attente en nous contactant.</td>'; $message_html .= '</tr>'; $message_html .= '</table>'; $message_html .= '</td>'; $message_html .= '</tr>'; $message_html .= '<tr>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1" width="4%">Bat.</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1" width="4%">Niv</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1" width="4%">Num.</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">Type</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">SH</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">VAR</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">Total</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">Jardin</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">Total</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">F. Notaire</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">SD</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">Defisc</td>'; $message_html .= '<td bordercolor="#FFFFFF" bgcolor="#666666" align="center" class="txt1">Loyer</td>'; $message_html .= '</tr>'; $message_html .= '<tr><td bordercolor="#333333" align="center" colspan="13">Programme '.$residence.'</td></tr>'; $auth=mysql_query("SELECT * FROM t_lots WHERE id_residences='$_res' AND (etat_lots='Libre' OR etat_lots='Option') ORDER BY id_lots ASC"); while ( $row = mysql_fetch_array($auth) ) { $id=$row[1]; $test_resul=$row[15]; $total_surf=$row[6]+$row[7]; $total_prix=$row[11]+$row[12]; if ($row[7]>14){ $sd=$row[6]+14; } else { $sd=$total_surf; } $res=mysql_query("SELECT * FROM t_residences WHERE id_residences='$id'"); $result=mysql_fetch_object($res); $residence=($result->nom_residences); $taux=($result->plafond_residences); $tauxd=($result->tauxd_residences); $defisc=round(($sd*$taux*$tauxd)/100); //----------------------------------------------- //DECLARE LES VARIABLES //----------------------------------------------- $email_expediteur ='[email protected]'; $email_reply ='[email protected]'; $message_texte ='Bonjour,'."\n\n".'Voici l\'etat des stocks'; $bgc = switchcolor(); if ($test_resul=='Option'){ $message_html .= '<tr bgcolor="#FFCC33" align="center">'; } else if ($test_resul=='Libre'){ $message_html .= '<tr bgcolor="#FFFFFF" align="center">'; } $message_html .= '<td bordercolor="#333333" align="center">'.$row[2].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[3].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[4].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[5].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[6].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[7].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$total_surf.'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[8].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$total_prix.'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[14].'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$sd.'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$defisc.'</td>'; $message_html .= '<td bordercolor="#333333" align="center">'.$row[21].'</td>'; $message_html .= '</tr>'; } //----------------------------------------------- //GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML //----------------------------------------------- $frontiere = '-----=' . md5(uniqid(mt_rand())); //----------------------------------------------- //HEADERS DU MAIL //----------------------------------------------- $headers = 'From: "Contact" <'.$email_expediteur.'>'."\n"; $headers .= 'Return-Path: <'.$email_reply.'>'."\n"; $headers .= 'MIME-Version: 1.0'."\n"; $headers .= 'Content-Type: text/html; charset="iso-8859-1"'; //----------------------------------------------- //MESSAGE TEXTE //----------------------------------------------- $message = 'This is a multi-part message in MIME format.'."\n\n"; $message .= '--'.$frontiere.'--'."\n"; $message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n"; $message .= 'Content-Transfer-Encoding: 8bit'."\n\n"; $message .= $message_texte."\n\n"; //----------------------------------------------- //MESSAGE HTML //----------------------------------------------- $message .= '--'.$frontiere.'--'."\n"; $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n"; $message .= 'Content-Transfer-Encoding: 8bit'."\n\n"; $message .= $message_html."\n\n"; $message .= '--'.$frontiere.'--'."\n"; $sujet = 'Etat des stocks'; //} mail($destinataire,$sujet,$message_html,$headers); } $message_html .= '</table> '; $message_html .= '</body>'; $message_html .= '</html>'; mysql_close(); //redirect('partenaires.php?_page=accueil'); ?>
Merci pour votre aide.

Avatar du membre
Mammouth du PHP | 1609 Messages

23 nov. 2012, 11:25

Mon dieu ça me fait toujours flipper ces dizaines de concaténations de code html ! :shock:
Pour avoir le HTML dans du HTML tu peux faire comme ça (mais y a pas d'obligation, je me la pète juste ^^) :
<?php
// préparation du message html
ob_start();// démarrer la capture de la sortie
?>
Ici le html avec inclusion des variables php comme ceci <?php echo $var; ?>
Plein de lignes html....
<?php
$message_html = ob_get_contents();// récupérer la sortie
ob_end_clean();// stopper la capture et vider le buffer
Développeur web depuis + de 20 ans

ViPHP
ViPHP | 3300 Messages

23 nov. 2012, 12:15

Mon dieu ça me fait toujours flipper ces dizaines de concaténations de code html ! :shock:
Pour avoir le HTML dans du HTML tu peux faire comme ça (mais y a pas d'obligation, je me la pète juste ^^) :
<?php
// préparation du message html
ob_start();// démarrer la capture de la sortie
?>
Ici le html avec inclusion des variables php comme ceci <?php echo $var; ?>
Plein de lignes html....
<?php
$message_html = ob_get_contents();// récupérer la sortie
ob_end_clean();// stopper la capture et vider le buffer
Berk, mais ce n'est que mon avis, je prefère ne jamais ouvrir/fermer des balises php et concaténer dans une variable, ou à la rigueur faire un <<< EOF! ou bien faire un fopen et des preg_replace sur un fichier que ça :)
Fait du php depuis que ca existe ou presque :)

Avatar du membre
Mammouth du PHP | 1609 Messages

23 nov. 2012, 13:23

Oué chacun ses goûts. Personnellement je stocke le mail dans un fichier template de type vue html avec extension .php et echo des variables à l'intérieur.
Et j'utilise une fonction get_partial('path/du/template', $datas); pour récupérer le message formaté avec les bonnes variables.
function get_partial($file, $datas) {
  extract($datas);
  ob_start();
  include $file;
  $partial = ob_get_contents();
  ob_end_clean();
  return $partial;
}

// et dans le contrôleur j'ai juste
$message_html = get_partial('path/du/template', $datas);
Ainsi je ne ferme ni n'ouvre les balises php dans le contrôleur et du coup je peux même travailler sur mon template dans une page autonome sans devoir passer par mon formulaire d'envoi.
Et le get_partial est également très efficace pour inclure des vues dans des vues et éviter ainsi les répétitions de bouts de vues dans différentes vues. D'ailleurs j'ai un include_partial similaire pour ça qui lui ne manipule pas le buffer de sortie.
function include_partial($file, $datas) {
  extract($datas);
  include $file;
}
En réalité mes 2 fonctions sont un peu plus complexes car j'y inclus également quelques globales ($request, $user, $config) afin qu'elles soient automatiquement disponibles dans mes vues.

PS : quand à l'exemple de mon message précédent, en terme de lisibilité et d'écriture je le préfère à la méthode utilisée par le posteur du sujet mais je reconnais que c'est un avis subjectif et je n'aime pas non plus fermer la balise php dans le code contrôleur mais autrement le html est difficilement lisible et moins facilement manipulable/modifiable.
Développeur web depuis + de 20 ans

ViPHP
ViPHP | 3300 Messages

23 nov. 2012, 16:21

PS : quand à l'exemple de mon message précédent, en terme de lisibilité et d'écriture je le préfère à la méthode utilisée par le posteur du sujet mais je reconnais que c'est un avis subjectif et je n'aime pas non plus fermer la balise php dans le code contrôleur mais autrement le html est difficilement lisible et moins facilement manipulable/modifiable.
Mon avis est tout aussi subjectif, je vois un avantage ceci dit, c'est qu'en écrivant le html dans une variable php on peut se permettre d'indenter comme on veut, alors qu'une indentation html est synonyme de conséquence niveau affichage

Code : Tout sélectionner

<td> texte </td>
n'étant pas équivalent à

Code : Tout sélectionner

echo '<td>'; echo 'texte'; echo '</td>';
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 7 Messages

23 nov. 2012, 16:29

merci à tous pour ces conseilles. Comme je suis débutant, et autodidacte, j'essaie surtout de faire en sorte que ça marche.
Par contre je suis très intéressé par vos propositions, je vais regarder ça.

Pour mon souci, voici par exemple ce que me retourne ma boucle WHILE :

A 0 6 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 7 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 8 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 10 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 12 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 13 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 1 17 T2 43.48 16.60 60.08 0.00 146000 2920 57.48 34508 620
A 1 19 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390
A 1 24 T2 43.48 16.60 60.08 0.00 146000 2920 57.48 34508 620
A 1 25 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390
A 1 26 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390
A 1 27 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390

L'erreur est pour cette exemple en ligne 9, pourquoi en plein milieu de la boucle, j'ai un souci et que tout revient ensuite ?...

Merci

ViPHP
ViPHP | 3300 Messages

23 nov. 2012, 16:46

merci à tous pour ces conseilles. Comme je suis débutant, et autodidacte, j'essaie surtout de faire en sorte que ça marche.
Par contre je suis très intéressé par vos propositions, je vais regarder ça.

Pour mon souci, voici par exemple ce que me retourne ma boucle WHILE :

A 0 6 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 7 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 8 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 10 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 12 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 0 13 STUDIO 23.41 5.83 29.24 0.00 82000 1640 29.24 17554 390
A 1 17 T2 43.48 16.60 60.08 0.00 146000 2920 57.48 34508 620
A 1 19 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390
A 1 24 T2 43.48 16.60 60.08 0.00 146000 2920 57.48 34508 620
A 1 25 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390
A 1 26 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390
A 1 27 STUDIO 23.42 6.12 29.54 0.00 84000 1680 29.54 17734 390

L'erreur est pour cette exemple en ligne 9, pourquoi en plein milieu de la boucle, j'ai un souci et que tout revient ensuite ?...

Merci
Si je comprend bien il te manque la valeur pour la colone N°3 ce qui correspond à $row[4] qui est sensé être un entier, peut-être que l'erreur est plutôt dans ta base de donnée, si pour cette entrée la colone correspond à NULL ça pourrait donner ça, une façon de voir ça serait de faire un

Code : Tout sélectionner

var_dump($row)
à l'intérieur de ta boucle et de trouver dans le gros debug que tu auras la valeur qui t'embète et de voir si par hazard ça ne serait pas un type NULL

au passage ton code gagnerait en maintenabilité si tu utilisais mysql_fetch_assoc, au lieu de mysql_fetch_array, d'autre part, l'extension mysqli à la place de mysql ça ne serait pas non plus du luxe :)
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 7 Messages

23 nov. 2012, 16:57

Merci pour ton aide...
En fait la valeur est bien trouvée, je l'ai tout en haut de mon mail (sur outlook version mac, et dans la case sous PC) mais au lieu d'avoir que le chiffre j'ai :

< td bordercolor="#333333" align="center">9

:(

ViPHP
ViPHP | 3300 Messages

23 nov. 2012, 17:27

C'est pas évident de répondre sans pouvoir tester mais un truc bizarre que je viens de remarquer c'est ça:

Tu as

Code : Tout sélectionner

mail($destinataire,$sujet,$message_html,$headers); } $message_html .= '</table> '; $message_html .= '</body>'; $message_html .= '</html>'; mysql_close();
alors que tu devrais avoir

Code : Tout sélectionner

$message_html .= '</table> '; $message_html .= '</body>'; $message_html .= '</html>'; mail($destinataire,$sujet,$message_html,$headers); } mysql_close();
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 7 Messages

26 nov. 2012, 13:06

Bonjour,

Et surtout merci pour toutes vos réponses.
Je viens effectivement de corriger le souci relevé par Nagol, mais j'ai toujours le même souci et au même endroit.
J'ai vérifié, et dans la base le nombre est bien entré...
Je suis preneur de toutes autres propositions.

Encore merci

ViPHP
ViPHP | 3300 Messages

26 nov. 2012, 17:16

Hmm je ne vois pas d'ou ça peut venir, alors dans ces cas la ce que je fais, c'est que j'y vais par dichotomie, cad que je désactiverais par exemple la partie mail, pour voir si le problème arrive toujours, et ensuite si ça arrive encore, un autre morceau et ainsi de suite histoire de trouver quelle partie du code est réellement responsable, en tâtonnant jusqu'à ce que tu puisse déterminer d’où vient le problème.
Fait du php depuis que ca existe ou presque :)

Petit nouveau ! | 7 Messages

29 nov. 2012, 18:50

Hello,

Alors, je ne comprends rien. Quand je mets le code entièrement en HTML, pas de soucis tout s'affiche bien, et dés que j’insère le code PHP... bug et toujours au même endroit, alors que c'est une boucle...

Une idée ?

Encore merci.