Forum Clubic

Probleme encodage+erreur fopen() sur firefox

Bonjour,
J’ai un problème que j’espere vous pourriez m’aider à résoudre. je dois creer un site de gestion de materiel pour mon stage.
J’ai un formulaire d’ajout de fichier csv dans la base de donnée , sur IE l’insertion se fait correctement, cependant a cause d’un problème d’encodage, les données ne s’affichent pas sur ma page web. Ma base de donnée est en utf8, et collation utf8_general_ci; alors ke sur firefox rien en se produit à part des erreurs disant que fopen() ne peut ouvrir mon fichier csv, et ainsi de suite, ni feof() et fgets() ne fonctionnent.Petite paranthese quand meme : fopen fonctionne que si je mets $_FILES[‘file_import’] a la place de $_POST[‘file_import’],sous firefox mais les autres fonctions retournent les memes erreurs.

Pouvez vous me dire comment modifier le charset pour ke ca concorde avec celle de la base, pour ainsi avoir mes données affichés sur ma page?
feof(): supplied argument is not a valid stream resource in C:\wamp\www\2\csv_bdd.php on line 204

fgets(): supplied argument is not a valid stream resource in C:\wamp\www\2\csv_bdd.php on line 206

Voici le code avec les explications de mon probleme :

-- Importer un fichier(.CSV) dans la base de donnée --
Nom de la table MYSQL Séléctionner une table Matériel Local Site Contact Maintenance Contact Externe Entreprise Relevé d'heure Logiciel Logiciel installé Mouvement Intervention Bon de livraison *
Séparateur *
Fichier


<?php

