IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Erreur dans insert into issu d'un fichier csv


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 77
    Points
    77
    Par défaut Erreur dans insert into issu d'un fichier csv
    Bonjour,
    J'esaye d'adapter un code trouvé sur le net:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    <?php 
    ////include ("inc/prive.inc.php");
    include ("inc/fonctions.inc.php");
    ////include ("config/constantes.inc.php");
    Normalisation();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
      <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
      <title><?php echo ECOLE ?></title>
      <link media="screen" rel="stylesheet" href="config/screen.css" type="text/css">
      <link media="print" rel="stylesheet" href="config/print.css" type="text/css">
      <link rel="stylesheet" href="config/menu.css" type="text/css" media="screen">
        <script language="javascript" type="text/javascript" src="inc/fonctions.js">
      </script>
    </head>
    <body>
    <?php
    // autorisations pour la page
    ////autoriser ("admin");
    // menu
    require ("inc/menu.inc.php");
    ?>
    <div id="texte">
    <h2>Importation d'un fichier CSV</h2>
    <?php
    $mode = isset($_POST['mode']) ? $_POST['mode'] : Null;
     
    switch ($mode)
     {
     case 'Confirmer': 
    	// ouvrir la BD
    	include ("variables.inc.php");
    	$lienDB = mysql_connect($bddserver, $bddlogin, $bddpassword);
    	mysql_select_db ($bdd);
     
    	$handle = fopen("./eleves.csv", "r");
    	$ligne = 1;
    	while (($data = fgetcsv($handle, 5000, ",","\"")) !== FALSE) 
    		{
    		$num = count($data);
    		if ($ligne == 1)
    			{
    			// sur la première ligne, on trouve les intitulés des colonnes
    			$debutsql = "INSERT INTO elevescomplete22 (";
    			for ($i=0; $i < $num; $i++) 
    				{
    				$debutsql .= "$data[$i]";
    				if ($i < $num-1) $debutsql .= ",";
    				}
    			$debutsql .= ") VALUES (";
    			}
    			else
    			{
    			// sur les lignes suivantes, on trouve les infos à introduire dans la BD
    			$sql = $debutsql;
    			for ($i=0; $i < $num; $i++) 
    				{
    				$sql .= "'".mysql_real_escape_string($data[$i])."'";
    				if ($i < $num-1) $sql .= ","; else $sql .= ");";
    				}
    			mysql_query($sql);
    			if (mysql_error()) 
    				{ 
    				echo mysql_error() ."<br>\n";  
    				$erreur = true;
    				}
    			}
    			$ligne++;
    			echo "$sql <br />";
    			mysql_query($sql);
    		}
    		fclose($handle);
    		mysql_close ($lienDB);
            if ($erreur == false)
    			{
    			$texte = "L'importation des données semble s'être bien passée.";
    			redir ("index.php","",$texte, 5000);
                }
    			else 
    			{
    			$texte = "Il s'est produit une erreur durant l'importation.";
    			redir ("index.php","",$texte, 10000);
    			}
     break;
     case 'Envoyer':
    	// recopie du fichier sous un nom définitif
    	$nomTemporaire = $_FILES['fichierCSV']['tmp_name'];
    	if( !move_uploaded_file($nomTemporaire, "./eleves.csv") )
    		exit("Impossible de copier le fichier.");
     
    		echo "<div style=\"text-align: center\">\n";
            echo "<form name=\"form1\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">\n";
            echo "<p>Le fichier CSV a été transmis au serveur.</p>\n";
            echo "<p>Veuillez confirmer l'importation des données.</p>\n";
    		echo "<p>\n<input type=\"reset\" name=\"submit\" value=\"Annuler\"";
    		echo "onclick=\"javascript:history.go(-1)\">\n";
            echo "<input type=\"submit\" value=\"Confirmer\" name=\"mode\"></p>\n";
            echo "</form>\n";
            echo "</div>\n";
     
    	// tableau de prévisualisation
    	echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\">\n";
    	$handle = fopen("./eleves.csv", "r");
    	while (($data = fgetcsv($handle, 5000, ",","\"")) !== FALSE) 
    		{
    		$num = count($data);
    		echo "<tr>\n";
    		for ($i=0; $i < $num; $i++) 
    			echo "<td>".$data[$i] . "</td>\n";
    		echo "</tr>\n";
    		}
    	fclose($handle);
    	echo "</table>\n";
    	break;
     default:
    	echo "<form method=\"post\" action=\"{$_SERVER['PHP_SELF']}\" ";
    	echo "name=\"form1\" enctype=\"multipart/form-data\">\n";
    	echo "<input name=\"fichierCSV\" type=\"file\">\n";
    	echo "<input name=\"mode\" value=\"Envoyer\" type=\"submit\">\n";
    	echo "</form>\n";
     break;
     }
    ?>
    </div>
     
    </body>
    </html>
    le problème est qu'il me donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO elevescomplete22 (Nom;Prénom) VALUES ('DJELASSI;Sophya');
    alors que la bonne syntaxe est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO elevescomplete22 (Nom,Prénom) VALUES ('Dupond','Michel')
    je n'arrive pas à voir ou est le point virgule de (Nom;Prénom) ainsi que les apostrophes pour encadrer les donneés....

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le script lit un csv separé par des virgules, il lit donc la premiere ligne comme un seul gros champ.
    Change le delimiteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (($data = fgetcsv($handle, 5000, ";","\"")) !== FALSE)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 77
    Points
    77
    Par défaut les données apparaissent deux fois
    merci ça fonctionne
    mais les données apparaissent deux fois dans la base mysql, pourtant j'ai bien une fois insert into
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO elevescomplete22 (Nom,Prénom) VALUES ('ABRAHAM','Marine'); 
    INSERT INTO elevescomplete22 (Nom,Prénom) VALUES ('ABRIAL','Cédric');
    j'ai bien vérifié, les insert into sont uniques, alors je ne m'explique pas pourqoi j'ai deux fois les données!
    une idée ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 195
    Points : 77
    Points
    77
    Par défaut Dernier soucis
    Je n'arrive pas à régler mon problème de doublons et j'ai encore un soucis:
    j'utilise dans ma base des noms avec des espaces, je sais c'est pas bien mais avec 182 champs cela fait du travail, de plus je mets en relation un fichier excel que je ne peux pas modifier facilement.
    Donc dans mon code comment faire pour avoir des ` ` ? pour encadrer mes champs ?
    (`Sexe`,`Pays Nat.`) espace entre Pays et Nat

Discussions similaires

  1. Erreur de syntaxe dans INSERT INTO
    Par nanar21 dans le forum VB.NET
    Réponses: 1
    Dernier message: 25/02/2010, 22h36
  2. insert into dans BDD a partir d un fichier csv
    Par btsgreta77 dans le forum JDBC
    Réponses: 3
    Dernier message: 22/04/2009, 15h18
  3. Erreur de syntaxe dans INSERT INTO VALUES
    Par Mariboo dans le forum Access
    Réponses: 4
    Dernier message: 25/05/2006, 18h57
  4. ajouter des dates délémitées dans INSERT INTO ?
    Par samlepiratepaddy dans le forum Access
    Réponses: 8
    Dernier message: 27/09/2005, 08h12
  5. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo