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 :

Mise à jour champs d'une table à partir d'un fichier csv sauf quand champs du csv sont vides


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Mise à jour champs d'une table à partir d'un fichier csv sauf quand champs du csv sont vides
    Bonjour,

    Je souhaite mettre à jour une table "lignes_telephoniques" à partir d'un .csv. Tous les champs ne sont pas forcément renseignés dans le .csv. Je voudrais donc juste mettre à jour les champs renseignés dans le .csv et ne pas mettre à jour ceux qui sont vides.

    Par exemple, si le champ "opérateur_telephonique" d'une ligne est vide dans le csv, il ne doit donc pas être modifié dans la table. Mais pour l'instant, l'UPDATE que je fais modifie tout. Donc, si le champ "opérateur_telephonique" est vide dans le .csv, l'UPDATE l'enregistre vide dans la table également.

    Etant un développeur débutant, je galère depuis quelques jours dessus. Si vous pouviez m'aider sur ce coup, ça se serait vraiment bien.
    Merci.

    P.S. : Je suis en PHP 5 procédural.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je procéderais directement en base de données. Laquelle utilises-tu ?

    1) Importation du fichier CSV dans une table temporaire.

    2) Lancement d'une requête de mise à jour de la table de production à partir de la table temporaire.

    Une fois ça testé directement sur le SGBD, tu peux programmer en PHP le lancement de ces opérations.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse.

    J'utilise Mysql. Par contre, je pense qu'avec mon code, tu y verras plus clair, au temps pour moi...


    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
    if ($csv = fopen('./file_upload/monfichier.csv', "r"))
    {
        $row = 1;
        fgetcsv($csv);
     
        $i = 0;
        while (($data = fgetcsv($csv, 1555, ";"))) {
     
            $id_coursier = intval($data[3]);
            $date_engagement = date('Y-m-d', strtotime(str_replace('/', '-', $data[13])));
            $date_insert = date('Y-m-d', strtotime(str_replace('/', '-', $data[15])));
            $numero_sim = trim($data[1],"/'");
            $numero_ligne = trim($data[4],"/'");
     
            $req_data = "SELECT numero_ligne FROM lignes_telephoniques where numero_ligne  = " . $numero_ligne . " ;";
            $res_data = $db->getAll($req_data);
     
            if(isset($res_data) && !empty($res_data)) {echo "IF <br><br>";
                $info_ligne = "UPDATE lignes_telephoniques
                                SET
                                    numero_sim = '$data[1]',
                                    agence = '$data[2]',
                                    id_coursier = '$id_coursier',
                                    numero_ligne = '$data[4]',
                                    tel_fixe = '$data[5]',
                                    groupe_vpn = '$data[6]',
                                    data = '$data[7]',
                                    sms = '$data[8]',
                                    num_speciaux = '$data[9]',
                                    commentaire = '$data[10]',
                                    operateur = '$data[11]',
                                    forfait = '$data[12]',
                                    date_engagement = '$date_engagement',
                                    duree = '$data[14]',
                                    date_insert = '$date_insert',
                                    stock = '$data[16]',
                                    date_inactivite = '$date_inactivite',
                                    appel_international = '$data[18]',
                                    blockage_appel_sortant = '$data[19]',
                                    ligne_supprime = '$data[20]',
                                    num_court = '$data[21]'
     
                                WHERE
                                    numero_ligne = $numero_ligne";
            }
            $result_info = $db->execute($info_ligne);
            $i++;
        }
     
        fclose($csv);
    }
    Le moyen "dégueulasse" que je pourrais utiliser serait de mettre une condition pour chaque champ (si champ vide, ne pas l'updater dans la table). Mais y'a quand même 21 champs, c'est vraiment pas top.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Faire une boucle en PHP sur un fichier pour balancer autant de requêtes qu'il y a de lignes est le truc typique à ne pas faire !
    Si le fichier est gros, ça prend un temps fou et ça dégrade les performances du serveur de données.

    Il vaut mieux faire ça en BDD avec une procédure SQL. Ça bloquera la table moins longtemps en préparant les données à mettre à jour.

    Vite fait, l'idée que j'ai pour faire ça serait la suivante :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    -- Importation des données du fichier
    -- Il faudrait au préalable créer une table vide ayant la même structure que la table de production
    LOAD DATA INFILE chemin/nomFichier -- Il faut que MySQL ait les droit de lire le fichier dans le chemin !
    INTO TABLE import
    -- ...
    -- ajouter les options qui vont bien selon la doc MySQL
    ;
     
    -- Création d'une table temporaire qui ne prend que les valeurs nouvelle ou garde l'ancienne s'il n'y a pas de nouvelle
    CREATE TEMPORARY TABLE tmp AS
    SELECT
    	CASE
    		WHEN import.colonne1 = '' OR import.colonne1 IS NULL THEN tableProd.colonne1
    		ELSE import.colonne1
    	END AS colonne1,
    -- idem pour les autres colonnes de la table
    FROM import i 
    INNER JOIN tableProd p ON p.numero = i.numero;
     
    -- Par sécurité, copie de la table de production
    CREATE OR REPLACE TABLE saveTableProd
    SELECT *
    FROM tableProd;
     
    -- Vidage de la table de production
    DELETE FROM tableProd; 
     
    -- Remplissage de la table de production avec les données à jour
    INSERT INTO tableProd
    SELECT *
    FROM tmp;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Ca a l'air de marcher, c'est cool, merci beaucoup CinéPhil (j'aime trop ton blase).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2012, 21h41
  2. Réponses: 2
    Dernier message: 11/06/2010, 14h16
  3. Réponses: 2
    Dernier message: 16/04/2008, 00h18
  4. Réponses: 11
    Dernier message: 08/01/2008, 11h36
  5. Réponses: 6
    Dernier message: 07/02/2006, 14h44

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