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 :

réduire mon bout de script ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut réduire mon bout de script ?
    bonjour, j'ai une méthode qui sert à inscrire chaque étudiant dans une groupe, on peut
    imaginer que ces groupe s'appelle des cohortes.
    j'aimerais savoir si je peux réduire facilement ma méthode la voici

    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
    while ($donnee = $query->fetch()) {
        //echo $donnee['lastname']."<br/>"; 
        //$this->promo[$increment][] = $donnee['id'];
        /*
         * ON ENREGISTRE CHAQUE ETUDIANT DANS LEURS COHORTES
        */
        switch ($annee) {
            case 1:
                $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
                VALUES(" . $this->cohorte_1a . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
                $this->promo_1[] = $donnee['id'];
                $this->bdd->exec($enrol_cohort);
                break;
            case 2:
                $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
                VALUES(" . $this->cohorte_2a . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
                $this->promo_2[] = $donnee['id'];
                $this->bdd->exec($enrol_cohort);
                break;
            case 3:
                $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
                VALUES(" . $this->cohorte_3a . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
                $this->promo_3[] = $donnee['id'];
                $this->bdd->exec($enrol_cohort);
                break;
            case 4:
                $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
                VALUES(" . $this->cohorte_4a . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
                $this->promo_4[] = $donnee['id'];
                $this->bdd->exec($enrol_cohort);
                break;
            case 5:
                $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
                VALUES(" . $this->cohorte_5a . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
                $this->promo_5[] = $donnee['id'];
                $this->bdd->exec($enrol_cohort);
                break;
        }
    }
    l'attribut cohorte_1a est un nombre, entre cohorte_1a et cohorte_2a, il n'y a pas de
    suite logique quelconque.


    je vous remercie de votre réponse si vous avez une idée.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Billets dans le blog
    1
    Par défaut
    Plusieurs solutions, selon ton besoin : la plus longue et la plus proche de ton code actuel consiste à simplement centraliser ta requête à la fin de ta boucle.
    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
    while ($donnee = $query->fetch()) {
        /*
         * ON ENREGISTRE CHAQUE ETUDIANT DANS LEURS COHORTES
         */
        switch ($annee) {
            case 1:
                $cohorte = $this->cohorte_1a;
                $this->promo_1[] = $donnee['id'];
                break;
            case 2:
                $cohorte = $this->cohorte_2a;
                $this->promo_2[] = $donnee['id'];
                break;
            case 3:
                $cohorte = $this->cohorte_3a;
                $this->promo_3[] = $donnee['id'];
                break;
            case 4:
                $cohorte = $this->cohorte_4a;
                $this->promo_4[] = $donnee['id'];
                break;
            case 5:
                $cohorte = $this->cohorte_5a;
                $this->promo_5[] = $donnee['id'];
                break;
        }
        $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
        VALUES(" . $cohorte . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
        $this->bdd->exec($enrol_cohort);
    }
    une autre solution : supprimer ton switch en utilisant des variables dynamiques (ce qui est loin d'être ma solution préférée).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($donnee = $query->fetch()) {
        /*
         * ON ENREGISTRE CHAQUE ETUDIANT DANS LEURS COHORTES
         */
        $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
        VALUES(" . $this->{'cohorte_'.$annee.'a'} . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
        $this->{'promo_'.$annee}[] = $donnee['id'];
        $this->bdd->exec($enrol_cohort);
    }
    Une solution plus propre est d'utiliser un tableau : ça nécessite un peu plus de travail de ton côté puisqu'il te faudra adapter le code autour, mais ce sera bien plus propre, lisible et maintenable à terme !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while ($donnee = $query->fetch()) {
        /*
         * ON ENREGISTRE CHAQUE ETUDIANT DANS LEURS COHORTES
         */
        $enrol_cohort = "INSERT INTO cohort_members (cohortid,userid,timeadded) 
        VALUES(" . $this->cohorte[$annee] . "," . $donnee['id'] . "," . $this->timestamp_now . ")";
        $this->promo[$annee][] = $donnee['id'];
        $this->bdd->exec($enrol_cohort);
    }
    Dernier point : tu effectues une requête à chaque tour de boucle...tu gagnerais beaucoup à utiliser pour ça une requête préparée, où à grouper tes valeurs à insérer et effectuer ton insertion en dehors de ta boucle !
    Tu as quelques exemples et pistes ici : http://www.developpez.net/forums/d13...ertion-double/
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    ton code se résume à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $func   = "cohorte_{$annee}a";
    $promo  = "promo_{$annee}";
    $values = array();
     
    while ($v = $query->fetch())
    {
        $values[]         = "({$this->$func}, {$v['id']}, {$this->timestamp_now})";
        $this->{$promo}[] = $v['id'];
    }
     
    $sql = 'INSERT INTO cohort_members (cohortid, userid, timeadded) VALUES '.implode(',', $values);
    $this->bdd->exec($sql);

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci de ces réponse

    je pense qu'il faut que j'adopte la 1er solution qui ressemble à la mienne, car il faut
    faire un script compréhensible par l'admin réseaux lorsque je ne serais pas là.

    Par contre j'ai du mal à comprendre sur la soluce ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $annee = array("1","2"...)  ?
    $promo  = "promo_{$annee}";
    si je fait un print_r($promo), j'ai un string ou un tableau ?

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    $annee est un tableau ?
    Poste le code entier stp.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    en fait ce que je n'ai pas bien compris c'est l'accolade, voici je test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $tb=array(1,50,5);
    $promo="promo_{$tb}";
     
    foreach($promo as $P)
    {
    echo $P;
    }
    Warning: Invalid argument supplied for foreach() in /var/www/test.php on line 6 Call Stack: 0.0218 326956 1. {main}() /var/www/test.php:0

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/09/2008, 14h43
  2. aide pour traduire un bout de script php
    Par maximenet dans le forum ASP
    Réponses: 1
    Dernier message: 04/10/2007, 00h14
  3. Conseil pour réduire mon code
    Par Triwis dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/08/2007, 16h17
  4. [RegEx] Réduire mon texte au contenu des balises h2
    Par shinji_rem dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2007, 11h29
  5. Bout de script de nettoyage
    Par Gwipi dans le forum Langage
    Réponses: 3
    Dernier message: 17/05/2006, 15h09

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