Insertion fichier Excel via php a mysql

Eléphanteau du PHP | 11 Messages

17 nov. 2015, 00:07

Bonjour,
Je voudrai insérer un fichier Excel.csv via php a ma base MySQL mais j'ai 2 soucis
1:-) L'insertion se passe correctement pour la première fois mais si je répète l'action il réinsére les données et crée des doublons alors que je veux qu'il vérifie si l'identifiant existe d'abord et si oui qu'il écrase ou fasse une mise à jour
2:-) comment faire pour gérer une ligne d'entête
Voici mon code
form name="import" method="post" enctype="multipart/form-data">
<input type="file" name="file" /><br />
<input type="submit" name="submit" value="Submit" />
</form>
<?php
include ("connection.php");

if(isset($_POST["submit"]))
{

$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$c = 0;
while(($filesop = fgetcsv($handle, 1024, ";")) !== false)
{

$req= mysql_query("select * FROM note where idelevenote='".$filesop[0]."' and matierenote='".$filesop[1]."' ");

if(mysql_num_rows($req)==0)
{
$idelevenote = $filesop[0];
$matierenote = $filesop[1];
$note1 = $filesop[2];
$note2 = $filesop[3];
$note3 = $filesop[4];
$compo1 =$filesop[5];
$trim1 = $filesop[6];
$note4 = $filesop[7];
$note5 = $filesop[8];
$note6 = $filesop[9];
$compo2 =$filesop[10];
$trim2 = $filesop[11];
$sql = mysql_query("INSERT INTO note (idelevenote, matierenote, note1, note2, note3, compo1, trim1, note4, note5, note6, compo2, trim2)
VALUES ('$idelevenote','$matierenote','$note1','$note2','$note3','$compo1','$trim1','$note4','$note5','$note6','$compo2','$trim2')");
$c = $c + 1;
}
else{

$idelevenote = $filesop[0];
$matierenote = $filesop[1];
$note1 = $filesop[2];
$note2 = $filesop[3];
$note3 = $filesop[4];
$compo1 =$filesop[5];
$trim1 = $filesop[6];
$note4 = $filesop[7];
$note5 = $filesop[8];
$note6 = $filesop[9];
$compo2 =$filesop[10];
$trim2 = $filesop[11];

$sql="UPDATE note SET note1='".
$note1."', note2='".$note2."', note3='".$note3."',compo1='".$compo1."', trim1='".$trim1."', note4='".
$note4."', note5='".$note5."', note6='".$note6."', compo2='".$compo2."', trim2='".$trim2."'

WHERE idelevenote='".$idelevenote."' AND matierenote='".$matierenote."' ";
}

if($sql){
echo "You database has imported successfully. You have inserted ". $c ." recoreds";
}else{
echo "Sorry! There is some problem.";
}
}
}

Mammouth du PHP | 2703 Messages

17 nov. 2015, 00:45

"select * FROM note where idelevenote='".$filesop[0]."' and matierenote='".$filesop[1]."' "
cela aboutit bien à ce qui est attendu ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 nov. 2015, 00:51

Bonjour,

Si tes index sont bien fait, tu peux utiliser la fonction MySQL REPLACE au lieu de INSERT
http://www.journaldunet.com/developpeur ... lace.shtml
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 11 Messages

17 nov. 2015, 09:32

J'ai essayer avec le REPLACE mais la aussi problème reste le même il duplique les entrées
include ("connection.php");

if(isset($_POST["submit"]))
{

$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$c = 0;
while(($filesop = fgetcsv($handle, 1024, ";")) !== false)
{
$idelevenote = $filesop[0];
$matierenote = $filesop[1];
$note1 = $filesop[2];
$note2 = $filesop[3];
$note3 = $filesop[4];
$compo1 =$filesop[5];
$trim1 = $filesop[6];
$note4 = $filesop[7];
$note5 = $filesop[8];
$note6 = $filesop[9];
$compo2 =$filesop[10];
$trim2 = $filesop[11];
$sql = mysql_query("REPLACE INTO note (idelevenote, matierenote, note1, note2, note3, compo1, trim1, note4, note5, note6, compo2, trim2)
VALUES ('$idelevenote','$matierenote','$note1','$note2','$note3','$compo1','$trim1','$note4','$note5','$note6','$compo2','$trim2')");
$c = $c + 1;
}
if($sql){
echo "You database has imported successfully. You have inserted ". $c ." recoreds";
}else{
echo "Sorry! There is some problem.";
}
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 nov. 2015, 09:42

J'ai essayer avec le REPLACE mais la aussi problème reste le même il duplique les entrées
C'est probablement qu'il te manque un index dans ta table.
la fonction REPLACE de MySQL [...] fonctionne exactement comme INSERT, mais fera l'équivalent d'un UPDATE dans le cas où la table dispose d'un index UNIQUE (un PRIMARY KEY sur id par exemple).
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 11 Messages

18 nov. 2015, 19:06

pour ici c'est les deux qui conditionne $idelevenote et $matierenote quil doit verifier

Eléphanteau du PHP | 11 Messages

22 nov. 2015, 03:21

Excuse pour le retard c’est juste que j’ai perdu ma tablette sur laquelle je me connectais. Oui il ya une colonne idnote(PRIMARY KEY) qui sert d’identifiant, mais l’utilisateur n’est pas censé le savoir comme je l’avais montre sur ma première requête pour le update, il faut une combinaison de $idelevenote et $matierenote pour l’identifier.
En fait je me suis pris autrement en recherchant l’idnote pour faire un update si ca existe déjà dans la base et de faire une insersion s’il y’en a pas. Le voici
<?php	
include('fonctions.inc.php');
if(isset($_POST["submit"]))
{

$file = $_FILES['file']['tmp_name'];
$handle = fopen($file, "r");
$c = 0;
while(($filesop = fgetcsv($handle, 1024, ";")) !== false)
{	
			{
		    
		$req= mysql_query("select * FROM note where idelevenote='".$filesop[0]."' and matierenote='".$filesop[1]."'  ");
		     
   			 if(mysql_num_rows($req)>0)
    		{  
			$id=mysql_fetch_array($req);
				$idnote=$id['idnote'];
				$idelevenote=$filesop[0];
				$matierenote=$filesop[1];
				$note1=$filesop[2];
				$note2=$filesop[3];
				$note3=$filesop[4];
				$compo1=$filesop[5];
				$trim1=$filesop[6];
				$note4=$filesop[7];
				$note5=$filesop[8];
				$note6=$filesop[9];
				$compo2=$filesop[10];
				$trim2=$filesop[11];

		$sql="UPDATE note SET note1='".
		$note1."', note2='".$note2."',  note3='".$note3."',compo1='".$compo1."', trim1='".$trim1."', note4='".
		$note4."', note5='".$note5."', note6='".$note6."', compo2='".$compo2."', trim2='".$trim2."'
		
		WHERE idelevenote='".$idelevenote."' AND matierenote='".$matierenote."'  ";
					
					if($result=mysql_query($sql))
				{
					echo "<script language='javascript'>";
						echo "alert('Note mise a jour');";
						echo "window.location.replace('../admin/note.php');" ; 
					echo "</script>";
				}
					else 
				{
					echo "<script language='javascript'>";
						echo "alert('Insersion echoue');";
						echo "window.location.replace('../admin/note.php');" ; 
					echo "</script>";
				}
				
			}
			
			else
			{
				$idelevenote=$filesop[0];
				$matierenote=$filesop[1];
				$note1=$filesop[2];
				$note2=$filesop[3];
				$note3=$filesop[4];
				$compo1=$filesop[5];
				$trim1=$filesop[6];
				$note4=$filesop[7];
				$note5=$filesop[8];
				$note6=$filesop[9];
				$compo2=$filesop[10];
				$trim2=$filesop[11];


		$sql="INSERT INTO note VALUES ('','$idelevenote','$matierenote','$note1','$note2', '$note3','$compo1','$trim1',
					'$note4','$note5','$note6','$compo2','$trim2')"; 
					
					
					if($result=mysql_query($sql))
				{
					echo "<script language='javascript'>";
						echo "alert('Note Inserer');";
						echo "window.location.replace('../admin/note.php');" ; 
					echo "</script>";
				}
					else 
				{
					echo "<script language='javascript'>";
						echo "alert('Echec Insersion');";
						echo "window.location.replace('../admin/note.php');" ; 
					echo "</script>";
				}
			}//Fin else
			}//fin ok
			}
			}
?>
Ca marche et je me demande comment le trouvez-vous


--
-- Structure de la table `note`
--

CREATE TABLE IF NOT EXISTS `note` (
`idnote` int(11) NOT NULL,
`idelevenote` int(11) NOT NULL,
`matierenote` varchar(25) NOT NULL,
`note1` varchar(5) NOT NULL,
`note2` varchar(5) NOT NULL,
`note3` varchar(5) NOT NULL,
`compo1` varchar(5) NOT NULL,
`trim1` varchar(6) NOT NULL,
`note4` varchar(5) NOT NULL,
`note5` varchar(5) NOT NULL,
`note6` varchar(5) NOT NULL,
`compo2` varchar(5) NOT NULL,
`trim2` varchar(6) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8;

--
-- Contenu de la table `note`
--

INSERT INTO `note` (`idnote`, `idelevenote`, `matierenote`, `note1`, `note2`, `note3`, `compo1`, `trim1`, `note4`, `note5`, `note6`, `compo2`, `trim2`) VALUES
(1, 1, 'Maths', '10', '11', '12', '11', '11', '12', '13', '13', '11', '12,25'),
(48, 2, 'Maths', '10', '12', '11', '10', '15,75', '13', '12', '12', '12', '12,25'),
(51, 3, 'Maths', '10', '12', '11', '13', '11,50', '12', '11', '', '11', '11,33'),
(52, 4, 'Maths', '10', '14', '', '', '12', '15', '11', '', '12', '12,67'),
(53, 4, 'Philo', '10', '11', '', '0', '7,5', '', '', '', '', '');

--
-- Index pour les tables exportées
--

--
-- Index pour la table `note`
--
ALTER TABLE `note`
ADD PRIMARY KEY (`idnote`),
ADD KEY `idelevenote` (`idelevenote`),
ADD KEY `matierenote` (`matierenote`);

--
-- AUTO_INCREMENT pour les tables exportées
--

--
-- AUTO_INCREMENT pour la table `note`
--
ALTER TABLE `note`
MODIFY `idnote` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=54;
Si c'est bon comment je peux ignorer la 1ière ligne pour avoir des titres