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 :

Génération CSV UNIQUE avec plusieurs requêtes


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Par défaut Génération CSV UNIQUE avec plusieurs requêtes
    Bonjour,

    Je me permet de poster étant donné que je ne trouve pas ma réponse sur le net.

    J’essaie tant bien que mal de générer un fichier .CSV via un script PHP, jusqu'ici, rien de compliquer (beaucoup de fonction trouvé sur internet).
    La où ça se complexe, c'est que j'aimerais générer un fichier CSV unique avec des données récolté par plusieurs requêtes, qui vont taper sur des bases différentes !

    EXEMPLE :

    BASE MySQL - 192.168.0.1
    REQUÊTE : SELECT ID, PRENOM, NOM FROM USERS;

    ID PRENOM NOM
    1 Albert ALFA
    2 Bastien BRAVO



    BASE Microsoft SQL Server - 192.168.0.2
    REQUÊTE : SELECT * FROM DEPLACEMENT;

    HEURE_DEBUT HEURE_FIN POSTE BATIEMENT
    12:00:00 13:00:00 110 A
    10:00:00 11:30:00 250 A
    15:00:00 18:30:00 110 B
    08:00:00 12:00:00 130 C


    J'aimerais que les résultats des ces deux requêtes forme un seul et unique fichier CSV (les données récolter par ses requêtes n'ont aucuns points commun et traite des choses complétement différente).

    Dans mon CSV il me faudrait par exemple :

    ID PRENOM NOM HEURE_DEBUT HEURE_FIN POSTE BATIEMENT
    1 Albert ALFA 12:00:00 13:00:00 110 A
    2 Bastien BRAVO 10:00:00 11:30:00 250 A
    15:00:00 18:30:00 110 B
    08:00:00 12:00:00 130 C

    Si vous avez des pistes ou des morceaux de code à partager, je suis preneur !
    Merci d'avance !

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    En effet la contruction d'un CSV se faisant ligne pas ligne, ça va être compliqué (sans doute faisable, mais compliqué).

    Ce que je peux te conseiller c'est d'utiliser une librairie comme PHPExcel qui permet de générer des fichiers excel mais également des fichiers CSV, ce qui te permettra de pouvoir raisonner en terme de cellule, ce qui je pense va te simplifier grandement la tache

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Par défaut
    Après avoir regardé rapidement, ça me parait tout de même assez complexe :/ (N'étant pas développeur, j'ai un peu de mal avec l'utilisation de librairie ...)
    Je vais peut-être me tourner vers une autre solution, la génération d'un fichier CSV par requête, et une concaténation de tous ces excels...

    Dans l'idéal, l'option de la génération en un coup du CSV serait le top, mais je n'ai pas beaucoup de compétence en dev', et dès que ça deviens un peu compliqué je décroche vite :/


    Merci de la réponse en tout cas, si ça peut servir à quelqu'un.

    Cela dit, si quelqu'un a une astuce pour tout de même réussir la génération d'un seul fichier CSV, je suis preneur de toute les pistes !

  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
    Par défaut
    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
     
    // on stocke le resultat de la premiere requête :
    $sth = $cnx->query('SELECT ID, PRENOM, NOM FROM USERS');
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
      $file[] = $row;
    }
     
    // on complète avec le resultat de la deuxième requête 
    $i = 0;
    $sth = $cnx->query('SELECT HEURE_DEBUT, HEURE_FIN, POSTE,	BATIMENT FROM DEPLACEMENT');
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
       if (!isset($file[$i])) { $file[$i] = array('', '', '');
       $file[$i] = array_merge($file[$i], $row);
       ++$i;
    }
     
    // on ecrit le CSV
    $fp = fopen('fichier.csv', 'r+');
    foreach ($file as $values) {
       fputcsv($fp, $values);
    }
    fclose($fp);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Par défaut
    Je n'arrive pas à exploiter le code ci-dessus avec la fonction que j'avais trouvé sur le WEB (et qui génère le CSV bien comme il me faut)

    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
     
    function WriteCsv() {
     
    include 'MySQL_Connection.php';
     
    $nom_fichier = 'export.csv';
     
    //format du CSV
    $csv_terminated = "\n";
    $csv_separator = ";";
    $csv_enclosed = '"';
    $csv_escaped = "\\";
     
    $sql_query = "SELECT * FROM USERS;";
     
    // exécute la commande
    $result = mysql_query($sql_query);
    $fields_cnt = mysql_num_fields($result);
     
    $schema_insert = '';
     
    for ($i = 0; $i < $fields_cnt; $i++)
    {
        $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed,
    stripslashes(mysql_field_name($result, $i))) . $csv_enclosed;
        $schema_insert .= $l;
        $schema_insert .= $csv_separator;
    } // fin for
     
    $out = trim(substr($schema_insert, 0, -1));
    $out .= $csv_terminated;
     
    // Format des données
    while ($row = mysql_fetch_array($result))
    {
        $schema_insert = '';
        for ($j = 0; $j < $fields_cnt; $j++)
        {
    if ($row[$j] == '0' || $row[$j] != '')
    {
     
        if ($csv_enclosed == '')
        {
    $schema_insert .= $row[$j];
        } else
        {
    $schema_insert .= $csv_enclosed .
        str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed;
        }
    } else
    {
        $schema_insert .= '';
    }
     
    if ($j < $fields_cnt - 1)
    {
        $schema_insert .= $csv_separator;
    }
        } // fin for
     
        $out .= $schema_insert;
        $out .= $csv_terminated;
    } // fin while
     
     
    // Envoie au fureteur pour le téléchargement
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    header("Content-type: text/x-csv");
    header("Content-Disposition: attachment; filename=" . $nom_fichier);
    echo $out;
    exit;
    }
    Je n'ai fais que très peu de PHP, je ne comprend même pas tout ce qui est dans la fonction WriteCsv() que j'utilise.
    Si une âme charitable est disponible pour commenter avec plus de précision le code, et m'indiquer du coup comment adapter le code de Sabotage à mon besoin, merci

  6. #6
    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
    Par défaut
    Le code que je t'ai fourni n'a pas besoin d'être adapté (à moins qu'il contienne des erreurs ce qui est possible).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Par défaut
    Je n'ai pas les compétences pour voir si ton code présente des erreurs (sauf sur le côté de la syntaxe à la limite où j'ai trouvé une accolade manquante).

    J'ai essayer de construire mon fichier .PHP à l'aide de ce que tu m'a fourni, et je n'arrive à rien.
    J'ai essayer d'exploiter ton code brut en ajoutant juste ma connexion à ma BDD, et je n'arrive toujours à rien :/

    Est-ce que tu pourrais être plus précis dans la façon d'utiliser ton code s'il te plait ?

    Merci !

  8. #8
    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
    Par défaut
    Tu peux être plus précis ?
    Il se passe quoi exactement ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Par défaut
    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
     
    <?php
     
    // FICHIER TEST.PHP
     
    // configuration de la base de données base de données
    $host = '192.168.0.1';
    $user = 'root';
    $pass = 'root';
    $db = 'glpi';
     
    // connexion à la base de données
    $link = mysql_connect($host, $user, $pass) or die("Impossible de se connecter" . mysql_error());
    mysql_select_db($db) or die("Impossible de se connecter à la base $db.");
     
    // on stocke le resultat de la premiere requête :
    $sth = $link->query('SELECT enseigne FROM glpi.societe ORDER BY enseigne ASC');
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        $file[] = $row;
    }
     
    // on complète avec le resultat de la deuxième requête 
    $i = 0;
        $sth = $link->query('
    SELECT DATE_FORMAT(date,\'%M %Y\'),
           COUNT(*)
                    FROM glpi_tracking
                    WHERE id_societe=1
    		AND DATE(date) >= \'20131101\' 
    		AND DATE(date) <= \'20140331\'
                    GROUP BY DATE_FORMAT(date,\'%Y%m\');');
     
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        if (!isset($file[$i])) {
            $file[$i] = array('', '', '');
            $file[$i] = array_merge($file[$i], $row);
            ++$i;
        }
    }
     
    // on ecrit le CSV
    $fp = fopen('fichier.csv', 'r+');
    foreach ($file as $values) {
        fputcsv($fp, $values);
    }
    fclose($fp);
    ?>
    Voilà l'erreur que j'ai avec ce code :
    ( ! ) Fatal error: Call to a member function query() on a non-object in C:\wamp\www\CSV_Generator\test.php on line 6
    Ligne 6 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sth = $link->query('SELECT enseigne FROM glpi.societe ORDER BY enseigne ASC');

  10. #10
    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
    Par défaut
    l'extension mysql est obsolète ; je t'ai écrit l'exemple en PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $link = new pdo('mysql:host=192.168.0.1;dbname=glpi', 'root' , 'root', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
    	$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Par défaut
    Cette ligne ne fonctionne pas dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    ( ! ) Notice: Undefined variable: cnx in C:\wamp\www\CSV_Generator\MySQL_Connection.php on line 16
    ( ! ) Fatal error: Call to a member function setAttribute() on a non-object in C:\wamp\www\CSV_Generator\MySQL_Connection.php on line 16
    Je ne comprend pas ce que fais cette variable $cnx :/

  12. #12
    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
    Par défaut
    $cnx c'était ma variable mais tu l'as renommé $link ; j'ai oublié de changer cette ligne.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/05/2012, 11h55
  2. Bouton avec plusieurs requètes
    Par redoran dans le forum Composants VCL
    Réponses: 2
    Dernier message: 06/12/2010, 13h41
  3. Lire un fichier CSV envoyé avec une requête POST
    Par Marm B dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2009, 13h31
  4. une conditionnel IF avec plusieur requête
    Par vaness303 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/05/2009, 15h54
  5. Problème avec plusieurs requêtes sql
    Par Raul10 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/08/2007, 18h21

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