Export csv table mysql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Export csv table mysql

Re: Export csv table mysql

par Sebastien » 19 nov. 2012, 15:29

Ta solution marche très bien, c'est plus propre je trouve :
while($row = mysql_fetch_object($req))
{
	// On supprime les ; dans les champs nécessaires
	foreach($row as $property => $value)
	$row->$property = str_replace(CHR(59)," - ",$value);
	
	// On rassemble le tout
	$fichier .= "".$row->titre.";".$row->date_debut.";".$row->date_fin.";".$row->type_activite.";".$row->theme_directeur.";".$row->sous_theme.";".$row->evenement_rattache.";".$row->departement.";".$row->commune.";".$row->lieu.";".$row->duree_evenement.";".$row->description.";".$row->accessibilite.";".$row->payant.";".$row->organisateur.";".$row->animateur.";".$row->age_public.";".$row->type_public.";".$row->contact.";".$row->contact_telephone.";".$row->courriel.";".$row->web.";".$row->remarques.";".$row->date_modif."\n";
	
	// On supprime les retours à la ligne incompatibles avec csv
	$fichier = str_replace(CHR(13).CHR(10)," - ",$fichier); 
}
Merci à toi!
Seb

Re: Export csv table mysql

par Saian » 19 nov. 2012, 14:43

Tu peux tenter un truc dans le style en première ligne dans le while, mais pas sur que la boucle sur les propriétés de l'objet $row fonctionne :
foreach($row as $property => $value)
  $row->$property = str_replace(CHR(59)," - ",$value);
// utiliser $row->property_name pour la concaténation dans $fichier

// OU avec un fetch_array au lieu d'un fetch_object
foreach($row as $key => $value)
  $row[$key] = str_replace(CHR(59)," - ",$value);
// utiliser $row['key_name'] pour la concaténation dans $fichier

// OU une autre variante avec object ou array, avec array dans l'exemple
foreach($row as $key => $value)
  $$key = str_replace(CHR(59)," - ",$value);
// utiliser $nom_champ pour la concaténation dans $fichier
Si tu ne veux pas faire sur tous les champs tu peux filtrer les champs comme ça :
// avant le while
$fields_to_escape = array('titre', 'description');

// en première ligne dans le while avec un fetch_array
foreach($fields_to_escape as $field_name)
  $row[$field_name] = str_replace(CHR(59)," - ",$row[$field_name]);
//utiliser $row['field_name'] pour la concaténation dans $fichier

Re: Export csv table mysql

par Sebastien » 19 nov. 2012, 13:38

Oui merci, j'avais vu mais je ne peux pas éditer le post malheureusement.
J'ai donc répété l'opération avec par exemple $titre = str_replace(CHR(59)," - ",$row->titre); si jamais un utilisateur venait à insérer un ";" dans le titre
Je ne sais pas si c'est correct ou si il existe un moyen permet de dire "aucun ";" dans l'ensemble des champs extraits"

Merci encore pour tes lumières, tu m'as retiré une épine du pied :D

Seb

Re: Export csv table mysql

par Saian » 19 nov. 2012, 12:38

Supprime le $fichier .= $description; qui est juste sous le str_replace sinon tes lignes ne vont pas commencer par la bonne valeur !

Re: Export csv table mysql

par sebastien » 19 nov. 2012, 12:30

Un grand merci à toi!
Voici pour les personnes intéressées :
<?php
	
// Connexion MySQL
 $host = 'xxxx'; // <--  db address
 $user = 'xxxx'; // <-- db user name
 $pass = 'xxxx'; // <-- password
 $db = 'xxxx'; // db's name
 $table = 'xxxx'; // table you want to export
 $file = 'nom_de_mon_fichier'; // csv name.
 
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
 mysql_select_db($db) or die("Can not connect.");

// la variable qui va contenir les données CSV
$fichier = '';
 
// Titre des colonnes du fichier .CSV ou .XLS
$fichier = "Titre; Date de debut; date de fin; Type activite; Theme directeur; Sous theme; Evenement rattache; Departement; Commune; Lieu; Duree evenement; Description; Accessibilite; Payant; Organisateur";
$fichier .= "\n";
 
// Requête SQL
$sql = "SELECT * FROM ".$table."";
$req = mysql_query($sql);

// Enregistrement des résultats ligne par ligne

while($row = mysql_fetch_object($req))
{
	// On supprime les ; dans les champs nécessaires
	$description = str_replace(CHR(59)," - ",$row->description);
	$fichier .= $description;
	
	$fichier .= "".$row->titre.";".$row->date_debut.";".$row->date_fin.";".$row->type_activite.";".$row->theme_directeur.";".$row->sous_theme.";".$row->evenement_rattache.";".$row->departement.";".$row->commune.";".$row->lieu.";".$row->duree_evenement.";".$description.";".$row->accessibilite.";".$row->payant.";".$row->organisateur."\n";
	
	// On supprime les retour à la ligne incompatibles avec csv
	$fichier = str_replace(CHR(13).CHR(10)," - ",$fichier); 

}

