Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

Php import données .csv dans mysql

stefart, le jeudi 24 avril 2008 à 15:48:19 
 Signaler ce message aux modérateurs

Bonjour a vous,

je cherche a importer des données d'excel (format .csv) dans ma base mysql via un script php que j'ai trouvé sur CCM (merci Doctormad au passage) :
http://www.commentcamarche.net/forum/affich 465200 importer des feuilles excel dans mysql
Je l'ai adapté a mes besoins et ca marche bien mais malheureusement qu'un seule foi !
En effet lors du deuxième test, l'import ne prend que la 1 ligne de la feuille en m'indique l'erreur suivante :
Duplicate entry '127' for key 1

Et ca ne remarche que si je vide ma table et que je relance le script

Je me casse la tête sur le problème et je ne comprend pas pourquoi !

voici le script de d'import :

<table width="505" border="1" align="center" cellpadding="2" cellspacing="0" bgcolor="#eeeeee">
<tr>
  <td>&nbsp;</td>
  <td>codebarre</td>
  <td>Marque</td>
  <td>QTY</td>
  <td>Prix vente </td>
  <td>Decsr</td>
</tr>
<?php
// vérification sur la session authentification (la session est elle enregistrée ?)
// ici les éventuelles actions en cas de réussite de la connexion
require_once('config.php');

//=========================
// Traitement des donnees
//=========================

//recupere le nom du fichier indiqué par l'user
$fichier=$_FILES["userfile"]["name"];

// ouverture du fichier en lecture
if ($fichier)
{
//ouverture du fichier temporaire
$fp = fopen ($_FILES["userfile"]["tmp_name"], "r");
}
else{
// fichier inconnu
?>
<p align="center" >- Importation échouée -</p>
<p align="center" ><B>Désolé, mais vous n'avez pas spécifié de chemin valide ...</B></p>
<?php
exit();
}
// declaration de la variable "cpt" qui permettra de compter le nombre d'enregistrement réalisé
$cpt=0;
?>
<p align="center">- Importation Réussie -</p>

<p align="right"><a href="#bas">Bas de page</a></p>

<?php
// importation
while (!feof($fp))
{
$ligne = fgets($fp,4096);
// on crée un tableau des élements séparés par des points virgule
$liste = explode(";",$ligne);
// premier élément
$liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
$liste[2] = ( isset($liste[2]) ) ? $liste[2] : Null;
$liste[3] = ( isset($liste[3]) ) ? $liste[3] : Null;
$liste[5] = ( isset($liste[5]) ) ? $liste[5] : Null;
$liste[6] = ( isset($liste[6]) ) ? $liste[6] : Null;
$liste[7] = ( isset($liste[7]) ) ? $liste[7] : Null; 

$champs1=$liste[0]; // id
$champs2=$liste[2]; // code barre
$champs3=$liste[3]; // marque
$champs4=$liste[5]; // quantité
$champs5=$liste[6]; // prix
$champs6=$liste[7]; // titre description

// pour eviter qu un champs "nom" du fichier soit vide
if ($champs1!='')
{
// nouvel ajout, compteur incrémenté
$cpt++;
// requete et insertion ligne par ligne
// champs1 id en general donc on affecte pas de valeur

$sql= "INSERT INTO annonces (codebarre,marque,quantite,prix,titre)
		VALUES('$champs2','$champs3','$champs4','$champs5','$champs6') ";
		
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
  
//suppr la ligne qui comporte le nom des colonnes
$champs3="Marque";
mysql_query("DELETE FROM annonces WHERE (Marque='$champs3')");

?>
<tr>
<td width="124">Eléments importés :</td>
<td width="361"><?php echo $champs2;?></td>
<td width="361"><?php echo $champs3;?></td>
<td width="361"><?php echo $champs4;?></td>
<td width="361"><?php echo $champs5;?></td>
<td width="361"><?php echo $champs6;?></td>
</tr>

<?php
}
}

// fermeture du fichier
fclose($fp);
//on supprime la derniere car elle est vide


