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 :

Importation de fichier excel dans BDD


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Par défaut Importation de fichier excel dans BDD
    Bonjour,
    Je souhaite importer dans ma BDD le contenu d'un fichier excel.
    Voici mon code;


    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
     
    <h1>Importer un fichier Excel</h1>
     
    <form method="post" action="?page=importer_excel_cible" enctype="multipart/form-data"> 
    	 <table border="0" cellspacing="0" cellpadding="3">
    		  <tr>
    			   <td>Fichier : </td> 
    			   <td><input type="file" name="fichier"></td> 
    		  </tr>
    		  <tr>
    				<td></td>  
    			    <td><input type="submit" name="submit" value="Valider"> </td> 
    		  </tr>
    	 </table>
    </form>
    Et le code du traitement du fichier;

    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
     
    <?php
    	include(path.'lib.php');
    	connexion();
    	$fp = fopen($_FILES['fichier']['tmp_name'], "r"); 
    	//$fp = fopen($_FILES['fichier'], "r"); 
     
     
    	while (!feof($fp))// Tant qu'on n'atteint pas la fin du fichier
    	{ 
    		$ligne = fgets($fp,4096); // On lit une ligne
     
    		/* On récupère les champs séparés par ; dans liste*/
    		$liste = explode(";",$ligne);  
     
    		/* On assigne les variables */ 
    		$refProduit = $liste[0]; 
    		$nom = $liste[1]; 
    		$dimensions = $liste[2]; 
    		$photo = $liste[3]; 
    		$categorie = $liste[4]; 
    		$qteMin = $liste[5]; 
    		$prix = $liste[6]; 
    		$classement = $liste[7]; 
     
    		echo $refProduit; 
    		echo $nom;
    		echo $dimensions;
    		echo $photo;
    		echo $categorie;
    		echo $qteMin;
    		echo $prix;
    		echo $classement;
     
    		/* Ajouter un nouvel enregistrement dans la table */ 
    		$query = "INSERT INTO produit VALUES('$refProduit','$nom','$dimensions','$photo','$categorie','$qteMin','$prix','$classement',NOW(),1,0)"; 
    		$result = MYSQL_QUERY($query); 
     
    		if(mysql_error()){ 	/* Erreur dans la base de donnees, surement la table qu'il faut créer */
    			echo '<script language="javascript" type="text/javascript">
    			 <!--
    			 alert("Erreur, importation stoppée : '.mysql_error().'");
    			history.back();
    			 -->
    			</script>';
    		} 
    		else{
    			$result2 = mysql_query("INSERT INTO matproduit (refProduit,refMat) VALUES ('$refProduit',12)");
    		} 
    	}
     
    	/* Fermeture */ 
    	fclose($fp); 
    	MYSQL_CLOSE(); 
    ?>
    Quand j'affiche le résultat de mes variables $reProduit etc j'ai des caractères spéciaux et absolument pas ce que je souhaite. Mon fichier excel contient 2 lignes correctement renseignées pourtant. Si quelqu'un a une idée...

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Il faut pouvoir gérer l'encodage.
    Excel encode en ANSI si je ne dit pas de bêtises.
    Après à voir en quoi est ta table et ton serveur PHP.

    On peut manipuler les encodages avec iconv ou mb.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est un fichier excel ou un CSV ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    1 - utilise SplFileObject::fgetcsv (ou fgetcsv en procédural)
    2 - utilise des requêtes préparées pour tes insertions
    3 - utilise des REPLACE INTO au lieu d'INSERT INTO
    4 - utilise la directive list pour setter plusieurs variables d'un coup
    5 - vérifie que l'encodage est bon au niveau de la DB, de PHP et du fichier Excel

    Logiquement ça doit ressembler à ça un import CSV:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $fic = "mon_fichier.csv";
    $file = new SplFileObject($fic, 'r');
    $file->setCsvControl(';');
     
    $stmt = $pdo->prepare('REPLACE INTO table VALUES (:a,:b,:c)');
    $stmt->bindParam(':a', $a);
    $stmt->bindParam(':b', $b);
    $stmt->bindParam(':c', $c);
     
    while ($csv = $file->fgetcsv()) {
      list($a,$b,$c) = $csv;
      $stmt->execute();
    }

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Par défaut
    Merci pour vos réponses! Alors c'est bien un fichier excel en .xlsx, j'ai essayer de changer l'encodage avec iconv mais cela ne fonctionne pas et le résultat est vide, peut-être que excel ne code pas en ansi, ou alors je l'ai mi au bon endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (!feof($fp))// Tant qu'on n'atteint pas la fin du fichier
    { 
    	$ligne = fgets($fp,4096); // On lit une ligne
    	$ligne = iconv('ANSI', 'iso-8859-15', $ligne);
    En tout cas mon while parcourt des tonnes de lignes alors qu'il n'y en a que 2, ce qui fait planter mon navigateur... Je vais essayer les autres solutions que vous m'avez donner en espérant arriver au bout de cette importation!!

    Alors voici mon nouveau code ;

    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
     
    <?php
    	include(path.'lib.php');
    	connexion();
     
    	move_uploaded_file($_FILES['fichier']['tmp_name'], $_FILES['fichier']['name']);
    	$fichier = $_FILES['fichier']['name'];
     
    	$file = new SplFileObject($fichier, 'r');
    	$file->setCsvControl(';');
     
    	$stmt = $pdo->prepare('REPLACE INTO produit VALUES (:a,:b,:c,:d,:e,:f,:g,:h,:i,:j)');
    	$stmt->bindParam(':a', $refProduit);
    	$stmt->bindParam(':b', $nom);
    	$stmt->bindParam(':c', $dimensions);
    	$stmt->bindParam(':d', $photo);
    	$stmt->bindParam(':e', $categorie);
    	$stmt->bindParam(':f', $qteMin);
    	$stmt->bindParam(':g', $prix);
    	$now= NOW();
    	$stmt->bindParam(':h', $now);
    	$param1=1;
    	$stmt->bindParam(':i', $param1);
    	$param2=0;
    	$stmt->bindParam(':j', $param2);
     
    	while ($csv = $file->fgetcsv()) {
    	  list($refProduit,$nom,$dimensions,$photo,$categorie,$qteMin,$prix,$now,$param1,$param2) = $csv;
    	  $stmt->execute();
    	}
    ?>
    Je précise que je m'y connais pas plus que ça en PHP objet! Il me donne ce message d'erreur ;
    Fatal error: Call to a member function prepare() on a non-object in /web/pros/admin/importer_excel_cible.php on line 12
    J'ai dû faire une erreur quelque part... j'ai copié le fichier sur le serveur, ce qui a fonctionné, j'espère que c'est ça qu'il fallait faire... Sinon j'avais encore plus de message d'erreur ^^'

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Fatal error: Call to a member function prepare() on a non-object in /web/pros/admin/importer_excel_cible.php on line 12
    J'ai dû faire une erreur quelque part... j'ai copié le fichier sur le serveur, ce qui a fonctionné, j'espère que c'est ça qu'il fallait faire... Sinon j'avais encore plus de message d'erreur ^^'
    Il te faut une instance PDO valide pour préparer des statements.

    Voici comment créer une instance PDO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $db = "backoffice";
    $db_type = "mysql";
    $db_user = "root";
    $db_password = "";
    $db_host = "localhost";
     
    $pdo = new PDO("$db_type:dbname=$db;host=$db_host", $db_user, $db_password);
    Je précise au passage que l'extension mysql est dépréciée en faveur de mysqli et de PDO. Par ailleurs, l'équivalent des méthodes de mysql en fonctions procédurales sont dépréciées elles-aussi (et ne sont plus disponibles depuis PHP 5.3). Je te recommande de passer dès que possible à PDO, c'est plus souple, plus propre et puis puissant que les fonction mysql classiques.

    Note également que tu peux mettre ce que tu veux dans les placeholers pour plus de lisibilité. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $query = "SELECT * FROM `table` WHERE test=:test";
    Réfères-toi à la doc pour plus de détails.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Alors c'est bien un fichier excel en .xlsx
    Donc tu ne peux pas le lire comme un fichier csv.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Par défaut
    @ sabotage : non mais c'est pas grave excel ou csv, on le transformera
    Merci benjamin, je vais essayer ça, c'est vrai que je connaissais pas du tout il faut que je me mette à la page

Discussions similaires

  1. importer un fichier excel dans une table
    Par joe370 dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/07/2007, 11h21
  2. importer une fichier excel dans une base de donnée MySQL
    Par maverick56 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 29/05/2007, 09h15
  3. Pb Importation de fichiers Excel dans Access
    Par elkhy dans le forum Access
    Réponses: 8
    Dernier message: 22/05/2006, 17h33
  4. [VBA-A] Importation de fichiers Excel dans Access
    Par elkhy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/05/2006, 17h57
  5. importer données fichier excel dans bd mysql
    Par Hydre dans le forum Administration
    Réponses: 1
    Dernier message: 05/10/2005, 19h39

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