// Entêtes (headers) PHP qui vont bien pour la création d'un fichier Excel CSV
header("Content-disposition: attachment; filename=Personnes.csv");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: application/vnd.ms-excel\n");
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
// Remplacer .csv par .xls pour exporter en .XLS
echo $fichier;
exit();
?>
Seb

Re: Export csv table mysql

par Saian » 19 nov. 2012, 10:49

Évidement que ça ne marche pas non plus, le description sur lequel tu essaies d'appliquer le str_replace en première ligne n'existe pas. Et quand bien même tu utiliserais $row->description, ça ne marcherait pas non plus étant donné que tu n'es pas rentré dans le while et que $row n'existe donc pas. Dans ton code tu considères que la chaine transmise à str_replace est passée par référence (et donc que l'originale est modifiée) mais ce n'est pas le cas.

Tu peux faire comme ça :
while($row = mysql_fetch_object($req))
{
  $description = str_replace(CHR(59)," - ",$row->description);
  $fichier.= $description;
  //...
}

// OU

while($row = mysql_fetch_object($req))
{
  $fichier.= str_replace(CHR(59)," - ",$row->description);
  //...
}

Re: Export csv table mysql

par sebastien » 19 nov. 2012, 09:23

Salut,
Merci pour tes lumières, mais tu l'auras compris je ne suis pas développeur. J’essaie d'apprendre petit à petit mais php est encore un grand mystère pour moi.
Voici ce que j'ai fait, mais ça ne fonctionne toujours pas
str_replace(CHR(59)," - ",description);
while($row = mysql_fetch_object($req))
{
   $fichier .= "".$row->titre.";".$row->date_debut.";".$row->date_fin.";".$row->type_activite.";".$row->theme_directeur.";".$row->sous_theme.";".$row->evenement_rattache.";".$row->departement.";".$row->commune.";".$row->lieu.";".$row->duree_evenement.";".$row->description.";".$row->accessibilite.";".$row->payant.";".$row->organisateur."\n";
                // On supprime les caracteres incompatibles avec csv
                $row = str_replace(CHR(59)," - ",$row);  //ici je souhaiterais supprimer les ";" des champs mais je n'y parviens pas
                $fichier = str_replace(CHR(13).CHR(10)," - ",$fichier); // ici j'arrive bien à supprimer saut de ligne et paragraphe

}

// Entêtes (headers) PHP qui vont bien pour la création d'un fichier Excel CSV
header("Content-disposition: attachment; filename=Personnes.csv");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: application/vnd.ms-excel\n");
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");

echo $fichier;
exit(); 
Merci d'avance
Seb

Re: Export csv table mysql

par Saian » 19 nov. 2012, 00:57

Il faut que tu le fasses directement lors de la concaténation.
str_replace(CHR(59), ' - ', $row->description)
Si tu concatènes la valeur dans $fichier avant de faire le remplacement des ; comment veux tu qu'ils soient modifiés dans $fichier ?

Re: Export csv table mysql

par sebastien » 18 nov. 2012, 22:49

Merci pour ta réponse,

J'avais déjà travaillé sur ça avec
 $fichier = str_replace(CHR(59)," - ",description);
Mais ça ne fonctionne pas non plus. Pourtant il me semble bien que cette écriture est correct = dans "&fichier" remplacer ";" par "-" dans "description"

Je sèche...

Re: Export csv table mysql

par Saian » 18 nov. 2012, 20:03

$row c'est un objet et str_replace travaille sur les chaines pas les objets. ;)

Export csv table mysql

par sebastien » 18 nov. 2012, 18:41

Bonjour,
J’essaie depuis hier d'exporter ma table en cvs via un script php. Cependant, un de mes champs contient des sauts de ligne, des paragraphes et des ";". J'ai réussi à supprimer les sauts de ligne et paragraphes mais pour les ";" je n'y arrive pas.
Voici mon code :
while($row = mysql_fetch_object($req))
{
   $fichier .= "".$row->titre.";".$row->date_debut.";".$row->date_fin.";".$row->type_activite.";".$row->theme_directeur.";".$row->sous_theme.";".$row->evenement_rattache.";".$row->departement.";".$row->commune.";".$row->lieu.";".$row->duree_evenement.";".$row->description.";".$row->accessibilite.";".$row->payant.";".$row->organisateur."\n";
		// On supprime les caracteres incompatibles avec csv
		$row = str_replace(CHR(59)," - ",$row);  //ici je souhaiterais supprimer les ";" des champs mais je n'y parviens pas
		$fichier = str_replace(CHR(13).CHR(10)," - ",$fichier); // ici j'arrive bien à supprimer saut de ligne et paragraphe

}

// Entêtes (headers) PHP qui vont bien pour la création d'un fichier Excel CSV
header("Content-disposition: attachment; filename=Personnes.csv");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: application/vnd.ms-excel\n");
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");

echo $fichier;
exit(); 
Merci d'avance pour votre aide

Seb