// ------------------------------------------------------------------------- //
// Insérer le contenu d’un fichier CSV dans une table MySQL. //
// ------------------------------------------------------------------------- //
if(isset($_POST[‘file_import’]))
{
if($_POST[‘nom_table’]=="" || $_POST[‘separateur’]=="")
{
echo ‘Veuillez renseigner les champs marqué d’un *.’;
}else{
//declarations des varables post.
$table = $_POST[‘nom_table’];
$fichier =$_FILES[‘file_import’];
$separateur = $_POST[‘separateur’];
$champs = 0;//declaration des champs des tables a 0.
//Definie les champs selon la table choisi
if($table==“materiel”){ $champs=17 ;}elseif($table==“locaux”){$champs=3 ;}elseif($table==“site” || $table==“contact_maintenance”){ $champs=8 ;}elseif($table==“mouvement” || $table==“installation_logiciel”){ $champs=9 ;}
elseif($table==“contact_externe” || $table==“intervention”){ $champs=14 ;}elseif($table==“entreprise”) { $champs=10;}elseif($table==“releve_heure”) { $champs=5;}

//ouverture du fichier

$filr = fopen("$fichier", “r”);

while (!feof($filr))
{
$lignes = fgets($filr,4096);
$listes = explode("$separateur", “$lignes”);
//Remplacement des caracteres speciaux
$listes = str_replace("’", “’”, $listes);
$listes = str_replace(“é”, “e”, $listes);
$listes = str_replace(’"’, ‘’, $listes);
//Detection de lencodage du fichier
$charset = mb_detect_encoding($listes[$j]);// le charset du fichier est apparement ASCII
$resultat = count($listes);
$table = $table;

for ($i=0; $i<$resultat;$i++)
{
$query1 = “INSERT INTO $table VALUES(”;
$query2="";
for($j=0; $j<=$champs-1;$j++)
{

$listes[$j]= ( isset($listes[$j]) ) ? $listes[$j] : Null;
if(function_exists(‘mb_convert_encoding’)){$listes[$j] = mb_convert_encoding($listes[$j],“utf8”,“auto”);}
$query2 = $query2."’".$listes[$j]."’";
//Ajout de , apres chaque variables de VALUES() dans la requete sql.
if($j<$champs-1){$query2 = $query2.",";}
}
$query3 = $query1 . $query2 . “)”;

}

$resulte= mysql_query($query3);
}
if(mysql_error())
{
echo’
Il y a une erreur dans la base de donnée
: '.mysql_error().'
LE charset est '.$charset ;
} else {
echo’
Insertion des données réussie !
'.$charset;

}

}
}Configuration: Windows XP
Internet Explorer 7.0
Firefox 3
MYSql 5.0.51b
PHP 5.2.6
Apache 2.2.8


<?php

if( ! isset( $_POST['file_import'] ) || ! isset( $_POST['nom_table'] ) || ! isset( $_POST['separateur'] ) ) {
	echo 'Veuillez renseigner les champs marqué d\'un *.';
	exit( -1 );
}

// Definie les champs selon la table choisi
$arrayChamp = array( 	'materiel' => 17, 'locaux' => 3, 'site' => 8, 'contect_maintenance' => 8, 'mouvement' => 9, 'installation_logiciel' => 9, 'contact_externe' => 14,
			'intervention' => 14, 'entreprise' => 10, 'releve_heure' => 5 );
			
$champs = $arrayChamp[ $_POST['nom_table'] ];

// Met le fichier dans un tableau, chaque entré correspond à une ligne.
$fileData = file( $_FILES['file_import']['tmp_name'] );

// Parcours les lignes du fichier via le tableau
foreach( $fileData as $lineData ) {
	// Separe la lignes en fonction du séparateur passé par POST
	$listes = explode( $_POST['separateur'], $lignes);
	// Remplacement des caracteres speciaux
	$listes = str_replace("'", "\'", $listes);
	$listes = str_replace("é", "e", $listes);
	$listes = str_replace('"', '', $listes);
	
	//Detection de l'encodage du fichier
	$charset = mb_detect_encoding($listes[$j]);	// le charset du fichier est apparement ASCII
	
	// Parcours le tableau de l'explode de la ligne
	foreach( $listes as $res ) {
		// Debut de la requete
		$query = 'INSERT INTO `'.$_POST['nom_table'].'` VALUES(';
		// Pour chaque champs
		for( $i = 0; $i <= $champs - 1 ; $j++ ) {
			$listes[ $i ] = isset( $listes[ $i ] ) ? $listes[ $i ] : NULL;
			if( function_exists( 'mb_convert_encoding' ) ) { $listes[ $i ] = mb_convert_encoding( $listes[ $j ] , 'utf8', 'auto' ); }
			$query .= '\''.$listes[$i].'\'';
			//Ajout de , apres chaque variables de VALUES() dans la requete sql.
			if( $i < $champs - 1 ){ $query .= ','; }
		}
		// Fin de la requete
		$query .= ")";
	}
	// Exécution de la requete
	mysql_query($query) or die( mysql_error() .'<br/>LE charset est '.$charset );
}
echo '<BR>Insertion des données réussie !<br/>';

?>

J’ai peut etre fait des erreurs, il faudra vérifier que le script fait bien ce que tu veux ( normalement oui ), et ca devrai marché peut import le navigateur. J’ai pas vraiment touché a l’algo ou a tes test, juste remit en forme et viré les grosse erreurs. Si tu veux des infos sur mes modification tu demandes ici :slight_smile:

PS : j’ai pas de fichier pour testé et encore moins la base de donné qui va avec, donc c’est difficile de vérifier le bon fonctionnement.
Edité le 29/08/2008 à 16:56

Bonjour Merci de ton aide,
J’ai mis ton code et j’ai un probleme avec la ligne:

foreach( $fileData as $lineData ){ //Sur cette ligne j’ai une erreure qui dit que les arguments passé dans le foreach ne sont
//pas corrects
// Separe la lignes en fonction du séparateur passé par POST
$listes = explode( $_POST[‘separateur’], $lineData);//J’ai modifié ici $lignes, qui n’existai plus en $lineData

La seule erreur que j’ai est sur le foreach
Voila un bout de table pr tester si tu ve

CREATE TABLE locaux (
client varchar(200) NOT NULL,
local varchar(200) NOT NULL,
site varchar(200) NOT NULL,
PRIMARY KEY (local)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE site (
site varchar(200) NOT NULL,
tel_fixe int(20) default NULL,
fax int(20) default NULL,
adresse varchar(200) NOT NULL,
comp_adresse varchar(200) NOT NULL,
code_postal int(20) default NULL,
ville text NOT NULL,
pays text NOT NULL,
PRIMARY KEY (site)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Ces deux tables se croisent sur une page ou je fais appel a cette requete:
SELECT client, site.site,local,ville FROM locaux,site WHERE UPPER(locaux.site)=UPPER(site.site).
Le probleme c’est que ca ne m’affiche rien alors que on peut visiblement voir ke locaux.site = site.site.
Meme sur phpmyadmin, l’erreur est reproduite car l’encodage est apparement pas le meme.
Un bout de fichier local.csv et site.csv

Canal Plus;MTH Bando;TNSF (48)
Canal Plus;MTH Acquisition;TNSF (48)
CFI;CFI;TNSF (47)
CFI;CFI Diffusion;TNSF (47)
CFI;CFI Flexi;TNSF (47)

TNSF (48);01 41 00 12 12;01 41 00 12 90;48 quai carnot;;92210;Saint cloud;France
TNSF (47);;;47 quai carnot;;92210;Saint cloud;France

Dit moi exactement l’erreur qu’il te met, l’erreur est sûrement que $fileData n’est pas un tableau dans la mesure ou file() n’en a pas retourné car le path passé en paramètre pour le fichier était pas valable.