[RESOLU] écriture table CSV depuis un envoi de fichier

Petit nouveau ! | 9 Messages

09 janv. 2013, 20:10

Bonjour,

j'ai un petit souci que je ne m'explique pas....

j'ai un formulaire:
<div class="instructions4">
		4) Choisir un fichier à envoyer pour mettre à jour la page comptabilité <br /><br />  
		<form method="POST" action="" enctype="multipart/form-data">
			<div class="bouton">
			<label for="fichier">Choix fichier:</label><input type="file" name="fichier" value="" id="fichier" /><br /><br /> 
			<input type="submit" value="Envoyer Fichier" name="envoyer" />
			</div>
		</form>	
	</div>
jusque là rien de spécial...

ensuite le traitement PHP suivant:
<?php
	// Si le formulaire est envoyè
	if (isset($_POST['envoyer'], $_FILES['fichier']))
	{	
		// Si le fichier est bien envoyé et qu'il n'y à pas d'erreur
		if (isset($_FILES['fichier']) && $_FILES['fichier']['error'] == 0)
		{
				
			$fichier = $_FILES['fichier']['name'];
			$extension = substr($fichier,-4,4);
			// SI l'extension du fichier est bien CSV
			if ($extension == ".csv")
			{
				$sql = "LOAD DATA INFILE '$fichier'  INTO TABLE compta FIELDS TERMINATED BY ';' ENCLOSED BY '' ";
				$data=mysql_query($sql) or die (mysql_error());
				
			}		
			// Si le fichier n'est pas au format CSV
			else
			{
				echo 'Le fichier envoyè n\'est pas un fichier de format <b>.csv</b>';
			}
		}
		// Si le fichier est absent ou corompu
		else
		{
			echo 'Veuillez selectioner un fichier.';
		}		
	}
?>
le but est de pouvoir envoyer un fichier CSV qui puisse mettre à jour une table compta de ma base de données.

le message résultant de ce traitement est pas d'écriture bien sûr de la table :

Access denied for user 'U1190624'@'192.168.4%' (using password: YES)


pourtant le reste du site fait appel à des écritures dans les tables de données vis un include pour la connexion à la base SQL et tout ce passe bien.

débutant dans le code (c'est pour ça que mon code est peut être mal écrit ou incomplet....) je suis un peu perplexe du coup là . auriez vous un idée ?

merci d'avance.

Bruno



PS mon fichier .CSV se présente sous la forme:

1;PAUL;ESME;0
2;JUJU;ANTOINE;-58
3;SAFTE;ALEXIS;-15.5
4;GILLION;CHANTAL;42
5;PAULAIN;JEAN-LOUIS;0
6;GERATHE;FLORA;0
etc etc....

ViPHP
xTG
ViPHP | 7331 Messages

09 janv. 2013, 20:31

On peut régler des droits par utilisateur.
Donc je pense que tu n'as pas les droits sur les requêtes de type LOAD. ;)

Petit nouveau ! | 9 Messages

09 janv. 2013, 20:46

merci de ta réponse.

le seul hic c'est que je gère la base SQL chez mon hébergeur via le phpmyAdmin en ligne chez l'hébergeur et je ne sais comment faire et si je peux gérer les droits, je cherche mais je ne trouve rien...


tu aurais une idée ?
où alors je dois faire autrement pour importer des données mais là je ne sais pas faire
merci d'avance.

Bruno

ViPHP
xTG
ViPHP | 7331 Messages

09 janv. 2013, 21:24

Sur la page d'accueil de phpmyadmin tu as un onglet "Privilèges" qui contient la liste des comptes.
Mais si tu es sur un hébergement mutualisé limité à une base de données je doute que tu trouves...

Pour faire autrement beh...
Une requête INSERT par ligne de ton CSV. ;)

Petit nouveau ! | 9 Messages

10 janv. 2013, 00:00

je suis limité à 5 bases de données chez l'hebergeur et pas d'onglet privilèges , j'ai beau fouiner partout il n'y à rien.
dommage car dans mon code j'ai des requêtes qui créent des tables qui écrivent etc etc.... aucun souci mais impossible d'uploader du CSV , et pourtant avec My PHP admin je peux importer des CSV....

je vais les contacter tiens, pour les faire ch...un peu :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 janv. 2013, 00:19

Salut

Comme te l'indique xTG, tu peux faire un script d'upload (champ html type="file") et réaliser l'uploa du fichier, puis le traiter ligne par ligne.

Pour cela tu peux, par exemple, utiliser le fonction file pour lire le fichier et ensuite la fonction str_getcsv pour avoir chaque champ dans un tableau.

Une requête prepararé pour insérer toutes les lignes.

Attention au Time out (30s par défaut).

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

11 janv. 2013, 00:50

bon problème résolu par des pirouettes avec des codes pris de ci de là sur divers cours de PHP sur le net. le résultat c'est que tout fonctionne.
à mon avis le LOAD DATA INFILE était bloqué par l'hébergeur....

donc dans mon process , le formulaire reste inchangé. mais le fichier est uploadé dans un dossier et est "récupéré" ensuite pour analyse et insertions dans la BDD.

avec ce code là (je mets le code car c'est saoulant de voir trop souvent les gens qui posent des questions signaler que'ils ont trouvé la solution mais sans dire comment....):
		<?php
	if(isset($_FILES['fichier'], $_POST['envoyer']))
{

$dossier = 'file/';
$fichier = basename($_FILES['fichier']['name']);
$taille_maxi = 100000;
$taille = filesize($_FILES['fichier']['tmp_name']);
$extensions = array('.csv', '.txt');
$extension = strrchr($_FILES['fichier']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de csv...';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     if(move_uploaded_file($_FILES['fichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     {
          echo 'Upload effectué avec succès !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo 'Echec de l\'upload !';
     }
}
else
{
     echo $erreur;
}
}
	//Le chemin d'acces au fichier sur le serveur
$fichier = fopen("file/compta.csv", "r"); 

//tant qu'on est pas a la fin du fichier :
while (!feof($fichier)) 
{ 
// On recupere toute la ligne
$uneLigne = fgets($fichier, 1024);
//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';') 
$tableauValeurs = explode(';', $uneLigne); 
// On  crée la requete pour inserer les donner (ici il y a 7 champs donc de [0] a [6])
$sql="REPLACE INTO compta VALUES ('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."')"; 
$req=mysql_query($sql); 
// la ligne est finie donc on passe a la ligne suivante (boucle)
}
?>	


en gros débutant j'en ai un peu bavé mais bon maintenant ça fonctionne, merci de votre aide