Page 1 sur 1

Votre avis sur mon script de tracking de mail

Posté : 16 août 2007, 21:53
par rider
Bonjour,

J'ai développé un script php couplé avec une bdd permettant de faire du suivi d'e-mailing. A savoir: qui a lu le mail? quand? A-t-il visité le site web indiqué dans le mail depuis le mail?

Pour cela, je mets une balise <img> dans mon mail qui pointe vers une page php. Pour les infos de click sur les liens, j'ai modifié l'index du site avec un peu de php qui récupère l'IP et qui fait +1 sur un compteur dans la base de données.

Ma table sql retour possède 5 champs:
mail=mail du destinataire
nombre=nombre de lecture
date=date de lecture
adripmail= @Ip de lecture
web=nombre de visites sur le site depuis le mail

Lors de mon envoi de mail, j'importe toutes les adresses dans la table et j'initialise tous les champs.

J'aimerai avoir votre avis sur la façon dont j'ai codé le script (c'est mon premier script) et s'il est "optimal" (pas de cas boiteux oublié):
Voici l'algo final auquel je suis parvenu:
Image
Voici le code associé:
//Récupération de l'@ IP
        if($_SERVER)    {
                        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
                                        $adress = $_SERVER['HTTP_X_FORWARDED_FOR'];
                                elseif(isset($_SERVER['HTTP_CLIENT_IP']))
                                        $adress = $_SERVER['HTTP_CLIENT_IP'];
                                else
                                        $adress = $_SERVER['REMOTE_ADDR'];
        }
        else            {
                                if(getenv('HTTP_X_FORWARDED_FOR'))
                                        $adress = getenv('HTTP_X_FORWARDED_FOR');
                                elseif(getenv('HTTP_CLIENT_IP'))
                                        $adress = getenv('HTTP_CLIENT_IP');
                                else
                                        $adress = getenv('REMOTE_ADDR');
        }
        //Test sur l'adresse IP
        $iptmp=mysql_query("select adripmail from retour where mail='$mail'");
        $adrip=mysql_fetch_array($iptmp);
        //@IP = valeur par défaut -> nouvelle lecture -> mise à jour de tous les champs
        if($adrip['adripmail']=="xx")
        {
                mysql_query("update retour set nombre=nombre+1, date='$date', adripmail='$adress' where mail='$mail'");
        }
        else
        {
        //Seconde lecture
                //Si @IP actuelle est différente de celle enregistrée
                if($adress!=$adrip['adripmail'])
                {
                        //Test pour éviter les doublons
                        $req=mysql_query("select * from retour where adripmail='$adress' and mail='$mail'");
                        $res=mysql_num_rows($req);
                        if($res=='0')
                        {
                                //Si non présent, on insère une nouvelle ligne dans la base
                                $mailencod=utf8_encode($mail);
                                mysql_query("insert into retour(mail,nombre,date,adripmail,web) values('$mailencod','1','$date','$adress','0')");
                        }
                        else
                        {
                                //Sinon, update du compteur de lecture
                                mysql_query("update retour set nombre=nombre+1 where mail='$mail' and adripmail='$adress'");
                        }
                }
                //Sinon mise à jour du compteur de lecture
                else
                {
                mysql_query("update retour set nombre=nombre+1 where mail='$mail' and adripmail='$adress'");
                }
        }
J'ai pas tout mis car le début est pas utile, c'est la connexion au sql et la récupération du mail.
Pour ma part, je l'ai testé et il semble fournir le résultat attendu...

Merci d'avance de vous pencher dessus.

Re: Votre avis sur mon script de tracking de mail

Posté : 16 août 2007, 23:41
par dunbar
Suite à un petit tuto de RYLEici
Je pense que cette syntaxe est plus correct :?:
<?php
//Récupération de l'@ IP 
        if($_SERVER)    { 
                        if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
                                        $adress = $_SERVER['HTTP_X_FORWARDED_FOR']; 
                                elseif(isset($_SERVER['HTTP_CLIENT_IP'])) 
                                        $adress = $_SERVER['HTTP_CLIENT_IP']; 
                                else 
                                        $adress = $_SERVER['REMOTE_ADDR']; 
        } 
        else            { 
                                if(getenv('HTTP_X_FORWARDED_FOR')) 
                                        $adress = getenv('HTTP_X_FORWARDED_FOR'); 
                                elseif(getenv('HTTP_CLIENT_IP')) 
                                        $adress = getenv('HTTP_CLIENT_IP'); 
                                else 
                                        $adress = getenv('REMOTE_ADDR'); 
        } 
        //Test sur l'adresse IP 
        $iptmp=mysql_query("select adripmail from retour where mail='".$mail."'"); 
        $adrip=mysql_fetch_array($iptmp); 
        //@IP = valeur par défaut -> nouvelle lecture -> mise à jour de tous les champs 
        if($adrip['adripmail']=="xx") 
        { 
                mysql_query("update retour set nombre=nombre+1, date='".$date."', adripmail='".$adress."' where mail='".$mail."'"); 
        } 
        else 
        { 
        //Seconde lecture 
                //Si @IP actuelle est différente de celle enregistrée 
                if($adress!=$adrip['adripmail']) 
                { 
                        //Test pour éviter les doublons 
                        $req=mysql_query("select * from retour where adripmail='".$adress."' and mail='".$mail."'"); 
                        $res=mysql_num_rows($req); 
                        if($res=='0') 
                        { 
                                //Si non présent, on insère une nouvelle ligne dans la base 
                                $mailencod=utf8_encode($mail); 
                                mysql_query("insert into retour(mail,nombre,date,adripmail,web) values('".$mailencod."','1','".$date."','".$adress."','0')"); 
                        } 
                        else 
                        { 
                                //Sinon, update du compteur de lecture 
                                mysql_query("update retour set nombre=nombre+1 where mail='".$mail."' and adripmail='".$adress."'"); 
                        } 
                } 
                //Sinon mise à jour du compteur de lecture 
                else 
                { 
                mysql_query("update retour set nombre=nombre+1 where mail='".$mail."' and adripmail='".$adress."'"); 
                } 
        } 



?>
Mais c'est juste un avis perso :)

Posté : 17 août 2007, 10:32
par rider
j'ai apporté la modif que tu m'as cité

j'ai également rajouté

Code : Tout sélectionner

or die('Erreur de connexion')
lors de la connexion

quoi d'autres à modifier?