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 :

setter + contrôle récursif php


Sujet :

Langage PHP

  1. #21
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par badaze Voir le message
    Voici un exemple.

    Comme précédemment c'est l'idée qui prévaut car je n'ai rien testé.

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    <?php
    class Contact
    {
     private $param = array();
     private $dataOk;
     private $errorList = array();
     
     public function __construct()
     {
      $this->dataOk    = true;    
      $this->errorList = array();
     
      $this->initController();
      $this->controlData();
      if ($this->dataOk ) saveData();
     }
     
     // la méthode renvoie soit true soit false
     public function hasBeenSaved()
     {
      return $this->dataOk;
     }
     
     // la méthode renvoie la liste des erreurs
     public function getErrorList()
     {
      return $this->errorList;
     }
     
     private function initController()
     {
      // l'index du tableau correspond au nom du champ dans le formulaire
      // le premier poste contient la regexp de contrôle de données
      // le second poste contient le type de données
      // le troisième poste contient le nom du champ dans la table +++ peut être pour plus tard :)
     
      $this->param['nom']       = array("/^ *** regexp contrôle nom $/",'nom','champ_nom');
      $this->param['sexe']      = array("/^ *** regexp contrôle sexe $/",'sexe','champ_sexe');
      $this->param['secteur']   = array("/^ *** regexp contrôle secteur $/",'secteur','champ_secteur');
      $this->param['cd']        = array("/^ *** regexp contrôle cd $/",'cd','champ_cd');
      $this->param['categorie'] = array("/^ *** regexp contrôle categorie $/",'categorie','champ_categorie');
      $this->param['taille1']   = array("/^ *** regexp contrôle taille $/",'taille','champ_taille1');
      ...
      $this->param['taille2']   = array("/^ *** regexp contrôle taille $/",'taille','champ_taille2');
     }
     
     
     private function commonController($regexp,$type,$value)
     {
       if(!empty($value)) 
       {
        if (!filter_var($value, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regexp))) !== false ) 
        {
         $this->errorList[] = "le format de votre $type $value est incorrect ! <br>";
         $this->dataOk = false;
        } 
       } 
       else
       {
        $this->errorList[] =  "La saisie de votre $type est obligatoire <br>";
        $this->dataOk = false;
       } 
     }
     
     
    private function controlData()
     {
      // parcours des champs à contrôler
      foreach($this->param as $key => $paramProperties)
      {
       if (isset($_POST[$key]))
       {
        $this->commonController($paramProperties[0],$paramProperties[1],$_POST[$key]);
       }
       else
       {
        $this->errorList[] =  "Le champ $key n''a pas été transmis <br>";
        $this->dataOk = false;    
       }
      }
     }
     
     private function saveData()
     {
      // connexion à la base de données
     
      // affectation des valeurs
      $nom     = $_POST['nom'];
      ...
      $taille1 = $_POST['taille1']; 
      $taille2 = $_POST['taille2'];
      ...
      // enregistement dans la base de données
     }
    }
    // utilisation
    $contact = new Contact();
    if (! $contact->hasBeenSaved())
    {
     echo "Des erreurs ont été rencontrées <br>";
     foreach($contact->getErrorList() => $erreur)
     {
      echo "$erreur<br/>";
     }
    }

    Merci

    Concernant le contrôle de la regex...je pense avoir assez bien compris leur fonctionnement..je serai en faire mon affaire..

    Je vais tenter de m'approprier la logique des codes pour les adapter à mes besoins....

    j'aime beaucoup cette classe et je vais essayer de m'approprier cette logique afin de l'adapter à ma Class Contact et ContactManag

    Bon WE à vous tous

  2. #22
    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 : 47
    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,

    je ne comprends pas pourquoi vous utilisez 48 setters / getters.
    Il est possible de faire beaucoup plus simple :
    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
    class Contact
    {
        /**
         * @var array   [form's field name => error]
         */
        private $errors = [];
        /**
         * @var array   [:db_field => value]
         */
        private $values = [];
     
        /**
         * @return string
         */
        public function renderForm()
        {
            $tailles = '';
            $i       = 0;
            while (++$i < 49) {
                $tailles .= <<<html
    <p><label for="taille{$i}">TAILLE {$i}: </label><input type="text" name="taille{$i}" id="taille{$i}"></p>
    html;
            }
     
            return <<<html
    <form action="create.php" method="post" enctype="multipart/form-data">
        <h1> INSERER UN CONTACT </h1>
        {$tailles}
        <input type="submit" name="envoyer" value="ENVOYER" class="btn_submit">
    </form>
    html;
        }
     
        /**
         * @return bool
         */
        public function validate()
        {
            $this->errors = [];
            $i = 0;
     
            while (++$i < 49) {
                $name  = 'taille'.$i;
                if ( ! isset($_POST[$name])) {
                    $this->errors[$name] = 'Non renseigné';
                } elseif (( ! ctype_digit($_POST[$name])) || (strlen($_POST[$name]) !== 3)) {
                    $this->errors[$name] = 'Taille invalide';
                } else {
                    $this->values[":$name"] = $_POST[$name];  // ici on prépare les données pour la base de données
                }
            }
     
            return empty($this->errors);
        }
     
        /**
         * @return bool
         */
        public function hasErrors()
        {
            return ! empty($this->errors);
        }
     
        /**
         * @return array
         */
        public function values()
        {
            return $this->values;
        }
    }
    enfin si j'ai bien compris la problématique.

  3. #23
    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 : 47
    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
    Il est aussi tout à fait possible d'utiliser les fonctions magiques de PHP __set() et __get()
    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
    class Contact
    {
        private $tailles = [];
     
        public function __set($prop, $value)
        {
            if (substr($prop, 0, 6) === 'taille') {
                $i = substr($prop, 6);
                if ($i > 0 && $i < 49 && ctype_digit("$value") && (strlen($value) === 3)) {
                    $this->tailles[$prop] = $value;
                }
            }
        }
     
        public function __get($prop)
        {
            if (substr($prop, 0, 6) === 'taille') {
                $i = substr($prop, 6);
                if ($i > 0 && $i < 49) {
                    return isset($this->tailles[$prop]) ? $this->tailles[$prop] : false;
                }
            }
        }
    }
     
    $c = new Contact();
    $c->taille25 = '145';
     
    $t25 = $c->taille25;

  4. #24
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    j'ai un formulaire qui comprends 3 tableaux à 2 dimensions

    tableau 1 : anthropometrie

    date1 taille poids envergure pointure....
    date2
    date3
    date4
    date5
    date6
    ....

    tableau 2 : traumatologie

    date1 diag medecin proto metho....
    date2
    date3
    date4
    date5
    date6
    ....

    tableau 3 : parcours

    date1 ass niv struct camp....
    date2
    date3
    date4
    date5
    date6
    ....

    + tous les autres champs de mon formulaire du contact.....

    je dois bien insérer mes données avec des setters dans ma base de données en POO ?
    je crois savoir qu'il y a aussi l'hydratation .....mais les setters sont bien indispensables

  5. #25
    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 : 47
    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, comment as-tu organisé tes classes ?
    Pour l'hydratation, il n'est pas obligatoire de se servir de setter/getter, tu peux aussi utiliser un tableau (ce qui dans ton cas devrait te simplifier grandement la vie)

  6. #26
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Je n'ai jamais réalisé d'hydratation..... et j'ai toujours utilisé des getters et setters ...mais compte tenu de mon projet (nombre de champs) je me suis dit qu'il y avait certainement mieux que de faire un setter par champ.
    Au moins factoriser des champs de type identique...mais avant de me lancer je continue à essayer de comprendre.....

    je vous présente en version allégée les 2 classes que j'utilise entre autre

    une class Contact dans laquelle je tente de factoriser quelques contrôles et champs

    une class ContactManager (qui reprend le CRUD traditionnel + une fonction de recherche multicritères.

    Formulaire

    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
     
    <!DOCTYPE html>
    <html>
    <head>
    	<title>  CONTACT </title>
    	<meta charset="utf-8">
    </head>
     
    <body class="body">
     
    	<form action="create.php" method="post" enctype="multipart/form-data">
     
    				<h1> INSERER UN CONTACT </h1>
     
    				<p> <label for="taille">TAILLE : </label>  <input type="text" name="taille" id="taille"></p>
    				<p> <label for="taille2">TAILLE2 : </label>  <input type="text" name="taille2" id="taille2"></p>
    				<p> <label for="taille3">TAILLE3 : </label>  <input type="text" name="taille3" id="taille3"></p>
     
    				<p> <label for="nom">NOM : </label>  <input type="text" name="nom" id="nom"></p>
    				<p> <label for="prenom">PRENOM : </label>  <input type="text" name="prenom" id="prenom"></p>
    				<p> <label for="ville">VILLE : </label>  <input type="text" name="ville" id="ville"></p>
     
    				<p> <label for="pays">pays : </label>  <input type="text" name="pays" id="pays"></p>
     
    				<input type="submit" name="envoyer" value="ENVOYER" class="btn_submit">
    	</form>	
     
    </body>
    </html>

    Create.php

    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
     
    <?php
     
     
     
    require_once 'Contact.php';
    require_once 'ContactManag.php';
     
    $contact = new Contact();
    $contact->setTaille($_POST["taille"]);
    $contact->setTaille2($_POST["taille2"]);
    $contact->setTaille3($_POST["taille3"]);
    $contact->setNom($_POST["nom"]);
    $contact->setPrenom($_POST["prenom"]);
    $contact->setVille($_POST["ville"]);
    $contact->setPays($_POST["pays"]);
     
     
    echo $contact->getTaille()."<br/>"; 
    echo $contact->getTaille2()."<br/>"; 
    echo $contact->getTaille3()."<br/>";
    echo $contact->getNom()."<br/>"; 
    echo $contact->getPrenom()."<br/>"; 
    echo $contact->getVille()."<br/>";
    echo $contact->getPays()."<br/>";
     
    var_dump($contact); 
     
    $message = null; 
     
    if (is_null($message))
    {
    	$contactManager = new ContactManager();
    	$saveok_idrecup = $contactManager->save($contact); 
     
    	if($saveok_idrecup) 
    	{
    		$message = 'Les données ont été enregistrées';
    	}
    	else
    	{
    		$message = 'erreur pendant le traitement'; 
    	}
    }
     
    ?>
     
     
    <!DOCTYPE html>
    <html lang='fr'>
    <head>
    	<meta charset="utf-8">
    	<title> AJOUT D'UN CONTACT </title>
    </head>
     
    <body>
    	<h1> INSERTION D'UN CONTACT</h1>
     
    <P><?= $message ?></P>
     
    </body>
     
    </html>

    Contact (modifié en fonction des retours que j'ai compris)- nb : je ne fais apparaître que quelques champs pour tester

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
     
     
    <?php
     
    class Contact   (allégé)
    {
     /*
     *@var integer   $id  id du contact
     * autoincrémentation de la base de données 
     */
     private $id;
     
     /*
     *@var integer   $taille                taille  du contact
     */ 
     private $taille;
     
     /*
     *@var integer   $taille2                taille2  du contact
     */ 
     private $taille2;
     
     /*
     *@var integer   $taille3                taille3  du contact
     */ 
     private $taille3;
     
     /*
     *@var string   $nom                     nom  du contact
     */ 
     private $nom;
     
     /*
     *@var string   $prenom                 prenom  du contact
     */ 
     private $prenom;
     
     /*
     *@var string   $ville                  ville  du contact
     */ 
     private $ville;
     
     /*
     *@var string   $pays                  pays  du contact
     */ 
     private $pays;
     
     
     // GETTERS
     
     public function getId() {
      return $this->id;
     }
     
     public function getTaille() {
      return $this->taille;
     }
     
     public function getTaille2() {
      return $this->taille2;
     }
     
     public function getTaille3() {
      return $this->taille3;
     }
     
     
     public function getNom() {
      return $this->nom;
     }
     
     public function getPrenom() {
      return $this->prenom;
     }
     
     public function getVille() {
      return $this->ville;
     }
     
      public function getPays() {
      return $this->pays;
     }
     
     
     
     // SETTERS - CHAMPS OBLIGATOIRES
     private function commonSetter($regexp,$type,$value)
     {
       if(!empty($value)) 
       {
        $value = strtoupper($value); 
        if (!filter_var($value, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regexp))) !== false ) 
        {
         echo "le format de votre $type $value est incorrect ! <br>";
         $this->dataOk = false;
         return $this->dataOk;
        } 
       } 
       else
       {
        echo "La saisie de votre $type est obligatoire <br>";
        $this->dataOk = false;
        return $this->dataOk;
       } 
       return $value; 
     }
     
     
      /* ------   TAILLE --------*/
     private function _3chiffres($taille)
     {
       return $this->commonSetter("/^[0-9]{3}$/","TAILLE",$taille);
     }
     
     public function setTaille($taille) 
     {
      $temp         = $this->_3chiffres($taille);
      $this->taille = $temp !== false ? $temp : "";
     }
     
     
     public function setTaille2($taille) 
     {
      $temp          = $this->_3chiffres($taille);
      $this->taille2 = $temp !== false ? $temp : "";
     }
     
     
     public function setTaille3($taille) 
     {
      $temp          = $this->_3chiffres($taille);
      $this->taille3 = $temp !== false ? $temp : "";
     } 
     
     
      /* ------   ALPHA--------*/
       private function _alpha($alpha)
       {
         return $this->commonSetter("/^[A-Z]{2,12}$/","ETAT CIVIL",$alpha);
       }
     
       public function setNom($alpha) 
       {
        $temp         = $this->_alpha($alpha);
        $this->nom = $temp !== false ? $temp : "";
       }
     
     
       public function setPrenom($alpha) 
       {
        $temp          = $this->_alpha($alpha);
        $this->prenom = $temp !== false ? $temp : "";
       }
     
     
       public function setVille($alpha) 
       {
        $temp          = $this->_alpha($alpha);
        $this->ville = $temp !== false ? $temp : "";
       } 
     
     
     
     // SETTERS - CHAMPS OPTION
     
     private function commonSetterOption($regexp,$type,$value)
     {
       if(!empty($value)) {
        $value = strtoupper($value); 
        if (!filter_var($value, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regexp))) !== false ) {
         echo "le format de votre $type $value est incorrect ! <br>";
         $this->dataOk = false;
         return $this->dataOk;
        } 
       } 
      return $value; 
     }
     
     
          /* ------   ALPHANUMERIQUE --------*/
     
       private function _alphanum($alphanumerique)
       {
         return $this->commonSetterOption("/^[a-zA-Z0-9]{2,12}$/","ALPHANUMERIQUE",$alphanumerique);
       }
     
       public function setPays($alphanumerique) 
       {
        $temp         = $this->_alphanum($alphanumerique);
        $this->pays = $temp !== false ? $temp : "";
       }
     
    }

    ContactManag.php (allégé)
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
     
    <?php
     
    require 'Connexion.php';
     
    class ContactManager 
    {
     
     
      public function __construct()
      {
        $this->bdd = (new Connexion())->getPDO();
      }
     
     
      private function create(Contact &$contact) {
     
        $stmt = $this->bdd->prepare('INSERT INTO table_taille (taille, taille2, taille3, nom, prenom, ville, pays) VALUES (:taille, :taille2, :taille3, :nom, :prenom, :ville, :pays)');
     
        $stmt->bindValue(':taille', $contact->getTaille(), PDO::PARAM_STR);
        $stmt->bindValue(':taille2', $contact->getTaille2(), PDO::PARAM_STR);
        $stmt->bindValue(':taille3', $contact->getTaille3(), PDO::PARAM_STR);
        $stmt->bindValue(':nom', $contact->getNom(), PDO::PARAM_STR);
        $stmt->bindValue(':prenom', $contact->getPrenom(), PDO::PARAM_STR);
        $stmt->bindValue(':ville', $contact->getVille(), PDO::PARAM_STR);
        $stmt->bindValue(':pays', $contact->getPays(), PDO::PARAM_STR);
     
        $executeIsOK = $stmt->execute();
     
        if(!$executeIsOK) {
            echo 'ERREUR stmt CREATE : '; 
            var_dump($stmt->errorInfo());  
            return false;
          } else {
            $id = $this->bdd->lastInsertId(); 
            $contact = $this->read($id); 
            return $id;
         }
      }
     
     
     public function read($id) {
        $stmt = $this->bdd->prepare('SELECT * FROM table_taille WHERE id = :id');
     
         $stmt->bindValue(':id',$id, PDO::PARAM_INT);
     
         $executeIsOK = $stmt->execute();  
     
          if($executeIsOK) {
            $contact = $stmt->fetchObject('Contact');  
     
              if($contact === false){
                return null; 
              } else {
                return $contact; 
              }
          } else {
            return false; 
          }
     
      }
     
     
      private function update(Contact $contact){
     
         $stmt = $this->bdd->prepare('UPDATE table_taille set taille=:taille, taille2=:taille2, taille3=:taille3  WHERE id=:id LIMIT 1'); 
     
         $stmt->bindValue(':taille', $contact->getTaille(), PDO::PARAM_STR);
         $stmt->bindValue(':taille2', $contact->getTaille2(), PDO::PARAM_STR);
         $stmt->bindValue(':taille3', $contact->getTaille3(), PDO::PARAM_STR);
         $stmt->bindValue(':nom', $contact->getNom(), PDO::PARAM_STR);
         $stmt->bindValue(':prenom', $contact->getPrenom(), PDO::PARAM_STR);
         $stmt->bindValue(':ville', $contact->getVille(), PDO::PARAM_STR);
         $stmt->bindValue(':pays', $contact->getPays(), PDO::PARAM_STR);
     
          $res = $stmt->execute();
     
          if ($res){
            return $contact->getId();
          } else {
            return false; 
          }
      }
     
     
      public function save(contact $contact){
          if(is_null($contact->getId())){
              return $this->create($contact);
            } else {
              return $this->update($contact);
            }
      }
     
     
    }

  7. #27
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Le tableau $_POST est superglobal. Il est donc licite et je dirais même conseillé de l’utiliser directement dans l’objet si d’une manière ou d’une autre les données que tu passes proviennent toujours de $_POST.
    Ce qui dans ton cas permettrait de te passer de tous ces set.... et d’alléger le code.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #28
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Désolé mais je suis novice comme vous pouvez le constater....j'avais lors de tous mes essais utiliser un setter par champ mais maintenant que je m'attaque à mon projet je me rends compte que je peux certainement faire mieux. Le terme de contrôle récursif est en effet inopportun

    En effet, tous mes données sont issues d'un formulaire et envoyées par $_POST et seront si elles sont validées par mes contrôles enregistrées dans une BDD.

    Je cherche à améliorer ma Class Contact et ContactManager (CRUD + save(create + update) + fonction recherche multicritères).

    J'ai utilisé les fonction CommonSetter.... pour factoriser mais je n'ai pas les compétences pour faire mieux.... je cherche des exemples mais rien sur les forums de ce type...

    je continue ...


    Mon formulaire comprend des champs classiques :

    type text : alphabétique
    type radio :
    type : select
    textaera
    et plusieurs tableaux.....

    J'ai également réussi (pas peu fier) à réaliser une class Upload Photo et faire des contrôles (type + poids) côté PHP.

  9. #29
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par bricoreur Voir le message
    Mon formulaire comprend des champs classiques :

    type text : alphabétique
    type radio :
    type : select
    textaera
    et plusieurs tableaux.....
    Soit dit en passant, j'ai cru lire sur tes premiers posts que tes tableaux en question pouvaient contenir jusqu'à 48 enregistrements (donc 48 tailleN, 48 poidsN, 48 envergureN...). Est-ce exact? Car je pense que ton formulaire est beaucoup trop lourdingue, et que tu devrais trouver une stratégie pour pouvoir récupérer les informations en plusieurs fois au lieu d'une; en d'autre termes je ne m'imagine pas un utilisateur devoir remplir une telle quantité d'informations sur une seule page. Peut-être faudrait-il séparer l'enregistrement du contact du reste, et une fois le contact enregistré, lui permettre de rentrer les données (là encore, peut-être en plusieurs fois).

    À propos des tableaux, tu as la possibilité de récupérer directement un array au lieu d'avoir des éléments de formulaires numérotés. Il suffit par exemple de produire un truc comme ça:
    Code html : 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
    <form method="post" action="tonscript.php">
    <table>
        <caption>données anthropométriques</caption>
        <thead><tr><th>Date</th><th>Taille</th><th>Poids</th><th>Taille(bl)</th><th>Envergure</th><th>Pointure</th></tr></thead>
        <tbody>
            <tr>
                <td><input type="date" min="1900-01-01" max="2018-09-15" name="records[0][date]"/></td>
                <td><input type="number" min="100" max="300" placeholder="de 100 à 300" name="records[0][taille]"/></td>
                <td><input type="number" min="20" max="400" placeholder="de 20 à 400" name="records[0][poids]"/></td>
                <td><input type="number" min="20" max="400" placeholder="de 20 à 400" name="records[0][taillebl]"/></td>
                <td><input type="number" min="80" max="300" placeholder="de 80 à 300" name="records[0][envergure]"/></td>
                <td><input type="number" min="15" max="60" placeholder="de 15 à 60" name="records[0][pointure]"/></td>
            </tr>
            <tr>
                <td><input type="date" min="1900-01-01" max="2018-09-15" name="records[1][date]"/></td>
                <td><input type="number" min="100" max="300" placeholder="de 100 à 300" name="records[1][taille]"/></td>
                <td><input type="number" min="20" max="400" placeholder="de 20 à 400" name="records[1][poids]"/></td>
                <td><input type="number" min="20" max="400" placeholder="de 20 à 400" name="records[1][taillebl]"/></td>
                <td><input type="number" min="80" max="300" placeholder="de 80 à 300" name="records[1][envergure]"/></td>
                <td><input type="number" min="15" max="60" placeholder="de 15 à 60" name="records[1][pointure]"/></td>
            </tr>
            ...
    D'aprés moi, il n'est pas utile de créer je ne sais combien d'ids dans la mesure où sous forme de tableau, tes champs input ne sont plus liés à des balises label.

    Aussi je pense que tu devrais enlever les données des tableaux, qui m'ont l'air de relevés effectués par ton contact, de ta classe Contact et créer une classe à part (voire deux, une classe pour un d'enregistrement et une classe qui serait un set d'enregistrements) pour t'en occuper (ces relevés ne me semblent pas stricto sensu des données de contact). De même au niveau de la base de données (une table de contact, une table relevés, une table qui fait la liaison entre les deux via des clefs étrangères.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #30
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Je vais tenter de vous présenter mon formulaire.
    Il comporte 3 onglets :
    - onglet1 : etat civil et sportif
    - onglet2 : suivi scolaire et formation
    - onglet3 : suivi anthropométrique et traumatologie

    dans l'onglet 2 :
    1 tableau formation :

    ligne 1 ANNEE CLUB CHAMPIONNAT SELECTION STRUCTURE

    ligne 2

    ... SOIT 10 * 5 champs

    ligne 10


    onglet 3 :
    1 tableau Anthropo

    ligne 1 TAILLE POIDS ENVERGURE POINTURE TBL

    ligne 2

    ... SOIT 10 * 5 champs

    ligne 10


    1 tableau Traumatologie

    même principe

    J'entends votre proposition ($_POST superglobal ou faire un array dans mon tableau) mais je ne sais pas faire et donc je ne suis pas sur d'y arriver.. J'aurai besoin de réafficher ce formulaire pour les UPDATE ou pour les recherches liées à mon formulaire de recherche multicritères....


    A ce jour, je vais rester sur la proposition de Badaze qui m'est accessible en partie...

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/03/2013, 09h30
  2. listage récursif php
    Par papaye0 dans le forum Langage
    Réponses: 3
    Dernier message: 23/02/2012, 23h27
  3. Contrôle formulaire: php ou javascript
    Par palaki dans le forum Langage
    Réponses: 5
    Dernier message: 18/09/2008, 17h35
  4. Gérer les accès à la BD : contrôle via php
    Par amarcil dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/04/2008, 21h12
  5. [PHP-JS] désactiver un contrôle type checkbox ?
    Par jérômeencrise dans le forum Langage
    Réponses: 4
    Dernier message: 25/07/2006, 11h01

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