Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 15h34   #1
Invité de passage
 
julie
Inscription : juin 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : julie

Informations forums :
Inscription : juin 2010
Messages : 36
Points : 3
Points : 3
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 :
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 :
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...
elaene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h43   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h47   #3
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
C'est un fichier excel ou un CSV ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 17h10   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
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 :
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();
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 10h56   #5
Invité de passage
 
julie
Inscription : juin 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : julie

Informations forums :
Inscription : juin 2010
Messages : 36
Points : 3
Points : 3
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 :
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 :
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 ^^'
elaene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 11h46   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
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 :
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 :
1
2
$query = "SELECT * FROM `table` WHERE test=:test";
Réfères-toi à la doc pour plus de détails.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h38   #7
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
Alors c'est bien un fichier excel en .xlsx
Donc tu ne peux pas le lire comme un fichier csv.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h42   #8
Invité de passage
 
julie
Inscription : juin 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : julie

Informations forums :
Inscription : juin 2010
Messages : 36
Points : 3
Points : 3
@ 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
elaene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h48   #9
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
C'est quand même ton problème de départ, tu lis un fichier excel comme ci c'etait un csv, tu obtiens donc n'importe quoi.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h55   #10
Invité de passage
 
julie
Inscription : juin 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : julie

Informations forums :
Inscription : juin 2010
Messages : 36
Points : 3
Points : 3
@ sabotage : non c'est bien un fichier .csv ne t'en fais pas. Et de toute façon quand c'était un fichier excel traité comme un fichier excel, cela ne marchait pas non plus.

Bon sinon j'ai rajouter la connexion à la bdd, plus de message d'erreur mais rien d'ajouter dans la bdd, y aurait-il un moyen de tester pour voir où est l'erreur?? ^^'
elaene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h33   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Sabotage à raison, les fichiers CSV doivent être des fichiers plain-text.

Pour voir les messages d'erreur, on doit faire:
Code :
1
2
3
4
5
 
if (!$stmt->execute()) {
  $err = $pdo->errorInfo();
  echo "Erreur : $err[2] with code $err[1]";
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h15   #12
Invité de passage
 
julie
Inscription : juin 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : julie

Informations forums :
Inscription : juin 2010
Messages : 36
Points : 3
Points : 3
j'ai placé ton bout de code dans la boucle while et j'ai le résultat suivant : "Erreur : with code Erreur : with code Erreur : with code"
Concernant le fichier csv j'en ai testé plusieurs différents; un qui était un .xlsx dont jai renommé l'extension, un que j'ai créé sous le bloc note avec des ";" en séparateur et nommé en .csv, des trucs comme ça et mon fichier apparait bien en .csv mais impossible d'en savoir plus et il a plus ou moins l'icône d'un fichier excel sauf qu'il y a un "a," écrit dessus.
Ca doit etre du à mon microsoft office car avant mes fichiers .csv s'ouvraient dans le bloc note et non pas sous forme de classeur excel. Donc bon après je vois pas quoi faire d'autre il me parait correct ce fichier
En même temps je suis pas spécialiste des fichiers de ce type donc si vous avez une solution je suis toute ouïe
elaene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 16h09   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
j'ai placé ton bout de code dans la boucle while et j'ai le résultat suivant : "Erreur : with code Erreur : with code Erreur : with code"
ça c'est étrange...

Excel est tout à fait capable de lire les fichiers .csv, qu'ils aient été crées dans le bloc note ou non.

Voici un exemple de fichier CSV:
Code :
1
2
3
4
 
a;b;c
d;e;f
h;;j
Tout simplement.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 15h41   #14
Invité de passage
 
julie
Inscription : juin 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : julie

Informations forums :
Inscription : juin 2010
Messages : 36
Points : 3
Points : 3
Oui c'est comme ça que je l'ai créé donc je ne comprends pas que ça ne marche pas, le problème doit être ailleurs Le soucis c'est que je ne connais vraiment pas cette manière de faire moi je suis restée en php basique ^^' donc là je vois pas trop, j'ai pourtant bien fait comme on m'a dit donc bon... ya pas moyen d'ajouter ce type de fichier directement sur phpmyadmin ou quoi??
elaene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 14h19   #15
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Voici ce que j'utilise pour traiter les fichiers Excel.
Le fichier import_excel.php contient le formulaire de traitement.
Il faut également le fichier "reader.php" qui nécessite lui même le fichier "oleread.inc"
Afin de pouvoir mettre le dernier fichier j'ai du le renommer en oleread.inc.php. Il te faudra retirer l'extension '.php'.
Fichiers attachés
Type de fichier : php import_excel.php (4,2 Ko, 1 affichages)
Type de fichier : php reader.php (41,1 Ko, 1 affichages)
Type de fichier : php oleread.inc.php (8,2 Ko, 1 affichages)
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 12h28   #16
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
Salut,

A mon avis tu devrais suivre le conseil de sabotage et de Benjamin Delespierre : "Utilises un fichier CSV".
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h25.


 
 
 
 
Partenaires

Hébergement Web