Discussion:
Probleme simple (sauf pour moi)
(trop ancien pour répondre)
Pascale
2009-07-08 09:06:43 UTC
Permalink
Je suis confrontée à un problème de logique qui est sans doute simple mais
qui crée néanmoins un court-circuit entre mes 2 neurones :

Les données :
Je dispose d'une table comprenant des fiches (repérées par un numéro
unique), un titre, une date d'entrée et l'adresse courriel du demandeur (il
y a bien d'autres choses dans la table mais là n'est pas la question).
Un même demandeur (une même adresse courriel, donc) peut correspondre bien
sûr à plusieurs fiches.

J'opère une extraction et une sélection des demandes, ce qui donne :

$sel="SELECT numfiche,nomplante,pseudo,courriel,dateentree,nbprop from
matable WHERE etat='2'AND nbprop>'1' ORDER BY courriel ASC";
$req = mysql_query($sel) or die('<CENTER>Erreur SQL
!'.$sel.'<br>'.mysql_error().'</CENTER>' );
while ($data=mysql_fetch_assoc($req))
{
$dateentree=$data['dateentree'];
// Appel d'une fonction qui sélectionne les demandes concernées
$alerte=relance($dateentree);
if ($alerte=='relancer')
{
$numfiche=$data['numfiche'];
$nomplante=$data['nomplante'];
$pseudo=$data['pseudo'];
$courriel=$data['courriel'];
$datedaplomb=dateendroit($dateentree);
$nbprop=$data['nbprop'];
echo 'Courriel '.$courriel. ' Numéro de fiche '.$numfiche.'
Titre '.$nomplante.' Date '.$datedaplomb.' Nbre de prop
'.$nbprop.'<br>';
}
}

Tout cela fonctionne, mais ressemble d'assez loin avec ce que je veux
obtenir...

Mon objectif est de générer des courriels du type :

« Bonjour Untel,

Vous avez effectué des demandes dont voici la liste :
- fiche n°XXXX intitulée BLABLABLA, en date du ../../..
- fiche n°YYYY intitulée BLOBLOBLO, en date du ../../..
etc

Ma question ne porte pas sur l'emploi de la fonction mail, mais sur la
façon de « regrouper » les demandes correspondant à une même adresse
courriel.

Je parie que c'est basique, mais il n'empêche que je suis bloquée sur ce
fichu problème.
--
Pascale
Olivier Miakinen
2009-07-08 09:26:45 UTC
Permalink
Bonjour,
$sel="SELECT [...] ORDER BY courriel ASC";
[...]
while ($data=mysql_fetch_assoc($req))
{
[...]
$courriel=$data['courriel'];
[...]
}
[...]
« Bonjour Untel,
- fiche n°XXXX intitulée BLABLABLA, en date du ../../..
- fiche n°YYYY intitulée BLOBLOBLO, en date du ../../..
etc
Ma question [porte] sur la
façon de « regrouper » les demandes correspondant à une même adresse
courriel.
À la limite, c'était plus une question pour fr.comp.algorithmes que pour
fr.comp.lang.php ! Je reprends le squelette de ton code que j'ai
conservé, et j'y ajoute les lignes utiles.

-----------------------------------------------------------------------
$dernier_courriel = '';
$message = '';
$sel="SELECT [...] ORDER BY courriel ASC";
[...]
while ($data=mysql_fetch_assoc($req))
{
[...]
$courriel=$data['courriel'];
[...]
if (($courriel != $dernier_courriel) && ($message != '')) {
envoie_courriel($dernier_courriel, $message);
$dernier_courriel = $courriel;
$message = '';
}
$message += "fiche n°$numfiche intitulée $nomplante en date du...\n";
}
[...]
if ($message != '') {
envoie_courriel($dernier_courriel, $message);
}
-----------------------------------------------------------------------

L'idée est de stocker tous les messages dans une chaîne tant que tu as
la même adresse de courriel, puis d'envoyer le tout dès que l'adresse
change (à l'adresse qui a été sauvegardée, bien sûr, pas à celle qui
vient de changer). Et il ne faut pas oublier d'envoyer le courriel à la
dernière adresse également.
--
Olivier Miakinen
Olivier Miakinen
2009-07-08 09:35:26 UTC
Permalink
Post by Olivier Miakinen
if (($courriel != $dernier_courriel) && ($message != '')) {
envoie_courriel($dernier_courriel, $message);
$dernier_courriel = $courriel;
$message = '';
}
Pardon, ce serait plutôt :

if ($courriel != $dernier_courriel) {
if ($message != '') {
envoie_courriel($dernier_courriel, $message);
$message = '';
}
$dernier_courriel = $courriel;
}

Ce n'est peut-être pas la seule erreur. À vérifier soigneusement !
--
Olivier Miakinen
Pascale
2009-07-08 10:42:29 UTC
Permalink
Post by Olivier Miakinen
if ($courriel != $dernier_courriel) {
if ($message != '') {
envoie_courriel($dernier_courriel, $message);
$message = '';
}
$dernier_courriel = $courriel;
}
Ce n'est peut-être pas la seule erreur. À vérifier soigneusement !
Dans mon message précédent, j'ai dit merci avant de tester, donc t'as gagné
que je te dis merci une fois de plus (-:

Sûr que je vais vérifier, tester et re-tester, surtout avant d'envoyer des
courriels « en vrai ».
--
Pascale
Pascale
2009-07-08 10:03:13 UTC
Permalink
Post by Olivier Miakinen
À la limite, c'était plus une question pour fr.comp.algorithmes que pour
fr.comp.lang.php ! Je reprends le squelette de ton code que j'ai
conservé, et j'y ajoute les lignes utiles.
L'idée est de stocker tous les messages dans une chaîne tant que tu as
la même adresse de courriel, puis d'envoyer le tout dès que l'adresse
change (à l'adresse qui a été sauvegardée, bien sûr, pas à celle qui
vient de changer). Et il ne faut pas oublier d'envoyer le courriel à la
dernière adresse également.
Merci, tu me sors de l'embarras une fois encore ! Je n'avais bêtement pas
pensé à cette façon de procéder...
--
Pascale
Pascale
2009-07-13 14:10:28 UTC
Permalink
Je me pose une question en relation avec ce même programme. Il ne sera
utilisé que très ponctuellement et il génèrera de 15 à 30 courriels à
chaque fois.
Ce n'est pas énorme, mais j'ai remarqué que le serveur de mails de mon
hébergeur préféré à tendance à s'étrangler assez facilement.
Est-il possible de mettre un genre de pause dans ma boucle afin que l'envoi
des courriels ne soit pas exactement simultané ? Mais dans ce cas, est-ce
que je ne risque pas de voir mon traitement dépasser le timeout ?
Je lis dans PHP Info :
Timeouts Connection: 300 - Keep-Alive: 15
mysql.connect_timeout 60
default_socket_timeout 60
--
Pascale
Olivier Miakinen
2009-07-13 17:19:08 UTC
Permalink
Post by Pascale
Je me pose une question en relation avec ce même programme. Il ne sera
utilisé que très ponctuellement et il génèrera de 15 à 30 courriels à
chaque fois.
Ce n'est pas énorme, mais j'ai remarqué que le serveur de mails de mon
hébergeur préféré à tendance à s'étrangler assez facilement.
Est-il possible de mettre un genre de pause dans ma boucle afin que l'envoi
des courriels ne soit pas exactement simultané ? Mais dans ce cas, est-ce
que je ne risque pas de voir mon traitement dépasser le timeout ?
J'allais dire non, en pensant à max_execution_time, mais...
Post by Pascale
Timeouts Connection: 300 - Keep-Alive: 15
mysql.connect_timeout 60
default_socket_timeout 60
... ah oui, si tu mets des pauses de plus de 60 secondes il est possible
que la connexion MySQL se ferme.

Eh bien la solution est très simple : au lieu d'envoyer chaque courriel
directement dans le boucle qui lit dans la base de données, tu remplis
un tableau avec chacun des couples « $dernier_courriel, $message ».
Ensuite, tu fermes bien proprement la connexion à ta base de données,
puis tu fais une nouvelle boucle qui envoie un message toutes les X
secondes. Note que tu peux aussi stocker les messages à envoyer dans
un fichier ou dans une autre table MySQL, et lancer un programme
externe par cron toutes les X secondes ou Y minutes, lequel envoie un
seul courriel à chaque fois.
--
Olivier Miakinen
Pascale
2009-07-13 21:31:43 UTC
Permalink
Post by Olivier Miakinen
Eh bien la solution est très simple : au lieu d'envoyer chaque courriel
directement dans le boucle qui lit dans la base de données, tu remplis
un tableau avec chacun des couples « $dernier_courriel, $message ».
Ensuite, tu fermes bien proprement la connexion à ta base de données,
puis tu fais une nouvelle boucle qui envoie un message toutes les X
secondes. Note que tu peux aussi stocker les messages à envoyer dans
un fichier ou dans une autre table MySQL, et lancer un programme
externe par cron toutes les X secondes ou Y minutes, lequel envoie un
seul courriel à chaque fois.
Je comprends, c'est même un peu ce que j'avais envisagé, mais comme je suis
une feignasse, j'espérais que la commande sleep() résoudrait mon problème à
moindre frais, ou plutôt, à moindre effort.
--
Pascale
Jean-Francois Ortolo
2009-07-13 17:19:57 UTC
Permalink
Bonjour

En ce qui concerne le temps maximal d'exécution d'un script php, il
faut voir plutôt la valeur de "max execution time", il me semble.

D'autre part, quand le "Safe Mode" est à Off, il est possible
d'augmenter le max execution time en début de script, et aussi
d'indiquer que le script ne doit pas s'arrêter quand il y a déonnexion
du poste client.

Voir le PHP Manual: http://fr.php/net/fr/ je crois.

Bien à vous.

Amicalement.

Jean-François Ortolo
--
Visitez le site http://www.pronostics-courses.fr/
qui donne des Statistiques, Pronostics et Historiques graphiques.

Les Statistiques sont calculées d'après une base de données
allant du 1/01/2000 jusqu'à très récemment.
Olivier Miakinen
2009-07-13 17:36:29 UTC
Permalink
Bonjour,
Post by Jean-Francois Ortolo
En ce qui concerne le temps maximal d'exécution d'un script php, il
faut voir plutôt la valeur de "max execution time", il me semble.
En l'occurrence, non. Je ne sais pas ce qu'il en est des autres timeouts
possibles, mais celui-là il est sûr qu'il ne gênera pas :

<http://fr.php.net/manual/fr/info.configuration.php#ini.max-execution-time>
Le temps d'exécution maximum n'est pas affecté par des appels systèmes
tels que sleep().
</>

<http://fr.php.net/manual/fr/function.set-time-limit.php>
Note: La fonction set_time_limit() et la directive de configuration
max_execution_time n'affectent que le temps d'exécution du script
lui-même. Tout temps passé en dehors du script, comme un appel système
utilisant system(), des opérations sur les flux, les requêtes sur base
de données, etc. n'est pas pris en compte lors du calcul de la durée
maximale d'exécution du script.
</>

Ah... un petit bémol quand même :

<http://fr.php.net/manual/fr/function.set-time-limit.php>
Ceci est faux sous Windows où le temps mesuré est le temps réel.
</>

Mais je suppose que Pascale a eu l'intelligence de ne pas faire tourner
son site en production sous Windows... Hein ? Je trolle ? Mais non...
--
Olivier Miakinen
Pascale
2009-07-13 21:31:43 UTC
Permalink
Post by Olivier Miakinen
Mais je suppose que Pascale a eu l'intelligence de ne pas faire tourner
son site en production sous Windows... Hein ? Je trolle ? Mais non...
Tsss... la base de test comme la base de prod sont sur un serveur Apache...
--
Pascale
Paul
2009-07-14 20:07:35 UTC
Permalink
Post by Pascale
Post by Olivier Miakinen
Mais je suppose que Pascale a eu l'intelligence de ne pas faire tourner
son site en production sous Windows... Hein ? Je trolle ? Mais non...
Tsss... la base de test comme la base de prod sont sur un serveur Apache...
Et alors, Apache n'a jamais tourné sous Windows ????
Pascale
2009-07-14 21:13:57 UTC
Permalink
Post by Paul
Et alors, Apache n'a jamais tourné sous Windows ????
Qu'est-ce que j'en sais, moi ?
Je lis (aussi) :
System Linux celia 2.6.29.1-grsec-em64t
--
Pascale
Loading...