//==================
// FIN
//==================
?>
</table>
<br><br>Nombre de valeurs nouvellement enregistrées: <b><?php echo $cpt;?></b>


Quelqu'un peut il me dire ce qui ne va pas ou bien alors une petite solution ne serait pas de refus !
merci beaucoup ! --
Configuration: Windows XP
Firefox 2.0.0.14

1

kilian, le jeudi 24 avril 2008 à 15:56:05

Salut,

Oui c'est au niveau de la base que ça coince, tu essaies de réinsérer des données déjà insérées. L'erreur se produit au niveau d'une colonne de la table annonce qui possède une contrainte d'unicité. C'est à dire qu'une valeur peut apparaitre qu'une et une seule fois.

Généralement c'est au niveau des clés primaires de table qu'il y a ce genre de contrainte. Mais là il y a une contrainte sur un autre champs puisque tu ne touches pas au champs id (comme tu le dis en commentaire).
Il faut trouver la colonne qui a une contrainte d'unicité.
Tu utilises phpMyAdmin?

Répondre à kilian

3

stefart, le jeudi 24 avril 2008 à 16:12:23

Salut Kilian,

merci déjà pour ta réponse très rapide

alors oui j'utilise bien phpMyAdmin
j'ai bien deux champs au format tinyint id_annonces et id_clients
d'ailleurs j'ai augmenter la capacité du champs id de tinyint(4) a tinyint(30) je pensai que ça pouvais avoir un effet mais finalement le problème est toujours là !!!

Mais voici la structure de ma table :

CREATE TABLE `annonces` (
  `id_annonce` tinyint(30) NOT NULL auto_increment,
  `date_saisie` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `titre` text collate latin1_german2_ci NOT NULL,
  `themes` varchar(30) collate latin1_german2_ci NOT NULL default '',
  `prix` decimal(10,2) NOT NULL default '0.00',
  `id_clients` tinyint(4) NOT NULL default '0',
  `img` varchar(100) collate latin1_german2_ci NOT NULL,
  `codebarre` varchar(100) collate latin1_german2_ci NOT NULL,
  `marque` varchar(100) collate latin1_german2_ci NOT NULL,
  `etat` varchar(100) collate latin1_german2_ci NOT NULL,
  `quantite` decimal(10,0) NOT NULL,
  PRIMARY KEY  (`id_annonce`),
  KEY `id_clients` (`id_clients`)
) ENGINE=MyISAM AUTO_INCREMENT=65 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci COMMENT='Tb annonces' AUTO_INCREMENT=65 ;


merci de ton aide --

Répondre à stefart

2

kilian, le jeudi 24 avril 2008 à 16:06:52

Enfin le vrai problème c'est que tu réinsères des données qui ont déjà été insérées.

Répondre à kilian

4

stefart, le jeudi 24 avril 2008 à 16:16:11

Salut,

comment ca ? --

Répondre à stefart

5

Amen, le jeudi 24 avril 2008 à 23:44:54

Au fait comme la dit mon predecesseur tu reinsere les donne deja presente
Au fait la structure de ta table ne ne permet pas la duplication des donnee . Ton ie la premiere colonne est un autoincremente donc il ne peut pas inserer ce ki existe avt?

la solution ninsere pas les donne deja presente dans le fichier

Répondre à Amen

6

stefart, le vendredi 25 avril 2008 à 17:02:05

Salut!

Je ne comprend pas a present meme si j'ajoute un enregistement a ma table via myAdmin
J'ai l'erreur Duplicate entry '127' for key 1

étrange !!
--

Répondre à stefart

7

kilian, le vendredi 25 avril 2008 à 17:09:46
  • +2

Noon, j'ai compris!
Ta clé primaire c'est un tinyint et ça c'est mal!
Les tinyint ne vont que de -128 à 127 voilà ou est le problème! Il essaie de réincrémenter la clé primaire mais il peut pas, il est bloqué à 127, donc il prend 127 et comme ça existe déjà, ça plante.

Change le type de id_annonce en INT, là tu as de quoi faire (environ 2 milliard).

Répondre à kilian

8

kilian, le vendredi 25 avril 2008 à 21:16:27

