8796 sujets

Développement web côté serveur, CMS

bonjours
j'aimerais le contenu d'un fichier excel ds une table que j'appellerais test
le fichier contient une colonne <frais> qui contient les libelles et plusieurs colonne qui contient des identifiants,
un libelle peut avoir plusieurs identifiant (voir image jointe)
du coté base de donnée j'aurais une table de 2 colonne (frais,identifiant)
le probleme c'est que j'aimerais que si un libelle a plusieur identifiant alors pour chaque libelle en enregistre autant d'identifiant
exemple: frais identifiant
salaire 11111
salaire 232222
salaire 54445



avez vous une idée de comment faire???



upload/17236-excel.jpg
Modifié par timo (02 Mar 2010 - 14:49)
Salut,

timo a écrit :
j'aimerais que si un libelle a plusieur identifiant alors pour chaque libelle en enregistre autant d'identifiant
exemple: frais identifiant
salaire 11111
salaire 232222
salaire 54445
Ce qui ne respecte pas les règles de normalisation. Smiley murf

En toute logique il te faudrait 2 tables :
frais
* id_frais
* libelle_frais

frais_ids
* id_identifiant
* id_frais
* valeur_identifiant

Ce qui pourrait donner :

-- 
-- Structure de la table `frais`
-- 

CREATE TABLE `frais` (
  `id_frais` int(10) unsigned NOT NULL auto_increment,
  `libelle_frais` text NOT NULL,
  PRIMARY KEY  (`id_frais`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

-- 
-- Structure de la table `frais_ids`
-- 

CREATE TABLE `frais_ids` (
  `id_identifiant` int(10) unsigned NOT NULL auto_increment,
  `id_frais` int(10) unsigned NOT NULL,
  `valeur_identifiant` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id_identifiant`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

require_once('connexion.inc.php');	// Connexion à la base

// Lecture du fichier dans un tableau
$fichier = "test.csv";
$array_contenu = file($fichier);

for($i = 1; $i < count($array_contenu); $i++) {	// on commence à 1 pour ne pas prendre l'entête (frais)
	$ligne = explode(';', $array_contenu[$i]);
	$frais = ucwords(trim($ligne[0])); // libellé du frais
	// Récupération id_frais si ce frais existe déjà
	$sql = sprintf("Select id_frais From frais Where libelle_frais = '%s'",
		mysql_real_escape_string($frais));
	$result = mysql_query($sql);
	if(mysql_num_rows($result) > 0) {	// Ce frais existe déjà
		echo '<p>Le frais <strong>'.$frais.'</strong> existe déjà.</p>';
		$id_frais = mysql_result($result, 0);
	} else {	// sinon on le crée
		$sql = sprintf("Insert into frais set libelle_frais = '%s'",
			mysql_real_escape_string($frais));
		mysql_query($sql);
		$id_frais = mysql_insert_id();	// Résupération du dernier id_frais créé
		echo '<p>Le frais <strong>'.$frais.'</strong> a été créé.</p>';
	}
	
	// Ecriture des identifiants
	for($j = 1; $j < count($ligne); $j++) {	// on commence à 1 pour ne pas prendre le libellé du frais
		$identifiant = intval($ligne[$j]);
		if($identifiant > 0) {
			// On vérifie que cet identifiant n'existe pas déjà
			$sql = sprintf("Select libelle_frais From frais_ids Natural Join frais Where valeur_identifiant  = '%s'",
				mysql_real_escape_string($identifiant));
			$result = mysql_query($sql);
			if(mysql_num_rows($result) > 0) {	// Cet identifiant existe déjà
				echo '<p>-> L\'identifiant <strong>'.$identifiant.'</strong> existe déjà pour le frais <strong>'.mysql_result($result, 0).'</strong>.</p>';
			} else {	// Sinon on le crée
				$sql = sprintf("Insert into frais_ids set id_frais = $id_frais, valeur_identifiant = '%s'",
					mysql_real_escape_string($identifiant));
				mysql_query($sql);
				echo '<p>-> L\'identifiant <strong>'.$identifiant.'</strong> a été créé pour le frais <strong>'.$frais.'</strong>.</p>';
			}
		}
	}
	echo '<hr />';
}
echo '<p>Traitement terminé !</p>';

Modifié par Heyoan (02 Mar 2010 - 03:36)
merci pour cette solution qui m'a beaucoup aider dans mon travail en cours
encore merci Smiley smile ))