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 :

Créer fichier CSV à partir d'une requete SQL


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Août 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Alimentation

    Informations forums :
    Inscription : Août 2013
    Messages : 41
    Points : 15
    Points
    15
    Par défaut Créer fichier CSV à partir d'une requete SQL
    Bonjour à tous,

    J'ai besoin à un moment précis de la journée, de lancer une appli qui me créerait un fichier .CSV suivant les résultats d'une requete.
    Je passe par du PHP, pour plus de simplicité (et surtout parce que c'est ce que je maitrise le mieux) mais il me renvoie uniquement les noms de colonne dans mon fichier qu'il crée.
    Voici le script :
    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
     
    <?php
    // Inclusion des paramètres de connexion à la base de données
    require_once('fonction.php');
    $connexion = connexion_sql('BD_GESTION');
     
    // Titre des colonnes du fichier .CSV
    $fichier = "Societe_ou_Nom; N_Client; Attention; Ad1; Ad2; Ad3; Telephone; Ville; Code_Postal; Pays; Service_UPS; Type_Emballage; Poids; Nbre_Colis; Desc_Marchandises;
    QVN_Option; Mail_QV; Profile_Name; Ref1; Ref2";
    $fichier .= "\n";
     
    // Requête SQL
    $sql = "select UPPER(T.Intitule_Livraison) as Societe_ou_Nom, T.DO_Tiers as N_Client, UPPER(T.Intitule_Livraison) as Attention, UPPER(T.Adresse_Livraison_1) as Ad1,
     UPPER(T.Adresse_Livraison_2) as Ad2,'' as Ad3, T.Tel_Livraison as Telephone,
    UPPER(SUBSTRING(T.CP_Ville_Livraison, 7,200)) as Ville, LEFT(T.CP_Ville_Livraison,5) as Code_Postal, 'FR' as Pays, 'SV' as Service_UPS, 'CP' as Type_Emballage,
    '12.4' as Poids, T.Nb_Colis as Nbre_Colis, 'Boucherie-Charcuterie' as Desc_Marchandises, 'Y' as QVN_Option, P.CT_EMail as Mail_QV,'Logo' as Profile_Name, 
    C.DL_PieceBC as Ref1, '1231231231' as Ref2
    FROM F_DOCENTETE as T
    INNER JOIN F_COMPTET as P
    on P.CT_Num=T.DO_Tiers
    INNER JOIN F_DOCLIGNE as C
    on C.DO_Piece=T.DO_Piece
    where (C.DO_DateLivr between '20131206' and '20131206')  and C.DL_PieceBC like 'W%'
    GROUP BY T.DO_Tiers, T.Intitule_Livraison, T.DO_Piece, T.Adresse_Livraison_1, T.Adresse_Livraison_2, T.Tel_Livraison, T.CP_Ville_Livraison, T.Nb_Colis,
    P.CT_EMail, C.DL_PieceBC";
     
    $req = odbc_execute($connexion, $sql);
     
    // Enregistrement des résultats ligne par ligne
    while($row = odbc_fetch_object($req))
    {
       $fichier .= "".$row->Societe_ou_Nom.";".$row->N_Client.";".$row->Attention.";".$row->Ad1.";".$row->Ad2.";".$row->Ad3.";".$row->Telephone.";".$row->Ville."
       ;".$row->Code_Postal.";".$row->Pays.";".$row->Service_UPS.";".$row->Type_Emballage.";".$row->Poids.";".$row->Nbre_Colis.";".$row->Desc_Marchandises.";".$row->QVN_Option."
       ;".$row->Mail_QV.";".$row->Profile_Name.";".$row->Ref1.";".$row->Ref2."\n";
    }
     
    // Déclaration du type de contenu
    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: attachment; filename=Extract_ups.csv"); 
    print $fichier;
    exit;
    ?>
    Alors que quand je tape ma requete directement dans SQL, elle me ressort des résultats.

    Un peu d'aide serait la bienvenue...

    Merci à tous

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Utilises fputcsv pour créer ton fichier pdf.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Août 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Alimentation

    Informations forums :
    Inscription : Août 2013
    Messages : 41
    Points : 15
    Points
    15
    Par défaut
    Voilà qui est fait :
    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
     
    <?php
     
    // Connect and query the database for the users
    require_once('fonction.php');
     
    $connexion = connexion_sql('BD_GESTION');
    $sql = "select UPPER(T.Intitule_Livraison) as Societe_ou_Nom, T.DO_Tiers as N_Client, UPPER(T.Intitule_Livraison) as Attention, UPPER(T.Adresse_Livraison_1) as Ad1,
     UPPER(T.Adresse_Livraison_2) as Ad2,'' as Ad3, T.Tel_Livraison as Telephone,
    UPPER(SUBSTRING(T.CP_Ville_Livraison, 7,200)) as Ville, LEFT(T.CP_Ville_Livraison,5) as Code_Postal, 'FR' as Pays, 'SV' as Service_UPS, 'CP' as Type_Emballage,
    '12.4' as Poids, T.Nb_Colis as Nbre_Colis, 'Boucherie-Charcuterie' as Desc_Marchandises, 'Y' as QVN_Option, P.CT_EMail as Mail_QV,'Logo' as Profile_Name, 
    C.DL_PieceBC as Ref1, '1231231231' as Ref2
    FROM F_DOCENTETE as T
    INNER JOIN F_COMPTET as P
    on P.CT_Num=T.DO_Tiers
    INNER JOIN F_DOCLIGNE as C
    on C.DO_Piece=T.DO_Piece
    where (C.DO_DateLivr between '20131206' and '20131206')  and C.DL_PieceBC like 'W%'
    GROUP BY T.DO_Tiers, T.Intitule_Livraison, T.DO_Piece, T.Adresse_Livraison_1, T.Adresse_Livraison_2, T.Tel_Livraison, T.CP_Ville_Livraison, T.Nb_Colis,
    P.CT_EMail, C.DL_PieceBC";
    $results = odbc_execute($connexion,$sql);
     
    // Pick a filename and destination directory for the file
    // Remember that the folder where you want to write the file has to be writable
    $filename = "C:/ups/ups_".time().".csv";
     
    // Actually create the file
    // The w+ parameter will wipe out and overwrite any existing file with the same name
    $handle = fopen($filename, 'w+');
     
    // Write the spreadsheet column titles / labels
    fputcsv($handle, array(Societe_ou_Nom, N_Client, Attention, Ad1, Ad2, Ad3, Telephone, Ville, Code_Postal, Pays, Service_UPS, Type_Emballage, Poids, Nbre_Colis, Desc_Marchandises,
    QVN_Option, Mail_QV, Profile_Name, Ref1, Ref2));
     
    // Write all the user records to the spreadsheet
    foreach($results as $row)
    {
        fputcsv($handle, array($row['Societe_ou_Nom'], $row['N_Client'], $row['Attention'], $row['Ad1'], $row['Ad2'], $row['Ad3']
    	, $row['Telephone'], $row['Ville'], $row['Code_Postal'], $row['Pays'], $row['Service_UPS'], $row['Type_Emballage'], $row['Poids'], $row['Nbre_Colis']
    	, $row['Desc_Marchandises'], $row['QVN_Option'], $row['Mail_QV'], $row['Profile_Name'], $row['Ref1'], $row['Ref2']));
    }
     
    // Finish writing the file
    fclose($handle);
     
    ?>
    Mais toujours la même chose, j'ai uniquement les noms de colonnes...

  4. #4
    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
    Tu confonds odbc_execute et odbc_exec
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Voici le code dont je me sert pour proposer un téléchargement de fichier csv qui lit une table de compteur de visites :
    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
            $date = date("y-m-d-H-i-s");
     
            $fichier_de_sauvegarde = 'Compteur_Visites-'.$date.'.csv'; 
     
    	$handle = tmpfile();
    	$info = stream_get_meta_data($handle);
     
    	if($handle)
    		{
    			try
    			{
    				$ressource = \C_PDO::getC()->prepare("SELECT * FROM compteur_visiteurs");
    				$ressource->execute();
     
    				// PDO::FETCH_ASSOC pour récupérer le nom des colonnes avec array_keys
    				$first_line = $ressource->fetch(\PDO::FETCH_ASSOC);
     
    				// Pour indiquer les colonnes avec la première lettre en majuscule
    				$colonnes = array_map('ucfirst',array_keys($first_line));
    				fputcsv($handle, $colonnes, ';');
    				// Première ligne de données
    				fputcsv($handle, $first_line, ';');
     
    				while ($line = $ressource->fetch(\PDO::FETCH_NUM)) 
    				{
    					fputcsv($handle, $line, ';');
    				}
     
    				$ressource->closeCursor();
    			}
    			catch(\PDOException $e)
    			{
    				fclose($handle);
    				exit("Erreur de sauvegarde du compteur. Avertir l'administrateur si le problème persiste");
    			}
    		}	 
     
    	$filesize = filesize($info['uri']);
     
     
    	header("Content-Type: application/force-download; name=\"".$fichier_de_sauvegarde."\"");
    	header("Content-Transfer-Encoding: text/csv");
    	header("Content-Length: ".$filesize);
    	header("Content-Disposition: attachment; filename=\"".$fichier_de_sauvegarde."\"");
    	header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public");
    	header("Pragma: no-cache"); 
    	header("Expires: 0"); 
     
    	rewind($handle);
    	fpassthru($handle);
    	fclose($handle);
    	exit;
    C'est un code générique qui sauvegarde toutes les colonnes de la table avec en première ligne les entêtes de colonnes.

Discussions similaires

  1. [MySQL] Créer un tableau à partir d'une requete SQL
    Par extream dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 02/06/2013, 20h11
  2. [SQL] Remplir à partir d'une requete SQL
    Par GarsDuCalvados dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/09/2007, 10h41
  3. Réponses: 3
    Dernier message: 10/09/2007, 20h31
  4. Comment faire du MDX à partir d'une requete SQL?
    Par Immobilis dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 10/11/2005, 09h46
  5. Tableau a partir d'une requete sql
    Par 10-nice dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/10/2004, 16h37

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