comment parser une adresse mail

comment parser une adresse mail - PHP - Programmation

Marsh Posté le 20-10-2004 à 13:21:26    

voila j'ai besoin de parser un fichier texte et en extraire les adresses mail, trier, enregistrer dans la base uniquement ceux qui n'existent pas... comment je pourrai proceder ?  
 
j'imagine qu'il faut "parser" le fichier et controler les adresses mails.... mais je sais pas comment faire

Reply

Marsh Posté le 20-10-2004 à 13:21:26   

Reply

Marsh Posté le 20-10-2004 à 13:37:28    

freed102 a écrit :

voila j'ai besoin de parser un fichier texte et en extraire les adresses mail, trier, enregistrer dans la base uniquement ceux qui n'existent pas... comment je pourrai proceder ?  
 
j'imagine qu'il faut "parser" le fichier et controler les adresses mails.... mais je sais pas comment faire


 
je fais un fread...
 
puis un truc genre  (vite fait)
 
 

Code :
  1. if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email))
  2.  {
  3.         $sql="insert into clients";
  4. $sql.=values email=$email";
  5. mysql_query($sql);
  6.  }


 
 :??:

Reply

Marsh Posté le 20-10-2004 à 13:42:34    

je verrai une syntaxe plus proche de ça:

Code :
  1. $sql="insert into clients(email)";
  2. $sql.="values '".$email."'";


 


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 20-10-2004 à 13:44:19    

et puis tu veux enregistrer que ceux qui n'existe pas il me semble, donc il faut tester un mail avant de l'insérer...
 
je verrai bien lire ta base une fois pour en extraire les mails, les stocker dans un tableau, ensuite avant d'insérer un mail, tu vérifie qu'il n'est pas dans le tableau.


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 20-10-2004 à 13:47:00    

donc :  
1/ lire ta base de donnée et stocker tous les mails dans un tableau
2/ paser ton fichier texte avec une regex pour trouver les mails...
3/ comparer les mails de la base et les mail du fichier (in_array est ton ami)
4/ ajouter les mails manquant dans la base...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 14:05:59    

Xav_ a écrit :

je verrai une syntaxe plus proche de ça:

Code :
  1. $sql="insert into clients(email)";
  2. $sql.="values '".$email."'";




 
oui tu as raison j'ai fait ça vite fait sans me soucier de la syntaxe exacte du insert into
thx

Reply

Marsh Posté le 20-10-2004 à 14:07:53    

