IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Import csv, multi-champs


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Import csv, multi-champs
    Bonjour,
    J'utilise depuis TRÈS longtemps un script qui me permet d'importer en base un fichier txt ou csv comportant sur chaque ligne une adresse mail.
    En plus de faire l'import il supprime les doublons du fichier et les doublons entre l fichier et la db.

    Aujourd'hui je souhaiterais pouvoir importer en plus du mail d'autres infos (Nom, Prénom, Société). Tout en conservant le système de dédoublonnage sur le mail.

    Le problème est que je ne sais pas comment faire évoluer le code si dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    	function ImportAbonnes ($file)
    	{
    		if ($file['type'] == 'text/plain' || $file['type'] == 'text/csv')
    		{
    			switch ($file['error'])
    			{
    				case 0: //--- Pas d'erreur
    				$arr1 = array() ;
    				$arr2 = array() ;
     
    				//---- 
    				$sql = '	SELECT 	' . PREFIX_DB . 'newsletter_abonne.mail FROM 	' . PREFIX_DB . 'newsletter_abonne' ;
    				$query = mysql_query($sql) or die (mysql_error());
     
    				$handle = $file['tmp_name'] ; 																					// nom du fichier txt
     
    				//--- 
    				while ( $row_mail = mysql_fetch_assoc($query) ) 																				// boucle de génération d'un arry avec les mails, tableau 1
    				{ 
    				   $email = $row_mail['mail'] ; 
    				   $arr1[$email] = 1 ; 
    				} 
     
    				//--- lecture du fichier texte, tableau 2 
    				if (file_exists($handle)) 																														// vérifi l'existance du fichier
    				{ 
     
    					$buffer = fopen ($handle, "r") ;																										// ouverture du fichie en lecture
    					$buffer = file($handle) ; 						 																						// lit le fichier et le converti en tableau
    					$buffer = array_unique($buffer); 																									// supprime les doublons
     
    					$buffertmp = array_count_values($buffer);																						// tableau des doublons
    					$MailExclus = '' ;																															// déclaratiopn de la 1er valeur (avant concatenation)
     
    					foreach ($buffertmp as $key => $value)																						// boucle sur le tableau de doublon
    					{
    						if ($value > 1)
    						$MailExclus.= $key ;																													// concaténation de la valeur
    					}
     
    					foreach ($buffer as $email) 																											// boucle de génération du 2éme array
    					{ 
    					  $email = trim($email); 
    					  if ( !isset($arr1[$email]) && GlobalFunction::VerifAdresseMail($email)==TRUE)								// commpare le tableau de la bd avec celui du fichier + vérification du format du mail
    						{
    							$arr2[] = $email; 
    						} 
    						else 
    						{
    							$MailExclus.= $email . "\r\n" ;																									// liste des mails exclus
    						}
     
    					} 
     
    					if (!empty($arr2))
    					{
    						foreach($arr2 as $mail) 																											// boucle d'insertion en base des mails restant du fichier
    						{	
     
    							$insertSQL = sprintf('INSERT INTO ' . PREFIX_DB . 'newsletter_abonne (mail) VALUES (%s)',
    															Sql::GetSQLValueString($mail, "text")
    														);
    							$Result1 = mysql_query($insertSQL) or die(mysql_error());
    						}
    					}
     
    					$result2 = count($arr2); 																												// compte le Nb d'enregistrement importée
    				}
    				else
    				{
    					$retour -> msg[] = 'Impossible de lire le fichier : ' . $file['name'] ;
    					$retour -> valide[] = FALSE ;
    				}
     
     
    				/***********************************/
     
    				if (!empty($result2))
    				{
    					$retour -> msg[] = $result2 . ' adresse'  . ($result2 >= 2 ? 's' : '') . ' mail enregistré' . ($result2 >= 2 ? 's' : '') ;
    					$retour -> valide[] = TRUE ;
    				} 
    				else 
    				{
    					$retour -> msg[] = 'Après annalyse des mails du fichier "' . $file['name'] . '" et comparaison avec ceux existant en base de donnée, aucun mail n\'a été enregistré.';
    					$retour -> valide[] = FALSE ;
    				}
     
    				/**************** FIN DU PROCESSUS ****************/
    				break;
     
    				case 1: // UPLOAD_ERR_INI_SIZE
    					$retour -> msg[] = 'Le fichier téléchargé excède la taille maximum autorisée pour le téléchargement.'  ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 2: // UPLOAD_ERR_FORM_SIZE
    					$retour -> msg[] = 'Le fichier téléchargé excède la taille maximum autorisée pour le téléchargement.' ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 3: // UPLOAD_ERR_PARTIAL
    					$retour -> msg[] = 'Le fichier a été partiellement téléchargé.' ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 4: // UPLOAD_ERR_NO_FILE
    					$retour -> msg[] = 'Aucun fichier n\'a été téléchargé.' ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 5: // UPLOAD_ERR_NO_FILE
    					$retour -> msg[] = 'Erreur 5' ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 6: // UPLOAD_ERR_NO_FILE
    					$retour -> msg[] = 'Le dossier temporaire est manquant.' ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 7: // UPLOAD_ERR_NO_FILE
    					$retour -> msg[] = 'Échec de l\'écriture du fichier sur le disque.' ;
    					$retour -> valide[] = FALSE ;
    				break;
     
    				case 8: // UPLOAD_ERR_NO_FILE
    					$retour -> msg[] = 'L\'envoi de fichier est arrêté par l\'extension.' ;
    					$retour -> valide[] = FALSE ;
    				break;
    			}
    		}
    		else
    		{
    			$retour -> msg[] = 'Le fichier n\'a pas le bon format : ' . $file['type'] ;
    			$retour -> valide[] = FALSE ;
    		}
     
    		return $retour;
    	}
    Merci pour votre aide

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je pense qu'il faut que tu traites les deux dédoublonnages séparément : d'abord les doublons de mails dans le fichier, et ensuite vérifier si l'enregistrement existe avant de faire l'insertion.
    Pour lire le fichier, tu peux utiliser fgetcsv.

    A noter qu'il faut que tu saches le comportement attendu pour tous les cas genre :
    si deux lignes du fichier ont le même mail mais des noms différents, laquelle garde-t-on ?
    si le mail existe déjà en base, faut-il mettre à jour les autres infos (par exemple, si le nom est différent) ou ignorer la ligne du fichier ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je suis désolé de faire cette demande, mais pourrais je avoir de l'aide pour l'évolution de ce code.
    C'est pas moi qui l'ai fait et même si a la lecture je le comprend, le faire évolué est une autre histoire.
    Pour fgetcsv, je vais regarder ça de plus prêt.

Discussions similaires

  1. Import CSV dans un champ table
    Par pixel016 dans le forum WinDev
    Réponses: 10
    Dernier message: 27/02/2013, 23h25
  2. [AC-2007] PB Requete import csv avec champs espacés
    Par jean-didier dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/12/2011, 22h25
  3. [AC 2003] Import d'un csv => Pb champs date
    Par jean-didier dans le forum Modélisation
    Réponses: 3
    Dernier message: 26/03/2010, 16h16
  4. Import CSV et récupération de champ
    Par Hastur dans le forum QlikView
    Réponses: 2
    Dernier message: 28/09/2009, 11h56
  5. import fich. CSV - delimitateur ',' - champs contenants ','
    Par nokiariver dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/04/2006, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo