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

Langage PHP Discussion :

lecture d'un fichier csv pour mise en bdd


Sujet :

Langage PHP

  1. #41
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Merci pour la fonction ; je vais essayer de l'utiliser et je te dis.

  2. #42
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    je ne pense pas utiliser la fonction comme il faut car le BOM n'est pas retiré. Bien sûr, cette fonction est disponible dans PhpStorm (File -> Remove BOM) mais pour les utilisateurs autres que moi, ça va pas.

    Voici comment je l'utilise :
    J'ai mis cette fonction dans la classe CSVFile_model (j'ai laissé les extensions que tu n'aimes pas !) puis dans le fichier controller_controller.php (qui n'est pas une classe et d'ailleurs, y en a pas dans le répertoire controller) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $upload_dir = 'csv';
    $name = $_SESSION['name']??NULL;
    $filepath = DIR_ROOT .$upload_dir.DIRECTORY_SEPARATOR.$name;
     
    $CSV_file_check1=new CSVFile_model();
     
    if (isset($filepath))
    {
        $ret = $CSV_file_check1->checkFile($filepath);  // to check if it is well a CSV file
     
        $CSV_file_check1->removeUTF8BomFile($filepath);// remove the BOM
    }
    Il est où le bug ?

  3. #43
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    ce n'est pas que j'aime pas, chacun fait comme bon lui semble. Je donne des conseils d'après une certaine logique et expérience, tu restes libre de faire comme tu veux.
    Mais te retrouver avec des trucs pareils : model\CSVFile_model ou encore controller_controller.php, à mes yeux c'est du grand n'importe quoi, ça pique !

    Le code informatique est un langage et comme tout langage, plus on est précis et mieux c'est. Dans la vie courante, tu n'utilises pas des pléonasmes à tout bout de champ, ben dans le code informatique, c'est pareil. C'est du bon sens. Au quotidien, tu t'efforces d'employer le mot juste pour exprimer un point de vue, une sensation... afin que la compréhension soit la plus précise possible. Ben dans la programmation c'est exactement pareil. Il faut apporter le plus grand soin au choix des noms des variables, fonctions, classes et autres méthodes. Il en va de la facilité de compréhension du code en un simple coup d’œil.

    Récemment, dans un autre fil, j'avais déjà abordé ce point avec un étudiant. Je disais que quand on manipule PDO, la variable ne doit pas s'appeler autrement que $pdo, quand on manipule un PDOStatement, la variable doit s'appeler $stmt, etc. Comme ça en un coup d’œil, tu sais parfaitement ce qui se passe, tu saisis le déroulé du code, sa logique, etc... Et c'est valable aussi pour ceux qui aident et doivent relire le code...

    Et comme toi tu as déjà une tendance naturelle à te perdre dans la logique de tes codes, le fait d'essayer d'avoir des marqueurs précis (un nommage léger mais précis) est d'après un moi un gros plus. Ça facilite la lecture et la reprise du code après une période plus ou moins longue.

    On va clore cet aparté et passer à ton code :
    regarde ce que tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $upload_dir = 'csv';
    $filepath = DIR_ROOT .$upload_dir.DIRECTORY_SEPARATOR.$name;
     
    if (isset($filepath)) {
        // etc
    }
    À ton avis c'est logique le isset() ?

    ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ret = $CSV_file_check1->checkFile($filepath);  // to check if it is well a CSV file
     
    $CSV_file_check1->removeUTF8BomFile($filepath);// remove the BOM
    Je suppose que quand tu écris "to check if it is well a CSV file" ça veut dire que tu fais une tentative de parsage du csv.
    Or tu sais que ta fonction de parsage de CSV n'est pas compatible avec un CSV contenant un BOM (Byte Order Mask) et toi tu fais dans l'ordre :
    1. Tu tentes de parser le CSV (avec ou sans le BOM)
    2. Tu supprimes du fichier l'éventuel BOM

    Je te laisse conclure mais bon, faut que tu sois plus rigoureux. Je ne sais pas comment tu peux l'être plus, fais toi un schéma global, dessine, parles en avec ta femme mais trouve un truc

  4. #44
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Non, pour le test du type du fichier, je ne tente pas un parsage.

    checkfile() :
    Code php : 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
    public function checkFile($name)
    {
       // contrôle du fichier transmis
    if (isset($name))
        {
           $info =  pathinfo($name, PATHINFO_EXTENSION);
           if ($info !== 'csv') {
               $body = new PhpEcho();
               $body->setCode('<p>This file is not a .csv file</p>');
               echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
               return(FALSE);
           }
           else
           {
               $body = new PhpEcho('', ['msg_end' => $name." is uploaded, start processing."]);
               $body->setCode('<p>'.$body('msg_end').'<br></p>');
               echo new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => $body]);
               return(TRUE);
           }
        }

  5. #45
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ok par rapport à mon message précédent, on touche du doigt le fond du problème :
    regarde ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ret = $CSV_file_check1->checkFile($filepath);  // to check if it is well a CSV file
    et vois maintenant mon interprétation (enfin devinette) tellement c'est pas clair. J'ai carrément tapé à côté !!!

    Ta fonction, tu l'aurais nommée : checkFileExtension($filepath) que même le commentaire bateau à côté n'était plus nécessaire.

    J'espère que tu comprends où je veux t'amener. La précision, toujours la précision.

    Passe moi un tes fichier csv parce que chez moi j'ai essayé sur un fichier texte d'exemple qui ne contenait que "abcdef" encodé avec le BOM
    Voici le fichier original en hexa :

    Nom : csv_bom.png
Affichages : 80
Taille : 2,1 Ko

    et voici le fichier en sortie de ma fonction removeBOM() :

    Nom : csv_sans_bom.png
Affichages : 81
Taille : 1,7 Ko

    Donc à priori, ma fonction fait le taf.

  6. #46
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Bonjour rawsrc,

    voici un extrait de fichier csv avec bom

    SESAID;ALTERNATEIDS;PLATFORM;PLATFORMOWNER;PUBLISHER;APPLICATIONNAME;HFMCODE;CURRENTLYACTIVE;ACTIVATEDATE;DEACTIVATEDATE;GROUPNAME;OFFICECOUNTRY;FIRSTNAME;LASTNAME;COMPANYNAME;JOBCODE;REPORTINGENTITY;BUSINESSUNITNAME;LOCATION;INTERNETADDRESS;MANAGERFIRSTNAME;MANAGERLASTNAME;MANAGEREMAIL
    SESA100008;(none);Software Engineering;SESA69723;CollabNet;TeamForge_Full;;TRUE;Jul 26, 2018;;;France;Bon;Jean;Schneider Electric France;TYS5;;Industry Business;CARROS HORIZON;bon.jean@schneider-electric.com;Marc;Bidule;marc.bidule@schneider-electric.com
    
    J'ai simplifié le contenu et renommé les noms de famille.
    Sinon, pour te joindre le fichier lui-même, le forum n'accepte te pas : "fichier non valide" ; je ne peux que par mail. Peux-tu me donner ton adresse mail par MP ? T'attends pas à un temps de réponse rapide car je vais manger..

    Pour revenir au nommage précis des fonctions (et des variables), j'ai bien noté et renommé ma fonction : checkFileExtension.

    Et pour le nommage des fichiers, du style CSVFile_model, l'utilité que j'y vois, c'est que dès que je vois le nom du fichier (ouvert dans un IDE), je sais dans quel répertoire, il est stocké. En ne rajoutant pas l'extension _model, ça serait impossible...

  7. #47
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Salut rawsrc,

    tu viens de me dire par mail que pour toi, ça marche. Comme je n'arrive pas à le faire marcher, voici mon code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $CSV_file_check1->removeUTF8BomFile($filepath);// remove the BOM
     
    UtilFct_controller::debug("controller 32 filepath",$filepath);
    La méthode debug est un var_dump amélioré de $filepath et ça affiche
    controller 32 filepath
    string(51) "C:\xampp\htdocs\www\ticket2\csv\csv_pour_rawsrc.csv"
    Le fichier csv n'est pas modifié, donc j'utilise mal ta méthode : comment faudrait faire ?

  8. #48
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Tous comptes faits, comme tu l'as tout de suite vu quand tu es venu sur mon PC, le problème ne venait que de l'upload, mal fait. J'en ai ch... pour le mettre au point, mais une fois fait, ton script a immédiatement marché.

  9. #49
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Je réfléchis à la classe CSVAnalyse que tu me proposais dans le post #4 (y a 10 jours !). On reçoit un tableau avec les colonnes nommées et il faut construire le SQL. Qu'on fasse un update ou un create, la mise en forme des données est la même. Par contre, celle-ci diffère pour chaque donnée. Ce que je pense faire, c'est écrire un code de ce genre :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach($tab_CSV as $data_tab_CSV)
            {
               foreach ($data_tab_CSV as $key => $value_enreg_CSV)
               switch ($key)
                {
                 case "data1" : //code PHP to update this data
                 break;
                 case "data2" : //code PHP to update this data
                 break;
                 etc
                }
            }
    Le tableau reçu a 2 dimensions, chaque ligne contenant un enregistrement complet venant du CSV, d'où les 2 foreach. Est-ce une bonne méthode ?

  10. #50
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    c'est moyen...
    il faut te poser la question qu'est ce qui va faire que tu vas opter pour un UPDATE ou un INSERT ?
    Est ce que les données du CSV doivent être typées, si oui lesquelles...
    Le typage dépend de la source ou plusieurs sources injectent leur données dans la même table... etc.

  11. #51
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    que ça soit moyen ne me surprend pas : je partage cet avis, mais pas capable de produire du non-moyen...

    En fait, les CSV peuvent avoir 2 origines mais vont alimenter 5 tables (en fait 2 tables dont certaines colonnes sont des clés vers une des 3 autres tables).

    Faire un INSERT ou un UPDATE : en fait, les 2 tables principales comportent une colonne qui est un identifiant. Donc si l'identifiant lu dans le CSV est déjà présent en BDD, UPDATE et sinon, INSERT .

    Oui, certaines données du CSV seront typées : il y a des entiers (en fait des chaînes de caractères dont je vais extraire que le nombre), des booléens et des dates.

    Mais ayant dit tout ça, je suis toujours pas capable de faire du non-moyen...

  12. #52
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    en fonction des relations d'intégrité qui pourraient exister ou pas entre tes tables tu peux joindre les INSERT et UPDATE en une seule requête REPLACE.
    Si le fonctionnement de REPLACE est problématique du fait des relations (REPLACE réalise deux actions quand une clé primaire existe déjà : DELETE suivi de INSERT), tu peux faire un SQL dans le genre INSERT INTO ... VALUES (...) ON DUPLICATE KEY UPDATE ...

  13. #53
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    OK, je regarderai ça et avant de coder quoi que ce soit, je testerai dans phpMyadmin.

    Mais quel que soient les requêtes SQL que je fais, il y a d'abord une mise en forme des données à faire. As-tu une autre méthode à me proposer que celle (moyenne) que j'ai exposée dans le post #49 ?

  14. #54
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Laurent, je ne vois pas trop quoi te proposer, vu que je ne connais pas du tout les données.
    Essaie de pondre quelque chose de ton côté et on verra après si c'est améliorable.

  15. #55
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Une devise qui me va bien : qui va piano, va sano

    Je viens de finir la mise au point de la partie la plus simple ( !) de la classe CSVAnalyse. Cette classe a pour rôle, recevant un tableau à 2 dimensions avec toutes les données d’un fichier CSV et les colonnes étant nommées, de générer les requêtes SQL pour la mise en BDD des données.
    L’élaboration des requêtes SQL m’a pris du temps, mais j’ai pu vérifier dans phpMyAdmin qu’elles fonctionnent.

    En résumé :
    - Une classe d’upload : CSVUpload_view (oui j’ai gardé les extensions dans les noms des fichiers (et donc des classes))
    - On teste si c’est bien un fichier CSV
    - On appelle ta fonction rawsrc pour enlever le BOM
    - Si pas d’erreur, on parse le fichier : génération d’un fichier à 2 dimensions (une ligne par enregistrement du fichier CSV et une colonne par donnée (cette colonne est nommée)
    - La classe CSVAnalyse.

    Pour éviter un long discours, voici le code commenté du contrôleur qui appelle la classe, de la classe elle-même puis la DDL des tables SQL.

    Le contrôleur :
    Code php : 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
    $CSV_file1=new CSVUpload_view();  // upload of the file
    $CSV_file1->csv_upload();
    $upload_dir = 'csv_upload';
    $name = $_SESSION['name']??NULL;
    $filepath = DIR_ROOT .$upload_dir.DIRECTORY_SEPARATOR.$name;
    $CSV_file_check1=new CSVFile_model();
    $csv_parser = new CSVParser_model();
    $ret = $CSV_file_check1->checkFileExtension($filepath);  // to check if it is well a CSV file
    $CSV_file_check1->removeUTF8BomFile($filepath);// remove the BOM
     
    if ((isset($ret)) && $ret) {
        $data_CSV=$csv_parser->parse($filepath,4096);
     
        $errors=$csv_parser->errors();
        if (!empty($errors)) echo implode($errors)."<br/>";
        else
        {
            $csv_analyser = new CSVAnalyser_model();
     
            $tab_SQL=$csv_analyser->build_SQL($csv_parser, $data_CSV);//generation of SQL requests
        }
    }

    La classe CSVAnalyse :
    Code php : 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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?php
    namespace model;
     
    use model\CSVFile_model;
    use model\Validator_model;
    use controller\UtilFct_controller;
     
    /**
     * Class CSVAnalyser_model
     * @package model
     */
    class CSVAnalyser_model
    {
        /**
         * @param CSVParser $ref_CSV_Parser
         * @param $tab_CSV
         *
         * @return array
         */
        public function build_SQL(CSVParser_model $ref_CSV_Parser,$tab_CSV):array
        {
            $sql_to_execute=[];
            $ref_CSVFile=new CSVFile_model();
            $CSV_type=$ref_CSV_Parser->CSVType();
            $CSV_type_authorized=['tickets','licenses'];
            if (in_array($CSV_type,$CSV_type_authorized))
            {
                $req_for_ticket_or_license = self::buildSqlForTicket_or_license($tab_CSV, $CSV_type);
            }
            return($req_for_ticket_or_license);
        }  // end of fct build_SQL
     
        private function buildSqlForTicket_or_license($tab_CSV,$CSV_type)
        {
            $req_sql_to_execute=[];
            $nb_line=0;
            $arg_for_sql=[];
            /* The SQL requests are independant of the data, so they are created only once and after, there is a loop (a
            foreach) in which one takes into account each line of the CSV and affect the data of the SQL requests. One
            creates the array $arg_for_sql with these data, which is returned.
             */
            switch($CSV_type)
            {
                case 'licenses' :
                    /*INSERT IGNORE means that one insert only if the primary key or any unique key are not present in
                    the bdd (if it's the case, one does nothing)
                    PK = application_key
                    unique key=application_name
                     */
                    $req_sql_to_execute[] = "INSERT IGNORE INTO `application` (application_name,platform,platform_owner,publisher) VALUES(id_appli_name,:platform,:platformowner,:publisher)";
     
                /* with this request, INSERT if id_SESA (PK) isn't present, elsewhere UPDATE
                 * application_key=FK on table application (on PK of this table)
                 * for application_key column, the value is the result of a SELECT request.
                 */
                    $req_sql_to_execute[]="INSERT INTO `license` (id_SESA,application_key,currently_active,activate_date,deactivate_date) VALUES(:id_SESA,
      (SELECT application_key from `application` where (application_name=:appli_name)),
      :currently_active,:activate_date,:deactivate_date) ON DUPLICATE KEY UPDATE application_key=(SELECT application_key from `application` where (application_name=:appli_name)),
      currently_active=:currently_active,activate_date=:activate_date,deactivate_date=:deactivate_date";
                    break;
     
                case 'tickets':echo "this a ticket<br/>";
                    break;
            }
     
            foreach($tab_CSV as $data_tab_CSV)
            {
                switch($CSV_type)
                {
                    case 'licenses' :
                        $arg_for_sql[$nb_line]=[['id_appli_name'=>$data_tab_CSV['APPLICATIONNAME']] ,
                            [':platform'=>$data_tab_CSV['PLATFORM']] , [':platformowner'=>$data_tab_CSV['PLATFORMOWNER']]
                            , [':publisher'=>$data_tab_CSV['PUBLISHER']]];
     
                        $arg_for_sql[$nb_line++]=[[':id_SESA'=>$data_tab_CSV['SESAID']] , [':appli_name'=>$data_tab_CSV['APPLICATIONNAME']] , [':currently_active'=>$data_tab_CSV['CURRENTLYACTIVE']] , [':activate_date'=> Validator_model::SQLFormatDate($data_tab_CSV['ACTIVATEDATE'])] , [':deactivate_date'=> Validator_model::SQLFormatDate($data_tab_CSV['DEACTIVATEDATE'])] ];
     
                        break;
     
                    case 'tickets':echo "this a ticket<br/>";
                        break;
                }
            }
            return ([$req_sql_to_execute,$arg_for_sql]);
        }
    } // end of class

    DDL de la table license :
    Code sql : 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
    DROP TABLE IF EXISTS `license`;
    CREATE TABLE `license` (
      `id_SESA` int(6) NOT NULL,
      `application_key` smallint(2) DEFAULT NULL,
      `currently_active` tinyint(1) DEFAULT NULL,
      `activate_date` date DEFAULT NULL,
      `deactivate_date` date DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    ALTER TABLE `license`
      ADD PRIMARY KEY (`id_SESA`),
      ADD KEY `fk_application` (`application_key`);
     
    ALTER TABLE `license`
      MODIFY `id_SESA` int(6) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12347;
     
    ALTER TABLE `license`
      ADD CONSTRAINT `fk_application` FOREIGN KEY (`application_key`) REFERENCES `application` (`application_key`) ON DELETE SET NULL ON UPDATE SET NULL;
    COMMIT;

    DDL de la table application :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE `application` (
      `application_key` smallint(2) NOT NULL,
      `application_name` varchar(30) COLLATE utf8_bin NOT NULL DEFAULT '',
      `platform` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `platform_owner` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `publisher` varchar(30) COLLATE utf8_bin DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
     
    ALTER TABLE `application`
      ADD PRIMARY KEY (`application_key`),
      ADD UNIQUE KEY `UK_appli_name` (`application_name`);
     
    ALTER TABLE `application`
      MODIFY `application_key` smallint(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    COMMIT;

  16. #56
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Je viens de renommer une méthode et une propriété dans mon post précédent car c'était pas clair (les noms dataient de mes premiers essais et je ne les avais pas actualisés)

  17. #57
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut Laurent,

    j'ai commencé à regarder ton code et c'est un peu incompréhensible.

    Je ne comprends pas du tout le code de ton contrôleur.
    Il appelle une vue pour télécharger un fichier, puis s'occupe de gérer le fichier téléchargé puis retire le BOM (si nécessaire) puis lance un parser puis lance l'analyseur et après avoir écrit en base de données, il va se coucher parce qu'il est claqué !

    Non mais, tu te rends comptes de tout ce qu'il fait ? Autant coder toute ton application avec un seul et unique script. Comme ça tu gagneras du temps (quoique) et surtout tu n'utiliseras pas trop d'espace disque.

  18. #58
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    OK, le "diviser pour mieux régner", c'est raté, on dirait. Néanmoins, il n'y a pas 36 actions utilisateur : un upload et derrière, la mise en BDD ; comme cette dernière est systématique après l'upload, ça ne fait qu'une seule action. Par contre, ensuite, le contrôleur a plusieurs actions à lancer :
    • vérifier le type du fichier téléchargé
    • retirer éventuellement le BOM
    • parser
    • écrire en BDD

    Si je découpe ça en autant de méthodes, ça serait bien ?

    Et as-tu jeté un oeil à la classe CSVAnalyse ?

  19. #59
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Hello, j'ai tenté le découpage que je pensais faire. Je pense que c'est pas top, mais je ne sais pas faire mieux. Voilà où j'en suis :

    Tout d’abord, on lance startController.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    use controller\controller_controller;
    use view\DispMenu_view;
     
    $menu = new DispMenu_view();
    $menu->dispMenu();
     
    $controller=new controller_controller;
    $controller->controllerController();

    Celui-ci lance une méthode du contrôleur :
    controller_controller.php
    Code php : 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
    <?php
    declare(strict_types=1);
    namespace controller;
     
    use view\CSVUpload_view;
    use model\CSVFile_model;
    use model\CSVParser_model;
    use model\CSVAnalyser_model;
     
     
    class controller_controller
    {
        private $csv_parser;
     
        public function controllerController ()
        {
            self::CVSUpload();
     
            $upload_dir = 'csv_upload';
            $name = $_SESSION['name'] ?? NULL;
            $filepath = DIR_ROOT . $upload_dir . DIRECTORY_SEPARATOR . $name;
     
            $ret=self::manageFile($filepath);
     
            if (!$ret) exit;
     
            $data_CSV=self::parse($filepath);
     
            $errors = $this->csv_parser->errors();
     
            if (!empty($errors))
            {
                echo implode($errors) . "<br/>";
            }
            else
            {
                self::analyse($data_CSV);
            }
        }
     
        private function CVSUpload()
        {
            $CSV_file1 = new CSVUpload_view();
            $CSV_file1->csv_upload();
        }
     
        private function manageFile($filepath):bool
        {
            $CSV_file_check1 = new CSVFile_model();
     
            $ret = $CSV_file_check1->checkFileExtension($filepath);  // to check if it is well a CSV file
            if ($ret) $CSV_file_check1->removeUTF8BomFile($filepath);// remove the BOM
            return ($ret);
        }
     
        private function parse($filepath):array
        {
            $this->csv_parser = new CSVParser_model();
            $data_CSV = $this->csv_parser->parse($filepath, 4096);
            return($data_CSV??[]);
        }
     
        private function analyse($data_CSV):array
        {
            $csv_analyser = new CSVAnalyser_model();
     
            $tab_SQL = $csv_analyser->build_SQL($this->csv_parser, $data_CSV);
            return($tab_SQL);
        }
    }
    Le reste est inchangé.

  20. #60
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    bon Laurent, il s'agirait que tu suives un peu mieux les conseils qu'on te donne.

    Arrête-toi et regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    use controller\controller_controller;
     
    $controller=new controller_controller;
    $controller->controllerController();
    Euh, t'es sûr qu'il ne te manque pas un p'tit controller quelque part ?
    Allez parce que c'est toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    use controller\controller\controller_controller;
     
    $controller_controller = new controller_controller;
    $controller_controller->controllerController();
    Je me pose quand même la question si t'es certain, absolument certain de manipuler un controller, parce qu'on pourrait avoir un léger doute...

    Combien de fois je t'ai rabâché de ne pas utiliser ce genre de nommage, t'es testard dans ton genre ! Tu vois le ridicule du code, ou pas encore ?
    Est-ce que dans mes codes sur mon blog, j'ai procédé une fois ainsi ? Jamais !

    La nature de l'objet est déduite de son nom pleinement qualifié et de rien d'autre.
    Quand tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace Project\View;
     
    class FormUpload { }
    tu sais que dans ce cas FormUpload est un objet View car son nom pleinement qualifié est Project\View\FormUpload.
    Maintenant quand tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace Project\Controller;
     
    class FormUpload { }
    tu sais que dans ce cas FormUpload est un objet Controller car son nom pleinement qualifié est Project\Controller\FormUpload.
    Et là tu observes et déduis immédiatement, tiens est-ce que le contrôleur FormUpload ne piloterait-il pas l'affichage du formulaire FormUpload ?
    Même après un bon mois de confinement, la compréhension reste naturelle, pas besoin de se faire des nœuds au cerveau, bien que toi tu sembles adorer ça.

    Donc comme tu code en MVC, le MVC doit être respecté.
    Un contrôleur qui ne s'occupe que d'afficher le formulaire d'upload du fichier
    Un contrôleur qui ne s'occupe que de traiter le fichier envoyé : vérification du type, retrait du BOM
    Un contrôleur qui ne s'occupe que de l'analyse du fichier basé sur un fichier du modèle en charge de l'analyse du fichier.

    Tu peux très bien dans ton interface, renvoyer à l'utilisateur une information concernant la validité du fichier qu'il vient d'envoyer. Et n'afficher un bouton Analyser que quand cela est nécessaire.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/01/2008, 13h48
  2. Réponses: 3
    Dernier message: 03/01/2008, 12h14
  3. pb de lecture dans un fichier CSV
    Par MayOL69bg dans le forum C#
    Réponses: 3
    Dernier message: 23/05/2007, 14h21
  4. Réponses: 3
    Dernier message: 19/05/2007, 17h19
  5. Linges sautées dans "lecture" d'un fichier .csv
    Par Mymi dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2006, 20h02

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