Hello all

Je me suis codé un script PHP dont le but est de créer une requête SQL à partir d'un fichier CSV. Car on m'a filé des fichiers excel pour remplir mes bases de données.

J'aimerais que ce script profite a pas mal de monde et j'obtiens une requète correcte lorsque j'exécute mon script via un navigateur sous Linux (Debian).

J'ai essayé avec Firefox et IE8 sous Windows et là, j'obtiens un retour à la ligne dans ma requète que je n'ai pas sous Linux.

Exemple :

Citation Envoyé par Windows
INSERT INTO TABLE
VALUES ('B001', '8700', '15', '0', '150', '50', '145', '100', '140
');

INSERT INTO TABLE
VALUES ('B002', '8700', '15', '0', '210', '50', '200', '100', '185
');
Citation Envoyé par Linux
INSERT INTO TABLE
VALUES ('B001', '8700', '15', '0', '150', '50', '145', '100', '140');

INSERT INTO TABLE
VALUES ('B002', '8700', '15', '0', '210', '50', '200', '100', '185');
Je ne vois pas trop d'où peu venir le souci.

Vous pouvez tester le script à cette adresse :

http://www.open-web.fr/csv2sql/

Et enfin le code principal csv2sql.php:

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
130
<?php
session_start();
 
include('envoi.php'); //fonction d'envoi de fichier
 
$caractereDeSeparation = $_POST['caractereDeSeparation'];
$nomDeTable = $_POST['nomDeTable'];
 
$_SESSION['SQLRequeteComplete'] = '';
$SQLRequeteINTO = 'INSERT INTO ' . $nomDeTable;
$compteur = 1;
$premiereBoucle = true;
$CSVcontientNomsChamps = $_POST['CSVcontientNomsChamps'];
 
// On ouvre le fichier CSV aléatoire créé
$fichierCSV = fopen($nomAleatoire, "r+");
 
while(!feof($fichierCSV)) // Boucle de lecture de fichierCSV...
{
	/* ... on lit fichierCSV ligne par ligne avec fgets()
	et on place dans un tableau $valeurs le contenu de la ligne en cours */
 
	$ligneEnCours = fgets($fichierCSV);
 
	// traitements....
	$ligneEnCours = preg_replace('/\n/', '', $ligneEnCours); // on vire les retours à la ligne si il y en a
	$ligneEnCours = preg_replace('/\'/', '', $ligneEnCours); // on vire les ' si il y en a
	$ligneEnCours = preg_replace('/"/', '', $ligneEnCours); // on vire les " si il y en a
	// fin traitements....	
 
	$valeurs = explode($caractereDeSeparation, $ligneEnCours); // on place chaque élément dans un tableau $valeurs[]
 
	$nombreChamps = sizeof($valeurs); // on compte le nombre d'éléments du tableau
 
	if($premiereBoucle) // Première lecture pour récupérer les champs 
	{
		if($CSVcontientNomsChamps == 'true') // si le nom des champs se trouve dans le fichier CSV...
		{
			$SQLRequeteINTO .= ' (';
			foreach($valeurs as $champ) // On lit chaque champ séparément pour les placer dans la requète
			{
				if($compteur < $nombreChamps) // tant que l'on n'est pas au dernier champ...
				{
					$SQLRequeteINTO = $SQLRequeteINTO . $champ . ', '; // ...on place des virgules pour compléter la requète
					$compteur++;
				}
				else // une fois arrivé au dernier champ...
				{
					$SQLRequeteINTO = $SQLRequeteINTO . $champ . ')
'; // ...on termine par une parenthèse
				}
			}
			$compteur = 1; // on réinitialise le compteur
		}
		else // si il n'y a pas le nom des champs, on est direct sur SQLRequeteVALUES
		{
			$SQLRequeteINTO .= '
';
			$SQLRequeteVALUES = 'VALUES (';
                	foreach($valeurs as $valeur) // On lit chaque champ séparément pour les placer dans la requète
                	{
                	        if($compteur < $nombreChamps) // tant que l'on n'est pas au dernier champ...
                	        {
                	                $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ', '; // ...on place des virgules pour compléter la requète
                	                $compteur++;
                	        }
                	        else // une fois arrivé au dernier champ...
                	        {
                	                $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ');

'; // ...on termine par une parenthèse
                	        }
                	}
                	$compteur = 1; // on réinitialise le compteur	
		}
	}
	else // lecture des valeurs
	{
		$SQLRequeteVALUES = 'VALUES (';
		foreach($valeurs as $valeur) // On lit chaque champ séparément pour les placer dans la requète
                {
                        if($compteur < $nombreChamps) // tant que l'on n'est pas au dernier champ...
                        {
                                $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ', '; // ...on place des virgules pour compléter la requète
                                $compteur++;
                        }
                        else // une fois arrivé au dernier champ...
                        {
                                $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ');

'; // ...on termine par une parenthèse
                        }
                }
		$compteur = 1; // on réinitialise le compteur
	}
 
	/* Le premier tour de boucle ne sert qu'à générer les colonnes du INSERT INTO
	Le dernier tour de boucle génère un VALUES vide
	Donc on ne les inclus pas dans la génération de la requète SQL finale.
	*/
 
	if($CSVcontientNomsChamps == 'true')
	{
		if(!$premiereBoucle AND !feof($fichierCSV)) 
		{
			$_SESSION['SQLRequeteComplete'] .=  $SQLRequeteINTO . $SQLRequeteVALUES; 
			$_SESSION['SQLRequeteComplete'] = str_replace('\'NULL\'', 'NULL', $_SESSION['SQLRequeteComplete']);
		}
	}
	else
	{
		if(!feof($fichierCSV))
                {
                        $_SESSION['SQLRequeteComplete'] .=  $SQLRequeteINTO . $SQLRequeteVALUES;
                        $_SESSION['SQLRequeteComplete'] = str_replace('\'NULL\'', 'NULL', $_SESSION['SQLRequeteComplete']);
                }
 
	}
 
	$premiereBoucle = false;
}
 
echo '<a href="telechargement.php?fichier=' . $_SESSION['nomFichier'] .'">T&eacute;l&eacute;charger le fichier SQL</a><br /><br />';
echo nl2br($_SESSION['SQLRequeteComplete']);
 
fclose($fichierCSV);
 
unlink($nomAleatoire); // on efface le fichier aléatoire créé
 
?>
Le script d'envoi (envoi.php) :

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
<?php
 
$tailleMax = 1048576; 
$extensionsValides = array('csv');
$erreur = '';
 
if($_FILES['fichierCSV']['error'] > 0)  // on vérifie si le fichier a été envoyé
{
	$erreur = "Erreur lors du transfert";
}
else
{
	if($_FILES['fichierCSV']['size'] > $tailleMax) // Puis on vérifie si le fichier n'est pas trop gras
	{
		$erreur = "Le fichier est trop gros";
	}
	else
	{
		$extensionFichier = strtolower(substr(strrchr($_FILES['fichierCSV']['name'], '.') ,1)); // on met en petit l'extension du fichier
 
		if(in_array($extensionFichier, $extensionsValides)) // 
		{
			$nomAleatoire = md5(uniqid(rand(), true)); // on crée un nom aléatoire pour le fichier envoyé
			$transfert = move_uploaded_file($_FILES['fichierCSV']['tmp_name'], $nomAleatoire); // on place le fichier dans le répertoire web 
 
			$_SESSION['nomFichier'] = $_FILES['fichierCSV']['name']; //on récupère le nom du fichier envoyé...
			$_SESSION['nomFichier'] = substr($_SESSION['nomFichier'], 0, -4); // on vire l'extension
			$_SESSION['nomFichier'] .= '.sql';
		}
		else
		{
			$erreur = "Ce fichier n'est pas un fichier CSV";
		}
	}
	echo $erreur;
}
?>
Script de téléchargement :

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
<?php
 
session_start();
 
$fichierSQL = fopen($_SESSION['nomFichier'], 'w+');
fputs($fichierSQL, $_SESSION['SQLRequeteComplete']);
fclose($fichierSQL);
 
$fichier = $_GET['fichier'];
$chemin = '' . $fichier;
if (file_exists($chemin))
{
	header('Content-disposition: attachment; filename="' . $fichier . '"');
	header('Content-Type: application/force-download');
	header('Content-Transfer-Encoding: binary');
	header('Content-Length: '. filesize($chemin));
	header('Pragma: no-cache');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Expires: 0');
	readfile($chemin);
}
else
{
	$erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez nous excusez pour le désagrément.';
}
 
unlink($_SESSION['nomFichier']); // on efface le fichier SQL généré sur le serveur
 
?>
La page d'index.php :

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
<?php
session_start();
?>
 
<form method="post" action="csv2sql.php" enctype="multipart/form-data">
<p>S&eacute;lectionnez le fichier CSV &agrave; envoyer :<br />
<input type="file" name="fichierCSV" />
<input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
<br /><br />
Indiquez le nom de la table :<br />
<input type="text" name="nomDeTable" />
<br /><br />
La premi&egrave;re ligne du fichier CSV contient le nom des champs<br />
<input type="radio" name="CSVcontientNomsChamps" value="true" checked="checked" /> Oui
<input type="radio" name="CSVcontientNomsChamps" value="false" /> Non
<br /><br />
S&eacute;lectionnez le caract&egrave;re de s&eacute;paration :<br />
<select name="caractereDeSeparation">
<option value=",">,</option>
<option value=";">;</option>
</select>
<br /><br />
<input type="submit" value="Envoyer" />
 </p>
</form>
Si des fois vous avez une idée d'où ça peut venir....

Merci !!