Problème import fichier csv dans mysql

Résolu/Fermé
Goo - 16 sept. 2022 à 12:13
 Goo - 17 sept. 2022 à 21:19

Bonjour,

Je cherche à importer mon csv en bdd avec le code suivant, mais j'ai un message d'erreur "Invalid File:Please Upload CSV File.", indiquant que ma requête est vide.
Le fichier importé est un csv avec séparation par ;

Le script se fait sur index.php et functions.php.

Index.php 

<?php
function getdb(){
$servername = "localhost";
$username = "...";
$password = "...";
$db = "...";
try {
$conn = mysqli_connect($servername, $username, $password, $db);
//echo "Connected successfully";
}
catch(exception $e)
{
echo "Connection failed: " . $e->getMessage();
}
return $conn;
}
?>
<!DOCTYPE html>
<html lang="en">
<body>
<div id="wrap">
<div class="container">
<div class="row">
<form class="form-horizontal" action="functions.php" method="post" name="upload_excel" enctype="multipart/form-data">
<fieldset>
<!-- Form Name -->
<legend>Form Name</legend>
<!-- File Button -->
<div class="form-group">
<label class="col-md-4 control-label" for="filebutton">Select File</label>
<div class="col-md-4">
<input type="file" name="file" id="file" class="input-large">
</div>
</div>
<!-- Button -->
<div class="form-group">
<label class="col-md-4 control-label" for="singlebutton">Import data</label>
<div class="col-md-4">
<button type="submit" id="submit" name="Import" class="btn btn-primary button-loading" data-loading-text="Loading...">Import</button>
</div>
</div>
</fieldset>
</form>
</div>
<?php
get_all_records();
?>
</div>
</div>
</body>
</html>
<?php
 if(isset($_POST["Import"])){
    
    $filename=$_FILES["file"]["tmp_name"];    
     if($_FILES["file"]["size"] > 0)
     {
        $file = fopen($filename, "r");
          while (($getData = fgetcsv($file, 10000, ";")) !== FALSE)
           {
             $sql = "INSERT into employeeinfo (emp_id,firstname,lastname,email,reg_date) 
                   values ('".$getData[0]."','".$getData[1]."','".$getData[2]."','".$getData[3]."','".$getData[4]."')";
                   $result = mysqli_query($con, $sql);
        if(!isset($result))
        {
          echo "<script type=\"text/javascript\">
              alert(\"Invalid File:Please Upload CSV File.\");
              window.location = \"a-sellsy.php\"
              </script>";    
        }
        else {
            echo "<script type=\"text/javascript\">
            alert(\"CSV File has been successfully Imported.\");
            window.location = \"a-sellsy.php\"
          </script>";
        }
           }
      
           fclose($file);  
     }
  }   

Est-ce que vous voyez quelque chose qui cloche dans le code ?

Merci !!

Goo


Windows / Opera 90.0.4480.84

A voir également:

4 réponses

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
16 sept. 2022 à 16:00

Bonjour,

Dans ton alert, ajoute l'erreur mysqli pour savoir ce qui ne lui plait pas

   
if( ! mysqli_query($con, $sql)) {
    echo "<script type='text/javascript'>
      alert('Invalid File:Please Upload CSV File. Erreur : " . mysqli_error($con) ."' );
      window.location = \"a-sellsy.php\"
   </script>";    
}

1

Merci Jordane pour ce bout de code bien pratique que j'ai intégré au script.

Le soucis venait de ma variable $con / $conn, mal orthographiée entre les deux fichiers, et non récupérée dans functions.php.

Depuis, j’ai ajouté deux bouts de scripts en plus :
•    Pour vider la table avant importation
•    Pour ignorer la ligne d’en-têtes

Voici à quoi ressemble le code maintenant :
 

<?php
require('index.php');
$con = getdb();
?>

<?php
 if(isset($_POST["Import"])){
    
	 $filename=$_FILES["file"]["tmp_name"];    

	 $delete_table = "TRUNCATE TABLE employeeinfo";
	 mysqli_query($con, $delete_table); // on vide la table avant import

	 if($_FILES["file"]["size"] > 0)
     {
        $file = fopen($filename, "r");
		  fgetcsv($file, 10000, ";"); // on saute la ligne des en-têtes
          while (($getData = fgetcsv($file, 10000, ";")) !== FALSE)
           {
             $sql = "INSERT INTO employeeinfo (emp_id,firstname,lastname,email,reg_date) VALUES ('".$getData[0]."','".$getData[1]."','".$getData[2]."','".$getData[3]."','".$getData[4]."')";
             $result = mysqli_query($con, $sql);
				if(!mysqli_query($con, $sql)) // on rapporte les erreurs MySQL
				{
					echo "<script type='text/javascript'>
					  alert(\"Erreur MySQL : " . mysqli_error($con) ."\");
					  window.location = \"index.php\"
				   	</script>";    
				}
			    if(!isset($result)) // on rapporte les erreurs de chargement du CSV
				{
					echo "<script type=\"text/javascript\">
					  alert(\"Fichier invalide : charger un fichier CSV\");
					  window.location = \"index.php\"
					</script>";    
				}
				else {
					echo "<script type=\"text/javascript\">
					  alert(\"Importation REUSSIE !\");
					  window.location = \"index.php\"
				    </script>";
					echo "";
				}
           }
           fclose($file);  
	 }
  }   
?>

<?php
function get_all_records(){ // fonction pour afficher les données importées dans la table
    $con = getdb();
    $Sql = "SELECT * FROM employeeinfo";
    $result = mysqli_query($con, $Sql);  
    if (mysqli_num_rows($result) > 0) {
     echo "<div class='table-responsive'><table id='myTable' class='table table-striped table-bordered'>
             <thead><tr><th>Emp ID</th>
                          <th>Nom</th>
                          <th>Prénom</th>
                          <th>Email</th>
                          <th>Date enregistrement</th>
                        </tr></thead><tbody>";
     while($row = mysqli_fetch_assoc($result)) {
         echo "<tr><td>" . $row['emp_id']."</td>
                   <td>" . $row['firstname']."</td>
                   <td>" . $row['lastname']."</td>
                   <td>" . $row['email']."</td>
                   <td>" . $row['reg_date']."</td></tr>";        
     }
     echo "</tbody></table></div>";
	} else {
     echo "Aucune données présentes dans le fichier.";
	}
}
?>

Mais j'ai encore un problème de taille : pourquoi faut-il appliquer lancer 2 fois le formulaire d'import pour que les données s'affichent ? Je m'explique :

1 - je sélectionne le fichier et clique sur "Importer"

Javascript m'indique que les données ont bien été importées (et je confirme que les données sont bien en BDD), mais affiche "Aucune données présentes dans le fichier". A ce stade, la page est positionnée sur "functions.php"

2 - Je clique sur "OK" de la fenêtre d'alerte et suis redirigé sur index.php, mais aucune

données ne s'affiche, "get_all_records()" n'est pas appelée :

3 - si je clique à nouveau sur "Importer", alors les données s'affichent 

4 - En cliquant encore une fois, alors la table est vidée; là, c'est normal.

Comment faire pour ne lancer qu'une seule fois le formulaire, cliquer sur la fenêtre javascript et que les données s'affichent en index.php ?

Merci pour votre aide !!

0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
17 sept. 2022 à 14:07

oh la la ....  il y aurait tellement de choses à redire sur ton code... je ne sais pas trop par où commencer..

Déjà...

 $delete_table = "TRUNCATE TABLE employeeinfo";
	 mysqli_query($con, $delete_table); // on vide la table avant import

devrait être sous la même forme que le code que je t'ai donné pour intercepter les éventuelles erreurs

  $result = mysqli_query($con, $sql);
				if(!mysqli_query($con, $sql)) // on rapporte les erreurs MySQL

la première ligne ( celle avec le $result) est inutile... puisque la requête est déjà exécutée dans le if

 if(!isset($result)) // on rapporte les erreurs de chargement du CSV
				{
					echo "<script type=\"text/javascript\">
					  alert(\"Fichier invalide : charger un fichier CSV\");
					  window.location = \"index.php\"
					</script>";    
				}

Inutile puisque c'est déjà géré dans mon if ( voir le code que je t'ai donné )

En plus.. sais tu à quoi sert la fonction isset ?  car là .. tu ne passeras jamais dans ce if .. vu que la variable $result existe... elle est donc déjà "set" ...    Mais bon, puisque tu vas supprimer la ligne avec la requête et le $result = ..   ce if devient donc inutile.

Et enfin ( pour l'instant..)

Tu as inversé le require.

Il faut, dans ton fichier index.php  require le fichier qui fait le traitement ... et non pas l'inverse ...

D'ailleurs, remplace l'instruction require    par  require_once   ça évitera d'autres soucis.

1

Merci pour ta patience Jordane !

J'ai repris tous tes conseils et espère les avoirs bien retranscrits.

Ok pour ta remarque sur $result. Je pensais que ton code pointait uniquement sur $con, et qu'avec le !isset($result) on vérifiait les deux variables, d'où la nécessité d'écrire la première ligne $result =. Mais c'est bon, c'est compris et c'est viré.

Voici le code rectifié avec, en plus, l'export des données qui se passe pas si mal, sauf qu'il reprend le code de la page index.php et  que je n'arrive pas à le corriger :

Index.php

<?php
function getdb(){
	$servername = "localhost";
	$username = "..";
	$password = "..";
	$db = "..";
	try {
		$con = mysqli_connect($servername, $username, $password, $db);
		 //echo "Connected successfully"; 
		}

	catch(exception $e)
		{
		echo "Connection failed: " . $e->getMessage();
		}
		return $con;
}

require_once('functions.php');
?>
<!DOCTYPE html>
<html lang="fr">
<head>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" crossorigin="anonymous">
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
</head>
<body>
    <div id="wrap">
        <div class="container">
            <div class="row">
                <form class="form-horizontal" action="index.php" method="post" name="upload_excel" enctype="multipart/form-data">
                    <fieldset>
                        <!-- Form Name -->
                        <legend>Ventes S.</legend>
                        <!-- File Button -->
                        <div class="form-group">
                            <label class="col-md-4 control-label" for="filebutton">Sélectionner le fichier</label>
                            <div class="col-md-4">
                                <input type="file" name="file" id="file" class="input-large">
                            </div>
                        </div>
                        <!-- Button -->
                        <div class="form-group">
                            <label class="col-md-4 control-label" for="singlebutton">Importer les données</label>
                            <div class="col-md-4">
                                <button type="submit" id="submit" name="Import" class="btn btn-primary button-loading" data-loading-text="Chargement...">Importer</button>
                            </div>
                        </div>
                    </fieldset>
                </form>
            </div>
            <?php
               get_all_records();
            ?>
        </div>
    </div>
	 <div>
		<form class="form-horizontal" action="index.php" method="post" name="upload_excel" enctype="multipart/form-data">
		  <div class="form-group">
			<div class="col-md-4 col-md-offset-4">
				<input type="submit" name="Export" class="btn btn-success" value="Générer les écritures"/>
			</div>
		   </div>                    
		</form>           
	 </div>
</body>
</html>

Functions.php

<?php
$con = getdb();

 if(isset($_POST["Import"])){
    
	 $filename=$_FILES["file"]["tmp_name"];    

	 $delete_table = "TRUNCATE TABLE employeeinfo"; // on vide la table avant import
	 if(!mysqli_query($con, $delete_table))
	 {
		echo "<script type='text/javascript'>
		  alert(\"Erreur sur TRUNCATE MySQL : " . mysqli_error($con) ."\");
		  window.location = \"index.php\"
		</script>";    
	 }
	 
	 if($_FILES["file"]["size"] > 0)
     {
        $file = fopen($filename, "r");
		  fgetcsv($file, 10000, ";"); // on saute la ligne des en-têtes
          while (($getData = fgetcsv($file, 10000, ";")) !== FALSE)
           {
			  $date_convert = implode('-', array_reverse(explode('/', $getData[4])));

			  $sql = "INSERT INTO employeeinfo (emp_id,firstname,lastname,email,date) VALUES ('".$getData[0]."','".$getData[1]."','".$getData[2]."','".$getData[3]."','".$date_convert."')";
				if(!mysqli_query($con, $sql)) // on rapporte les erreurs MySQL
				{
					echo "<script type='text/javascript'>
					  alert(\"Erreur INSERT MySQL : " . mysqli_error($con) ."\");
					  window.location = \"index.php\"
				   	</script>";    
				}
				else {
					echo "<script type=\"text/javascript\">
					  alert(\"Importation REUSSIE !\");
					  window.location = \"index.php\"
				    </script>";
				}
           }
           fclose($file);  
	 }
  }   
?>

<?php
function get_all_records(){ // fonction pour afficher les données importées dans la table
    $con = getdb();
    $sql = "SELECT * FROM employeeinfo";
    $result = mysqli_query($con, $sql);  
    if (mysqli_num_rows($result) > 0) {
     echo "<div class='table-responsive'><table id='myTable' class='table table-striped table-bordered'>
             <thead><tr><th>Emp ID</th>
                          <th>Nom</th>
                          <th>Prénom</th>
                          <th>Email</th>
                          <th>Date enregistrement</th>
                        </tr></thead><tbody>";
     while($row = mysqli_fetch_assoc($result)) {
         echo "<tr><td>" . $row['emp_id']."</td>
                   <td>" . $row['firstname']."</td>
                   <td>" . $row['lastname']."</td>
                   <td>" . $row['email']."</td>
                   <td>" . $row['date']."</td></tr>";        
     }
     echo "</tbody></table></div>";
	} else {
     echo "Aucune donnée importée.";
	}
}
?>

<?php
if(isset($_POST["Export"])){
	 
	$sql_date = "SELECT date FROM employeeinfo";
	$result_date = mysqli_query($con, $sql_date);
	$row = mysqli_fetch_assoc($result_date);
	
	$filedate = $row['date'];
	$filemonth = explode('-', $filedate);
	$year = $filemonth[0];
	$month = $filemonth[1];
	$day = $filemonth[2];
	date_default_timezone_set('Europe/Paris');
	$datetime = new DateTime('');
	$day_export = date("d_m_Y");
	$hour_export = date("H");
	$minute_export = date("i");

	$filename="journal_VEP-" . $month . "_" . $year . " - généré le " . $day_export . " à " . $hour_export . "h" . $minute_export . ".csv";

	header('Content-Type: text/csv; charset=utf-8');  
	header('Content-Disposition: attachment; filename="' . $filename . '"');  
	header('Expires: 0');
	header("Pragma: no-cache");
	$output = fopen("php://output", "w");  
	fputcsv($output, array('ID', 'Nom', 'Prenom', 'Email', 'Date adhesion'));  
	$query = "SELECT * from employeeinfo ORDER BY emp_id DESC";  
	$result = mysqli_query($con, $query);  
	while($row = mysqli_fetch_assoc($result))  
	{  
	   fputcsv($output, $row);  
	}  
	fclose($output);  
 }  
?>
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
17 sept. 2022 à 19:31

Bonjour,

Ta question initiale concernant un souci d'insertion des données en BDD et le problème ayant été résolu .. il aurait normalement fallu que tu mettes cette discussion en résolue .. et que tu en ouvres une nouvelle pour ton "nouveau souci".

Mais bon, ça sera pour la prochaine fois.

Donc, pour ton souci d'export ....

Il faut que tu places le code qui te sert  à exporter dans un fichier php à part.

Et, dans l'attribut action du formulaire, que tu pointes vers ce fichier ( ne surtout pas l'include/require.. dans l'index ou tout autre fichier html ). Ce fichier ne dois contenir que le code lié à l'export ...

1

Bien reçu pour les sujets de discussions.

Et un grand merci pour tes précieux conseils ! Ca tourne nickel chrome maintenant !

Mes respects au forum ^^

0