Si c'est bien ça surtout n'hésite surtout pas à le dire, ça nous permettra de mettre la solution dans la faq.

Répondre à kilian

9

stefart, le lundi 28 avril 2008 à 10:35:06
  • +1

Salut !

J'ai changé le champ id_annonce de tinyint en int et là ça marche super !
merci beaucoup --

Répondre à stefart

10

kilian, le lundi 28 avril 2008 à 13:19:08
  • +1

Génial! :-)

Répondre à kilian

11

 manu, le mardi 6 janvier 2009 à 10:23:22

Salut!
voilà gf ce projet a faire en stage!
g utilisé du code trouvé sur différent site mais sans succes!
pourrait tu me dire ou mexpliker komen tu ti est prie!
et si tu a tj ton code et ta base de doné me les faire communiquer!
merci bcp!
je compte sur toi!

Répondre à manu
[php]Import fichier .txt dans BDD Mysql Bonjour, je suis en stage au service informatique du contre espionnage français et je cherche une solution pour importer un fichier texte en php. Avec une mise à jour toute les 6 h. Voici l'adresse: http://www.satcodx1.com/_data/0130.txt Il contient... www.commentcamarche.net/forum/affich-2211220-php-import-fichier-txt-dans-bdd-mysql
Base de donnée avec mysql par où commencer? Bonjour, Je suis débutant en base de donnée avec mysql.Je veux créer une base de donnée en local avec mysql mais je ne sais pas par où commencer. Horientez moi. Merci www.commentcamarche.net/forum/affich-2255055-base-de-donnee-avec-mysql-par-ou-commencer
Comment créer une base de données avec mysql Bonjour J'ai de difficulté pour créer un base de données avec mysql.Quelqu'un pourrait m'aider à résoudre ce problème? Merci www.commentcamarche.net/forum/affich-1722786-comment-creer-une-base-de-donnees-avec-mysql
Exporter à coup sûr du CSVExporter des données au format CSV n'est pas si trivial qu'il n'y paraît. Dès que vos données contiennent des virgules ou des guillemets, tout semble partir en vrille. Il y a une astuce. Voici comment procéder pour exporter à coup sûr vos... www.commentcamarche.net/faq/sujet-7273-exporter-a-coup-sur-du-csv
Passage MySQL->csv et csv->MySQLJe cherche un script clair ou à défaut une explication claire sur la manière de passer de MySQL à csv et inversément. Celà dit, mes tables sont nombreuses et je veux que toutes les données des tables soient sur un seul fichier csv et je veux seulement... www.commentcamarche.net/forum/affich-124898-passage-mysql-csv-et-csv-mysql
[PHP/MySQL] Encodage Caractères (Résolu)Bonjour, c'est encore moi :) J'ai enfin réussi (ou presque) à écrire un petit script pour poster des News. Le problème : J'ai tout rédigé les pages PHP en UTF-8 et lorsque je stocke les données dans MySQL, il ne semble pas bien configuré.... www.commentcamarche.net/forum/affich-2235775-php-mysql-encodage-caracteres
[Excel] Pb import fichier csvBonjour, J'ai un pb de format de colonne lors d'import de fichier csv sous Excel. Les cellules de chiffres sont automatiquement affichéss sous le format nombre. Ex : 359078004894815 en 3,59078E+14 J'aimerai que ces colonnes s'affichent en texte Je... www.commentcamarche.net/forum/affich-2325388-excel-pb-import-fichier-csv
PHP - Parser du XMLIntroduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de... www.commentcamarche.net/contents/php/phpxml.php3
Importer et exporter des données sous MySQLImportation et exportation Les Système de Gestion de Bases de Données tels que MySQL permettent de manipuler facilement et avec beaucoup de souplesse un très important volume de données. Toutefois, aussi robuste soit MySQL, il peut être intéressant... www.commentcamarche.net/contents/mysql/mysqlimport.php3
PHP - Récupération de donnéesPHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. Création d'un formulaire Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant : des champs de saisie des... www.commentcamarche.net/contents/php/phpform.php3