PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 09-12-2011 23:21:55

angelina88
Membre
Inscription : 09-12-2011
Messages : 2

problème importation fichier CSV vers mysql

Bonjour,
J'ai un problème d'insertion de mon fichier d'extension .CSV dans plusieurs tables de la base de données ... J'ai essayé de résoudre ça mais en vain hmm

Voilà les tables de ma base de données:

 
--
 
-- --------------------------------------------------------
 
--
-- Structure de la table `demande`
 
CREATE TABLE IF NOT EXISTS `demande` (
`id_demande` int(11) NOT NULL auto_increment,
`Borderaux_client` varchar(200) character set ascii default NULL,
`Statut_Demande` varchar(50) character set ascii default NULL,
`Ref_dossier` varchar(200) character set ascii default NULL,
`Date_facture` varchar(50) character set ascii default NULL,
PRIMARY KEY (`id_demande`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
 
 
 
-- --------------------------------------------------------
 
--
-- Structure de la table `demande_produit`
--
 
CREATE TABLE IF NOT EXISTS `demande_produit` (
`id_demande` int(11) NOT NULL auto_increment,
`Num_serie` varchar(50) character set ascii NOT NULL,
`RMA` varchar(200) character set ascii default NULL,
`Date_entee` varchar(50) character set ascii default NULL,
`Date_retour` varchar(50) character set ascii default NULL,
`Date_livraison` varchar(50) character set ascii default NULL,
`Delai_general` varchar(50) character set ascii default NULL,
PRIMARY KEY (`id_demande`,`Num_serie`),
KEY `FK_demande_produit_Num_serie` (`Num_serie`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
 
 
 
-- --------------------------------------------------------
 
--
-- Structure de la table `demande_projet`
--
 
CREATE TABLE IF NOT EXISTS `demande_projet` (
`id_projet` int(11) NOT NULL,
`id_demande` int(11) NOT NULL,
`Date_demande_projet` varchar(20) character set ascii default NULL,
PRIMARY KEY (`id_projet`,`id_demande`),
KEY `FK_Demande_projet_id_demande` (`id_demande`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
-- --------------------------------------------------------
 
--
-- Structure de la table `produit`
--
 
CREATE TABLE IF NOT EXISTS `produit` (
`Num_serie` varchar(50) character set ascii NOT NULL,
`Code_article` varchar(50) character set ascii default NULL,
`Techno` varchar(200) character set ascii default NULL,
`Designation` varchar(200) character set ascii default NULL,
`Situation` varchar(40) character set ascii default NULL,
`Remarques` varchar(50) character set ascii default NULL,
`id_projet` int(11) NOT NULL,
PRIMARY KEY (`Num_serie`),
KEY `FK_Produit_id_projet` (`id_projet`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
 
-- --------------------------------------------------------
 
--
-- Structure de la table `projet`
--
 
CREATE TABLE IF NOT EXISTS `projet` (
`id_projet` int(11) NOT NULL auto_increment,
`Client` varchar(40) character set ascii default NULL,
`Nom_projet` varchar(200) character set ascii default NULL,
`Chef_de_Projet` varchar(200) character set ascii default NULL,
`Statut` varchar(40) character set ascii default NULL,
`OTP` varchar(40) character set ascii default NULL,
PRIMARY KEY (`id_projet`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
 
 
-- --------------------------------------------------------
 
--
-- Structure de la table `transitaire`
--
 
CREATE TABLE IF NOT EXISTS `transitaire` (
`nom_transitaire` varchar(50) character set ascii NOT NULL,
`contact_info` varchar(20) character set ascii default NULL,
PRIMARY KEY (`nom_transitaire`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- --------------------------------------------------------
 
--
-- Structure de la table `transit_produit`
--
 
CREATE TABLE IF NOT EXISTS `transit_produit` (
`nom_transitaire` varchar(50) character set ascii NOT NULL,
`Num_serie` varchar(50) character set ascii NOT NULL,
`Date_transitaire` varchar(50) character set ascii default NULL,
`Date_arrivee_France` varchar(50) character set ascii default NULL,
`Delai_export` varchar(50) character set ascii default NULL,
`Date_depart_France` varchar(50) character set ascii default NULL,
`Delai_import` varchar(50) character set ascii default NULL,
PRIMARY KEY (`nom_transitaire`,`Num_serie`),
KEY `FK_Transit_produit_Num_serie` (`Num_serie`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--------------------------------------------------------------------

****Pour mon fichier CSV il a les colonnes suivantes:
techno,num_serie,code_article,date_entree,date_facture,date_transitaire,date_arrivee_france,date_depart_france,delai_export,
date_retour,date_livraison,delai_import,delai_general,remarques

*** Voilà plus claire concernant mon fichier CSV je vais écrire table.colonne pour savoir pour chaque colonne de la table la colonne du csv correspondante:

produit.techno,produit.num_serie,produit.code_article,demande_produit.date_entree,
demande.date_facture,transit_produit.date_transitaire,transit_produit.date_arrivee_france,
transit_produit.date_depart_france,transit_produit.delai_export,demande_produit.date_retour,demande_produit.date_livraison,
transit_produit.delai_import,demande_produit.delai_general,produit.remarques

J'attends impatiemment vos suggestions car je suis bloquée hmm
Merci pour votre compréhension smile

Hors ligne

#2 10-12-2011 06:44:17

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : problème importation fichier CSV vers mysql

Saluton,
J'avoue que tout cela n'est pas très clair d'autant que je vois certaines tables dont les clefs primaires sont en VARCHAR (produit et transitaire) ce qui ne va pas augmenter les performances.
Par ailleurs, certaines colonnes préfixées en FK semblent vouloir être des FOREIGN KEYS, alors puisque les tables sont en InnoDB, autant vraiment déclarer ces contraintes et leurs REFERENCES, ça serait plus clair pour nous et nous permettrait une rétro-conception du MPD.
Concrètement, il va falloir lire le fichier "csv" ligne par ligne en PHP, pour éclater dans autant de tableaux (arrays) que de tables impactées par chaque ligne et construire ensuite à partir de ces tableaux les requêtes d'INSERT multiples en respectant l'ordre des REFERENCES des clés étrangères.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 10-12-2011 08:36:14

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : problème importation fichier CSV vers mysql

Bonjour,

Cela rejoint bien la tendance générale de l'improvisation à l'aveugle déguisée en pratique professionnelle à laquelle on est confronté tous les jours.
1) Des BD en innoDB encore moins structurées qu'en MyISAM et dire "et hop on fait du transactionnel", "la normalisation c'est bof".
2) Des colonnes prix article en DECIMAL(100,1) et dire "tout est normal, c'est opti"... etc

Quand on ne sait pas on demande et la démarche de faire nimp et de demander ce qui ne va pas, ca use, ca use. Mais bon il y a au moins l'effort de demander, ce qui n'est déjà pas si mal.
++

Dernière modification par Jc (10-12-2011 08:39:16)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#4 10-12-2011 12:16:17

angelina88
Membre
Inscription : 09-12-2011
Messages : 2

Re : problème importation fichier CSV vers mysql

J'ai essayé de faire ce code comme test pour les 3 colonnes de csv mais ça marche pas :


<?php  
//connection au serveur  
$cnx = mysql_connect( "localhost", "root", "" ) or die("Impossible de se connecter à la base de données" );  
//sélection de la base de données:  
$db = mysql_select_db( "alu" ) or die("Impossible de se connecter à la base de données" );  

//récupération des valeurs des champs:
$borderaux_client = $_POST["borderaux_client"] ;  
$nom_transitaire = $_POST["nom_transitaire"] ;  

//trouver le nom de projet correspondant à la demande  
$reponse= mysql_query("SELECT projet.nom_projet FROM demande_projet,demande,projet WHERE demande_projet.id_demande=demande.id_demande AND projet.id_projet=demande_projet.id_projet AND demande.borderaux_client='$borderaux_client'" )or die(mysql_error());  

$donnees=mysql_fetch_array($reponse);  
$nom_projet=$donnees['nom_projet'];  
?>  
<br><br>  
<p><strong>Nom projet</strong> :<?php echo $donnees['nom_projet'];?></p>  
<input type="hidden" name="nom_projet" value=<?php echo $donnees['nom_projet'];?>>  
<br/>  
<?php  

$req2 = "SELECT statut_demande FROM demande WHERE borderaux_client='".$borderaux_client."'";  
$result3 = mysql_query($req2) or die('Erreur SQL !'.$req.'<br>'.mysql_error());  
if ($result_statut = mysql_fetch_array($result3))  

$statut_demande = $result_statut['statut_demande'];  
if($statut_demande=="En cours" )  
{  
//on importe le fichier à inserer dans sql  
$file=$_FILES["userfile"]["tmp_name"];  

if (file_exists($file))  
{  
$open=fopen($file,"r" );  
}  

else  
{  
echo "Fichier introuvable !<br>Importation stoppée.";  
exit();  
}  
while (($fileop=fgetcsv($open,1000,";" )) !==false)  
{  
$num_serie=$fileop[2];  
$code_article=$fileop[3];  
$designation=$fileop[1];  

$reponse1 = mysql_query("SELECT * FROM produit where num_serie='$num_serie' " )or die( mysql_error() );  
$i=0;  
while($donnees=mysql_fetch_array($reponse1))  
{  
$i=1;  
}  
if($i==0)  
{  

$req = "SELECT id_projet FROM projet WHERE nom_projet='" . $nom_projet . "'";  
$result = mysql_query($req) or die('Erreur SQL !'.$req.'<br>'.mysql_error());  

if ($result_projet = mysql_fetch_array($result))  
$id_projet = $result_projet['id_projet']; // récupère id_projet dans le tableau résultat  

$query = "INSERT INTO produit(num_serie,code_article,designation,id_projet)VALUES('$num_serie','$code_article','$designation','$id_projet')";  
$requete1 = mysql_query($query, $cnx) or die( mysql_error() ) ;  

$req1 = "SELECT id_demande FROM demande WHERE borderaux_client='" . $borderaux_client. "'";  
$result1 = mysql_query($req1) or die('Erreur SQL !'.$req.'<br>'.mysql_error());  
if ($result_demande = mysql_fetch_array($result1))  
$id_demande = $result_demande['id_demande']; // récèpure id_demande dans le tableau résultat  

$sql2 = "INSERT INTO demande_produit (id_demande,num_serie)  
VALUES ('$id_demande','$num_serie')"
;  
$requete2 = mysql_query($sql2, $cnx) or die( mysql_error() ) ;  

$sql3 = "INSERT INTO transit_produit (nom_transitaire,num_serie)  
VALUES ('$nom_transitaire','$num_serie')"
;  
$requete3 = mysql_query($sql3, $cnx) or die( mysql_error() ) ;  

//affichage des résultats, pour savoir si l'insertion a marché:  
if($requete1 && $requete2 && $requete3)  
{  
echo("L'insertion a été correctement effectuée" ) ;  
}  
else  
{  
echo("L'insertion a échouée" ) ;  
}  
}  
else{  
echo"<SCRIPT language=\"Javascript\">  
alert(\"Ce produit existe!\" );  
window.location.replace(\"ajout_produit.php\" );  
</SCRIPT>"
;  
exit();  
}  
}  
fclose($open);  
print '<h2>Importation terminée</h2>';  
}  
else{  
echo"<SCRIPT language=\"Javascript\">  
alert(\"Cette demande est déjà close !\" );  
window.location.replace(\"AjoutPr.php\" );  
</SCRIPT>"
;  
}  
?>

et Quand j'execute voilà l'erreur que j'ai:
"Incorrect string value: '\xB0 de S...' for column 'Num_serie' at row 1"
Ils m'ont dit de travailler avec une boucle de deux dimensions pour lire le fichier et l'inserer dans ma base de données mais je sais pas comment!!

et la deuxieme chose c'est que je sais pas comment inserer dans plusieurs table avec ce que mon fichier csv contient de colonnes.


merci d'avance

Hors ligne

#5 10-12-2011 22:30:32

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : problème importation fichier CSV vers mysql

Bonsoir,

Ne m'en voulez pas mais je passe mon tour.
Bonnes fêtes à vous.

Cordialement,

Jc

PS: Je vais être franc avec vous. J'estime que ce que vous demandez relève de la prestation commerciale, et qu'il y a des choses pour lesquelles dans la vie où il faut payer pour savoir ou pour que le travail soit fait, sauf si on a la chance de pouvoir le faire soi-même faut-il encore avoir le temps. Je ne vais donc pas faire de concurrence déloyale auprès de mes collègues ni m'étendre plus longtemps. Peut être qu'une âme charitable voudra bien vous aider, c'est tout le mal que je vous souhaite.

Dernière modification par Jc (10-12-2011 22:40:17)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#6 12-12-2011 12:59:31

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : problème importation fichier CSV vers mysql

angelina88 a écrit :

Ils m'ont dit de travailler avec une boucle de deux dimensions pour lire le fichier et l'inserer dans ma base de données mais je sais pas comment!!

Qui sont donc ces ILS  ???

angelina88 a écrit :

et la deuxieme chose c'est que je sais pas comment inserer dans plusieurs table avec ce que mon fichier csv contient de colonnes.

J'essayerai de trouver un peu de temps, ce soir, pour te dégrossir la solution.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#7 13-12-2011 09:28:30

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : problème importation fichier CSV vers mysql

Bon, je n'ai pas eu le temps de me pencher sur ton truc hier soir alors je m'y colle, fissa, ce matin.

Je viens de me représenter, vite fait sur un bout de papier, un Modèle Physique de tes Données en m'appuyant sur tes CREATE TABLE.

Outre les remarques déjà faites concernant les clés primaires des tables mères qui devraient être des INT en AUTO_INCREMENT notamment `Num_serie` varchar(50)  et `nom_transitaire` varchar(50), j'observe que la table projet devrait embarqué un lien vers la table client plutôt que `Client` varchar(40), même chose en ce qui concerne le `Chef_de_Projet` varchar(200). Car je doute qu'un client ne puisse avoir qu'un projet et la même chose pour le Chef_de_Projet.

Que dire de la colonne `nom_transitaire` de la table `transit_produit` où elle est censée représentée la clé étrangère de la table `transitaire` mais où elle n'est même pas déclarée en index.

Dans la table `demande_produit`, `id_demande`ne doit pas être en AUTO_INCREMENT puisqu'il s'agit de la clé étrangère provenant de la table `demande`.

Enfin, conceptuellement, je n'arrive pas à comprendre la présence de la colonne `id_projet` dans la table `produit`.

Ça commence à faire beaucoup de questions sans réponse, mais surtout, ça sent le truc improvisé voire bâclé.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

Pied de page des forums