je viens de me rendre compte que mon fichier ressemble à un fichier csv avec des tabulations comme séparateurs... donc je suis en train d'etudier la fonction fgetcsv avec un "\t" comme argument de séparateur... j'arrive à lister la liste des emails contenus dans le fichier... c deja un bon debut ! :) (même si j'ai pas vraiment parsé le fichier)

Reply

Marsh Posté le 20-10-2004 à 14:08:53    

si il n'y a que des adresses email dans le fichier c'est encore plus simple, il n'y a pas besoin des regex...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 14:28:55    

bah en fait c galere parcequ'il y a pas que des adresses, et par moments l'adresse n'est pas dans sa colonne respective.. alors là faut trier ! lol

Reply

Marsh Posté le 20-10-2004 à 16:30:25    

Alors un autre probleme arrive...
 
voila j'ai exporté tous les emails proprement,
j'ai remplacé les champs vides par l'adresse mail elle même (genre si il manque le nom, on remplace par l'adresse car un champ nom vide est pas tres correct à mon sens)
et j'enregistre dans la base uniquement si il n'existe pas dans la base...
 
tout s'enregistre à merveille... pas de doublon possible...
 
cependant... il m'enregistre que 128 elements...(sur 3500 environs).... c sympa !!! d'ou ça vient ? on est pas limité à 128 recordsets dans une table quand même ? ou alors c ma boucle qui est trop longue ??? :??:

Reply

Marsh Posté le 20-10-2004 à 16:30:25   

Reply

Marsh Posté le 20-10-2004 à 16:36:43    

ca, ca viens de ta table...
l'id est surement un tinyint limité a 128...
 
faut changer ca et mettre plus


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 17:18:11    

oui ça va mieux mais ya toujours un probleme, j'ai l'impression que ma boucle plante tant il m'enregristre pas toujours le même nombre d'enregistrements :-/


Message édité par freed102 le 20-10-2004 à 17:19:08
Reply

Marsh Posté le 20-10-2004 à 17:20:26    

fait des echos pour voir l'avancement...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 17:21:55    

bah c ce que je fais... il plante une fois au 57e, quand je faire reload il plante au 44e, puis quand je faire reload, il plante au 75e... etc etc.. bizarre quoi !

Reply

Marsh Posté le 20-10-2004 à 17:24:00    

plante ? il met un message d'erreur ?


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 17:31:15    

KangOl a écrit :

plante ? il met un message d'erreur ?


 
non ya pas de message d'erreur mais il arrete de mouliner avant la fin et n'affiche pas la suite ;-(

Reply

Marsh Posté le 20-10-2004 à 17:31:53    

ne riez pas trop mais voila mon code :
 

Code :
  1. <?php
  2. include ("./db.php" );
  3. $result=dbreq("select email from visiteurs" );
  4. $numrows=mysql_num_rows($result);
  5. for($i=1;$i<=$numrows;$i++){
  6. $databdd=mysql_fetch_array($result);
  7. $data_bdd_array[$i][email]=$databdd[email];
  8. }
  9. echo "nbr de mails enregistrés : $numrows";
  10. //print_r($data_bdd_array);
  11. //print_r($databdd);
  12. echo "<p>--------------------</p>";
  13. $row = 1;
  14. $row_mail=1;
  15. $row_nom=1;
  16. $handle = fopen("test.csv", "r" );
  17. while (($data = fgetcsv($handle, 100000, "\t" )) !== FALSE)
  18. {
  19.    echo "<p>";
  20.    echo "N° : $row<br />\n";
  21.    echo "Nom : $data[0]<br />\n";
  22.    echo "Prenom : $data[1]<br />\n";
  23.    echo "Surnom : $data[4]<br />\n";
  24.    echo "Email : $data[34]<br />\n";
  25.  
  26.      if(!in_array(strtolower($data[34]),$data_bdd_array))
  27.      {
  28.        echo " n'est pas dans la base";
  29.        echo "<br />";
  30.      
  31.        $name=strtoupper($data[0].$data[1].$data[4]);
  32.        $email=strtolower($data[34]);
  33.      
  34.        if(empty($name))
  35.        {
  36.        $name=strtoupper($email);
  37.        }
  38.        if(!empty($email))
  39.        {
  40.        $row_mail++;
  41.        $result=dbreq("INSERT INTO visiteurs (nom, email, droits) VALUES ('$name', '$email','0')" );
  42.        }
  43.        echo $email." est  enregistré !</p><hr>";
  44.      }
  45.      else
  46.      {
  47.      echo "<br/> est deja dans la base</p><hr>";
  48.      }
  49.  $result=dbreq("select email from visiteurs" );
  50.  $numrows=mysql_num_rows($result); 
  51.  for($i=1;$i<=$numrows;$i++)
  52.  {
  53.  $databdd=mysql_fetch_array($result);
  54.  $data_bdd_array[$i][email]=$databdd[email];
  55.  }
  56. $row++;
  57. }
  58. fclose($handle);
  59. echo $row_mail." mails enregistrés sur ".$row." enregistrements<br />";
  60. print_r($data_bdd_array);
  61. ?>

Reply

Marsh Posté le 20-10-2004 à 17:38:05    

tu aurais pas un pb à cause du temps maximum d'exécution du script (voir php.ini) ???


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 20-10-2004 à 17:39:34    

oui c peut etre un truc comme ça.. en fait je sais pas comment acceder à php.ini (ne riez pas !!!!! lol)
PS : l'hebergeur c'est Online.net ... peut etre c la le probleme

Reply

Marsh Posté le 20-10-2004 à 17:40:19    

ligne 57 : pourquoi tu refait la requete ?


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 17:41:36    

freed102 a écrit :

oui c peut etre un truc comme ça.. en fait je sais pas comment acceder à php.ini (ne riez pas !!!!! lol)
PS : l'hebergeur c'est Online.net ... peut etre c la le probleme

http://be2.php.net/manual/fr/funct [...] -limit.php


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-10-2004 à 17:42:37    

autre remarque... mon test si l'email existe dans la base marche pas :( j'ai quand même des doublons :(

Reply

Marsh Posté le 20-10-2004 à 17:46:18    

pkoi faire un mysql_num_rows puis un for de 0 à numrows, avec un while mysql_fetch_array ça le ferai très bien aussi...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 20-10-2004 à 17:47:00    

Warning: set_time_limit, getmyuid, getmypid, dl, mail, ini_alter, ini_restore, ini_set, exec, passthru, system, popen, leak, mysql_list_dbs, listen, chown, chmod, chgrp, diskfreespace, rmdir, realpath, tmpfile, link, imap_mail() has been disabled for security reasons in testcsv.php on line 11
 
:( :( :( :cry:

Reply

Marsh Posté le 20-10-2004 à 17:50:22    

ton hébergeur ne te permet pas de changer cette valeur (le time-limit), donc tu l'a dans l'os :(
mais en effet avec la requete dans le while, elle va se faire 3500 fois d'après un tes posts précédent --> ça pue, faut que tu arrive avec une vérification qui marche dans le tableau, sans refaire une lecture de la BDD à chaque fois...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 20-10-2004 à 17:51:28    

de meme tu peux grouper tes VALUES pour ne faire qu'une seule requete d'INSERT à la fin ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 20-10-2004 à 18:05:30    

Xav_ a écrit :

ton hébergeur ne te permet pas de changer cette valeur (le time-limit), donc tu l'a dans l'os :(
mais en effet avec la requete dans le while, elle va se faire 3500 fois d'après un tes posts précédent --> ça pue, faut que tu arrive avec une vérification qui marche dans le tableau, sans refaire une lecture de la BDD à chaque fois...


 
j'ai fait comme ça car en fait si je lis qu'une fois le contenu de la bdd... il peut pas voir si l'adresse existe dedans... donc il relis à chaque instance de la boucle... à moins de tricher en ajoutant l'adresse insérée dans le tableau ($data_bdd_array) (sans relire la bdd)... non ?

Reply

Marsh Posté le 20-10-2004 à 18:10:44    

bin oui...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-10-2004 à 08:12:34    

freed102 a écrit :

j'ai fait comme ça car en fait si je lis qu'une fois le contenu de la bdd... il peut pas voir si l'adresse existe dedans... donc il relis à chaque instance de la boucle... à moins de tricher en ajoutant l'adresse insérée dans le tableau ($data_bdd_array) (sans relire la bdd)... non ?


 
ben c'est pas de la triche, c'est plutot la bonne méthode ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 21-10-2004 à 12:53:09    

donc je n'insere qu'une seule fois dans la base ? c possible ?

Reply

Marsh Posté le 21-10-2004 à 15:05:46    

oui


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 21-10-2004 à 15:06:42    

avec 3500 adresses ça va pas faire une commande de 200 lignes pour MySQL ?

Reply

Marsh Posté le 21-10-2004 à 15:23:19    

et alors ? quand je fais un site avec une BDD, pour l'installer plus facilement en ligne, je crée un fichier sql avec la strcuture et données des tables... quand le le balance en ligne (avec PHPmyadmin), c'est pas rare qu'il exécute plusieurs centaine de ligne de requete...
il te dis juste à la fin combien d'instruction ça a fait ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 21-10-2004 à 15:33:40    

sympa !!! on peut envoyer des requetes sql avec des tableaux? ou il faut decomposer le tableau ?
 
Je galere toujours avec mon timeout... j'ai supprimé les requetes sql successives.. j'arrive à un meilleur resultat.. Mais la boucle n'est toujours pas bouclée ! :(
 
de plus il compare pas correctement avec les mails deja existants.. il renvoie que le mail n'existe pas à chaque fois (même quand il existe... ma technique avec in_array ne doit pas etre bonne)
 

Code :
  1. <?php
  2. phpinfo();
  3. //set_time_limit(3200) ;
  4. include ("./db.php" );
  5. $result=dbreq("select email from visiteurs" );
  6. $numrows=mysql_num_rows($result);
  7. for($i=1;$i<=$numrows;$i++){
  8. $databdd=mysql_fetch_array($result);
  9. $data_bdd_array[$i][email]=$databdd[email];
  10. }
  11. echo "nbr de mails enregistrés : $numrows";
  12. //print_r($data_bdd_array);
  13. //print_r($databdd);
  14. echo "<p>--------------------</p>";
  15. $row = 1;
  16. $row_mail=1;
  17. $row_nom=1;
  18. $handle = fopen("test.csv", "r" );
  19. while (($data = fgetcsv($handle, 100000, "\t" )) !== FALSE)
  20. {
  21.    echo "<p>";
  22.    echo "N° : $row<br />\n";
  23.    echo "Nom : $data[0]<br />\n";
  24.    echo "Prenom : $data[1]<br />\n";
  25.    echo "Surnom : $data[4]<br />\n";
  26.    echo "Email : $data[34]<br />\n";
  27.  
  28.      if(!in_array(strtolower($data[34]),$data_bdd_array))
  29.      {
  30.        echo " n'est pas dans la base";
  31.        echo "<br />";
  32.      
  33.        $name=strtoupper($data[0].$data[1].$data[4]);
  34.        $email=strtolower($data[34]);
  35.      
  36.        if(empty($name))
  37.        {
  38.        $name=strtoupper($email);
  39.        }
  40.        if(!empty($email))
  41.        {
  42.        $row_mail++;
  43.        $data_bdd_array[$row][email]=$email;
  44.        $data_bdd2record=$email;
  45.       // $result=dbreq("INSERT INTO visiteurs (nom, email, droits) VALUES ('$name', '$email','0')" );
  46.        }
  47.        $data_bdd_array[$row][email]=$email;
  48.        echo $email." est  enregistré !</p><hr>";
  49.      }
  50.      else
  51.      {
  52.      echo "<br/> est deja dans la base</p><hr>";
  53.      }
  54. $row++;
  55. }
  56. fclose($handle);
  57. echo $row_mail." mails enregistrés sur ".$row." enregistrements<br />";
  58. print_r($data_bdd2record);
  59. ?>


Message édité par freed102 le 21-10-2004 à 15:36:56
Reply

Marsh Posté le 21-10-2004 à 18:42:06    

bon !! bonne nouvelle j'ai resolu le probleme de "in_array"
 
.. en fait mon tableau n'etait pas "conforme" donc j'ai trouvé un moyen pour qu'il le soit (un tableau en deux dimensions et non pas un tableau de tableaux !)
 
pour cela faut squizzer le coté "array" du resultat de "mysql_fetch_array" (enfin c ce que j'ai essayé de faire)

Code :
  1. while($databdd=mysql_fetch_array($result))
  2. {
  3. $mailfound=$databdd['email'];
  4. $id=$databdd['id'];
  5. $data_bdd_array[$id]=$mailfound;
  6. $n++;
  7. }


comme ça le tableau est propre et in_array fonctionne bien
 
c deja ça !!! j'ai plus de doublons dans ma base ! :D

Reply

Marsh Posté le 21-10-2004 à 18:54:38    

voila la derniere version de mon code  
 

Code :
  1. <?php
  2. include ("../db.php" );
  3. $result=dbreq("select id, email from visiteurs" );
  4. $numrows=mysql_num_rows($result);
  5. $n=1;
  6. while($databdd=mysql_fetch_array($result))
  7. {
  8. $mailfound=$databdd['email'];
  9. $id=$databdd['id'];
  10. $data_bdd_array[$id]=$mailfound;
  11. $n++;
  12. }
  13. echo "<h2>Anciens enregistrements</h2>";
  14. echo "nbr de mails enregistrés : $numrows";
  15. /*echo "<pre>";
  16. print_r($data_bdd_array);
  17. echo "</pre>";*/
  18. echo "<hr>";
  19. $row = 1;
  20. $row_mail=1;
  21. $row_nom=1;
  22. $file="emails3.txt";
  23. $handle = fopen($file, "r" );
  24. while (($data = fgetcsv($handle, 100000, "\t" )) !== FALSE)
  25. {
  26.    echo "<p>";
  27.    echo "N° : $row<br />\n";
  28.    echo "Nom : $data[0]<br />\n";
  29.    echo "Prenom : $data[1]<br />\n";
  30.    echo "Surnom : $data[4]<br />\n";
  31.    echo "Email : $data[34]<br />\n";
  32.    $mailtest=strtolower($data[34]);
  33.  
  34.      if(!in_array("$mailtest",$data_bdd_array))
  35.      {
  36.        echo " n'est pas dans la base";
  37.        echo "<br />";
  38.      
  39.        $name=strtoupper($data[0].$data[1].$data[4]);
  40.        $email=strtolower($data[34]);
  41.      
  42.        if(empty($name))
  43.        {
  44.        $name=strtoupper($email);
  45.        }
  46.        if(!empty($email))
  47.        {
  48.        $row_mail++;
  49.        //$data_bdd_array[email]=$email;
  50.        $result=dbreq("INSERT INTO visiteurs (nom, email, droits) VALUES ('$name', '$email','0')" );
  51.        $id++;
  52.        $data_bdd_array[$id]=$email;
  53.        $data_bdd_new[$id]=$email;
  54.        }
  55.      
  56.        echo "<font color=blue><b>NOM : </b>$name<br /><b>EMAIL :</b> $email est  maintenant ajouté dans la base !</font></p><hr>";
  57.      }
  58.      else
  59.      {
  60.      echo "<font color=red><br/>$data[34] est deja dans la base</font></p><hr>";
  61.      }
  62. $row++;
  63. }
  64. fclose($handle);
  65. echo "<h2>Nouveaux enregistrements</h2>";
  66. echo $row_mail." mails enregistrés sur ".$row." répertoriés<br />";
  67. echo "<pre>";
  68. print_r($data_bdd_new);
  69. echo "</pre>";
  70. ?>


Message édité par freed102 le 21-10-2004 à 18:55:05
Reply

Marsh Posté le 21-10-2004 à 20:26:54    

c'est marrant mais le coup du while il me semble que je l'avai abordé... et du coup je crois que ton mysql_num_rows ne sert plu à rien (tu t'en servait que dans le for), encore une instruction à virer pour réduire le tps d'execution...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 22-10-2004 à 12:11:44    

Xav_ a écrit :

c'est marrant mais le coup du while il me semble que je l'avai abordé... et du coup je crois que ton mysql_num_rows ne sert plu à rien (tu t'en servait que dans le for), encore une instruction à virer pour réduire le tps d'execution...


 
je m'en sers uniquement pour afficher le nombre d'enregistrements "Vous avez x enregistrements"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed