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. #1
    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 setter + contrôle récursif php
    Bonsoir,

    Ma question vous semblera certainement bête mais je ne vois pas comment factoriser un contrôle récursif sur plusieurs champs (type Array).

    Par exemple, si j'ai un tableau avec 48 champs qui ne peuvent avoir qu'un nombre de 3 chiffres...comment faire pour ne pas pas réécrire toujours le même setter

    Champ1
    Champ2
    champ3
    ...
    champ48

    qui ferait appel à un même setter avec un contrôle

    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
     
    	public function setTaille($taille)
    	{
    		if(!empty($taille)) 
    		{
    			if (filter_var($taille, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) 
    			{	
    				    $this->taille = $taille; 
    				    return $this;
    			}
    			else
    			{
    				echo "le format de votre taille " .$taille.  "  est incorrect ! <br>";
    			} 
    		} 
    		else
    		{
    			echo "La saisie de votre taille est obligatoire <br>";
    		}
    	}
    je suppose qu'il faut écrire une fonction avec un retour booléen mais je ne vois pas comment faire et comment envoyer la valeur de chaque champs si ce dernier est renseigné.

    j'ai cherché dans le moteur de recherche : contrôle récursif, factorisation contrôle, boucle contrôle .....mais je n'arrive pas à trouver ce que je cherche...

    j'espère avoir été clair...

  2. #2
    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
    Tu veux contrôler chaque poste du tableau et indiquer quels postes ne satisfont pas le contrôle ?
    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.

  3. #3
    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
    Oui

    J’aimerai vérifier si les 48 champs (tous du même type) sont bien remplis (ou vide) via un setter générique côté serveur.

    J’ai réalisé un contrôle en JavaScript mais j’ai bien compris qu’il fallait absolument contrôler côté serveur

    J’ai également des champs uniquement alphabétiques ...

  4. #4
    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
    Et si les postes 4, 30, 51 par exemple ne vont pas. Que veux tu que la fonction retourne ?

    Après, pourquoi du récursif et non pas un bon vieux foreach ?
    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.

  5. #5
    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
    Si le champ est bien rempli alors j’entegistre dans ma BDD sinon message erreur -
    Comment faire une boucle sur plusieurs champ ?
    Les données sont issues d’un formulaire

  6. #6
    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
    Il faudrait que tu fasses un exemple car ta fonction sans son contexte ça n'aide pas à comprendre le problème et le besoin.
    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.

  7. #7
    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
    Voici un exemple simplifié

    Un tableau allégé qui reprend des mesures anthropométriques (j'ai enlevé le champs des dates et css)

    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
     
    <table class="table_anthropo">
     
    	<tr>
    		<td>Taille</td>	
    		<td>Poids</td>
    		<td>Taille(bl)</td>
    		<td>Enverg.</td>
    		<td>Pointure</td>
    	</tr>
     
    	<tr>
    		<td><input  type="number" id="taille1" name="taille1"></td>
    		<td><input  type="number" id="poids1" name="poids1"></td>
    		<td><input  type="number" id="tbl1" name="tbl1"></td>
    		<td><input  type="number" id="env1" name="env1"></td>
    		<td><input  type="number" id="point1" name="point1"></td>
    	</tr>
     
    	<tr>
     
    		<td><input  type="number" id="taille2" name="taille2"></td>
    		<td><input  type="number" id="poids2" name="poids2"></td>
    		<td><input  type="number" id="tbl2" name="tbl2"></td>
    		<td><input  type="number" id="env2" name="env2"></td>
    		<td><input  type="number" id="point2" name="point2"></td>
    	</tr>
     
    	<tr>
    		<td><input  type="number" id="taille3" name="taille3"></td>
    		<td><input  type="number" id="poids3" name="poids3"></td>
    		<td><input  type="number" id="tbl3" name="tbl3"></td>
    		<td><input  type="number" id="env3" name="env3"></td>
    		<td><input  type="number" id="point3" name="point3"></td>
    	</tr>
     
    	<tr>
    		<td><input  type="number" id="taille4" name="taille4"></td>
    		<td><input  type="number" id="poids4" name="poids4"></td>
    		<td><input  type="number" id="tbl4" name="tbl4"></td>
    		<td><input  type="number" id="env4" name="env4"></td>
    		<td><input  type="number" id="point4" name="point4"></td>
    	</tr>
     
    	<tr>
    		<td><input  type="number" id="taille5" name="taille5"></td>
    		<td><input  type="number" id="poids5" name="poids5"></td>
    		<td><input  type="number" id="tbl5" name="tbl5"></td>
    		<td><input  type="number" id="env5" name="env5"></td>
    		<td><input  type="number" id="point5" name="point5"></td>
    	</tr>
     
    	<tr>
    		<td><input  type="number" id="taille6" name="taille6"></td>
    		<td><input  type="number" id="poids6" name="poids6"></td>
    		<td><input  type="number" id="tbl6" name="tbl6"></td>
    		 <td><input  type="number" id="env6" name="env6"></td>
    		<td><input  type="number" id="point6" name="point6"></td>
    	</tr>
     
    </table>
    j'aimerai vérifié côté PHP la saisie des champs ( si champ renseigné alors on accepte que nombre à 3 chiffres) et j'attribue un setter. Mais je pense qu'il y a mieux que faire un setter par champ surtout du même type ....

    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
     
     
    class Contact   
     
    {
    ..........
    	/*
    	*@var integer     $taille1   taille du contact à la date 1
    	*/
    	private $taille1
     
     
    	/*
    	*@var integer     $taille2   taille du contact à la date 2
    	*/
    	private $taille2
     
    ......
     
     
    public function setTaille($taille1) 
    	{
    		if(!empty($taille1)) 
    		{
    			if (filter_var($taille1, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) 
    			{	
    				    $this->taille = $taille1; 
    				    return $this;
    			}
    			else
    			{
    				echo "le format de votre taille " .$taille1.  "  est incorrect ! <br>";
    			} 
    		} 
    		else
    		{
    			echo "La saisie de votre taille est obligatoire <br>";
    		}
    	}
     
    public function setTaille2($taille2) 
    	{
    		if(!empty($taille2)) 
    		{
    			if (filter_var($taille2, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) 
    			{	
    				    $this->taille2 = $taille2; 
    				    return $this;
    			}
    			else
    			{
    				echo "le format de votre taille " .$taille2.  "  est incorrect ! <br>";
    			} 
    		} 
    		else
    		{
    			echo "La saisie de votre taille est obligatoire <br>";
    		}
    	}
     
    .........



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Par exemple : création d'un contact .....
     
    $contact = new Contact();
    $contact->setNom($_POST['nom'])  
    			->setSexe($_POST['sexe']) 
    			->setSecteur($_POST['secteur'])
    			->setCd($_POST['cd']) 
    			->setCategorie($_POST['categorie'])
    ......
    			->setTaille1($_POST['taille1']); 
                            ->setTaille2($_POST['taille2']); 
    ......
    j'ai plusieurs tableau avec 48 champs chacun ...il y a certainement mieux que le copier-coller

  8. #8
    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
    Déjà tu peux factoriser le code quand tu as deux données de même type.

    A propos des variables. Cela ne sert à rien de passer la variable $taille1 ou $taille2 dans tes fonctions setTaille ou setTaille2. En effet les paramètres d'une fonction ne valent qu'à l'intérieur de la fonction. De ce fait $taille dans setTaille et $taille dans setTaille2 ne sont pas les mêmes variables. On dit que ce sont des variables locales.

    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
    private function _taille($taille)
    {
      if(!empty($taille)) 
      {
       if (!filter_var($taille, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) 
       {
        echo "le format de votre taille " .$taille.  "  est incorrect ! <br>";
        return false;
       } 
      } 
      else
      {
       echo "La saisie de votre taille est obligatoire <br>";
       return false;
      } 
      return $taille;
    }
     
     
    public function setTaille($taille) 
    {
     $temp         = $this->_taille($taille);
     $this->taille = $temp !== false ? $temp : "";
    }
     
     
    public function setTaille2($taille) 
    {
     $temp          = $this->_taille($taille);
     $this->taille2 = $temp !== false ? $temp : "";
    }
    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.

  9. #9
    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
    Ensuite. Si tu veux faire un setter générique tu peux faire comme suit (mais je ne vois toujours pas le lien avec la récursivité).

    Bien entendu je n'ai pas testé ce code. C'est l'idée que je veux rendre.

    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
    private function commonSetter($regexp,$type,$value)
    {
      if(!empty($value)) 
      {
       if (!filter_var($value, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regexp))) !== false ) 
       {
        echo "le format de votre $type $value est incorrect ! <br>";
        return false;
       } 
      } 
      else
      {
       echo "La saisie de votre $type est obligatoire <br>";
       return false;
      } 
      return $value; 
    }
     
    private function _taille($taille)
    {
      return $this->commonSetter("/^[0-9]{3}$/","taille",$taille);
    }
     
     
    public function setTaille($taille) 
    {
     $temp         = $this->_taille($taille);
     $this->taille = $temp !== false ? $temp : "";
    }
     
     
    public function setTaille2($taille) 
    {
     $temp          = $this->_taille($taille);
     $this->taille2 = $temp !== false ? $temp : "";
    }
    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.

  10. #10
    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
    Et si on veut factoriser à l'extrême.

    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
     
    <?php
    private function _taille($taille)
    {
      $temp = $this->commonSetter("/^[0-9]{3}$/","taille",$taille);
      return $temp !== false ? $temp : "";
    }
     
     
    public function setTaille($taille) 
    {
     $this->taille = $this->_taille($taille);
    }
     
     
    public function setTaille2($taille) 
    {
     $this->taille2 = $this->_taille($taille);
    }

    Par contre je ne vois pas dans ce que tu as posté de propagation des erreurs. En effet s'agissant de contrôler un ensemble de données et donc, je suppose, de n'enregistrer les données que s'il n'y a aucune erreur, je partirais d'un autre principe.
    On contrôle toutes les données et si et seulement si on n'a aucune erreur on les enregistre.

    Ce n'est qu'une suggestion car il y a d'autres méthodes. Tu instancies une variable de classe dans le constructor à true => $dataOk et tu la mets à false dès qu'il y a une condition d'erreur.

    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
     
    private function commonSetter($regexp,$type,$value)
    {
      if(!empty($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; 
    }
    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.

  11. #11
    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
    Merci pour vos retours..je ne suis pas sur de tout bien comprendre...je vais bien lire vos conseils...je vais partir sur votre constat
    "Ce n'est qu'une suggestion car il y a d'autres méthodes. Tu instancies une variable de classe dans le constructor à true => $dataOk et tu la mets à false dès qu'il y a une condition d'erreur. "

    C'est bien ce que je cherche

    je me mets au travail de suite

  12. #12
    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
    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
     
    <?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/>";
     }
    }
    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.

  13. #13
    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
    Bonsoir ,

    je ne sais pas si cela vient de moi qui ne sait pas utiliser vos conseils mais cela ne marche pas...setTaille est vide

    je vous mets mon code alléger pour exemple

    Form.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
     
    <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>
     
    				<input type="submit" name="envoyer" value="ENVOYER" class="btn_submit">
    	</form>	
     
    </body>
    </html>
    Class Contact -> je n'ai pas réussi à faire fonctionner vos codes - apparemment cela vient des setters
    Avec un copier-coller des setters, tout fonctionne

    Contact.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
    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
     
    <?php
     
    class Contact   
     
    {
     
    	/*
    	*@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;
     
     
    	// 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;
    	}
     
     
     
    	// SETTERS
     
    	public function setTaille($taille) {
     
    		if(!empty($taille)) {
    			if (filter_var($taille, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) {	
    				    $this->taille = $taille; 
    				    return $this;
    			} else {
    				echo "le format de votre taille " .$taille.  "  est incorrect ! <br>";
    			} 
    		} 
    		else {
    			echo "La saisie de votre taille est obligatoire <br>";
    		}
    	}
     
    	public function setTaille2($taille) {
     
    		if(!empty($taille)) {
    			if (filter_var($taille, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) {	
    				    $this->taille2 = $taille; 
    				    return $this;
    			} else {
    				echo "le format de votre taille " .$taille.  "  est incorrect ! <br>";
    			} 
    		} 
    		else {
    			echo "La saisie de votre taille est obligatoire <br>";
    		}
    	}
     
    	public function setTaille3($taille) {
     
    		if(!empty($taille)) {
    			if (filter_var($taille, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/^[0-9]{3}$/"))) !== false ) {	
    				    $this->taille3 = $taille; 
    				    return $this;
    			} else {
    				echo "le format de votre taille " .$taille.  "  est incorrect ! <br>";
    			} 
    		} 
    		else {
    			echo "La saisie de votre taille est obligatoire <br>";
    		}
    	}
     
     
     
     
    }
     
     
    ?>

    ContactManag.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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    <?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) VALUES (:taille, :taille2, :taille3)');
     
        $stmt->bindValue(':taille', $contact->getTaille(), PDO::PARAM_STR);
        $stmt->bindValue(':taille2', $contact->getTaille2(), PDO::PARAM_STR);
        $stmt->bindValue(':taille3', $contact->getTaille3(), 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);
     
          $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);
            }
      }
     
     
    }

    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
     
    <?php
     
     
     
    require_once 'Contact.php';
    require_once 'ContactManag.php';
     
    $contact = new Contact();
    $contact->setTaille($_POST['taille'])
    		->setTaille2($_POST['taille2'])
    		->setTaille3($_POST['taille3']);
     
    var_dump($contact); 		
     
    $message = null; 
     
    if (is_null($message))
    {
    	$contactManager = new ContactManager();
    	$saveok_idrecup = $contactManager->save($contact); 
     
    	if($saveok_idrecup) 
    	{
    		$message = 'Les tailles sont ajouté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>

    je suis très interessé par votre dernier conseil mais je n'y arrive pas non plus ...mais il semble être le plus intéressant par rapport aux erreurs

  14. #14
    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é, je n'avais pas vu votre message suivant...je vais continuer tout de suite

    Vraiment merci beaucoup pour votre temps...

  15. #15
    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 viens de commencer à lire votre Class ....elle est me paraît très claire....et je pense avoir compris la logique...je vais la tester

  16. #16
    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
    Pour répondre au message #13

    Ca fonctionne bien.

    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
     
    <body class="body">
     
     <form action="test9471b.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>
     
        <input type="submit" name="envoyer" value="ENVOYER" class="btn_submit">
     </form> 
     
    </body>
    </html>

    test9471b.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    include('test9471.class.php');
    $contact = new Contact();
    $contact->setTaille($_POST["taille"]);
    $contact->setTaille2($_POST["taille2"]);
    $contact->setTaille3($_POST["taille3"]);
    echo $contact->getTaille()."<br/>"; 
    echo $contact->getTaille2()."<br/>"; 
    echo $contact->getTaille3()."<br/>";

    test9471.class.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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    <?php
     
    class Contact   
    {
     /*
     *@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;
     
     
     // 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;
     }
     
     // SETTERS
     private function commonSetter($regexp,$type,$value)
     {
       if(!empty($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; 
     }
     private function _taille($taille)
     {
       return $this->commonSetter("/^[0-9]{3}$/","taille",$taille);
     }
     
     public function setTaille($taille) 
     {
      $temp         = $this->_taille($taille);
      $this->taille = $temp !== false ? $temp : "";
     }
     public function setTaille2($taille) 
     {
      $temp          = $this->_taille($taille);
      $this->taille2 = $temp !== false ? $temp : "";
     }
     
     public function setTaille3($taille) 
     {
      $temp          = $this->_taille($taille);
      $this->taille3 = $temp !== false ? $temp : "";
     } 
     
     
    }

    Nom : Capture20180915_001.JPG
Affichages : 106
Taille : 25,0 Ko

    Nom : Capture20180915_002.JPG
Affichages : 119
Taille : 37,2 Ko
    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.

  17. #17
    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
    Tout fonctionne!!!!

    Vous êtes super sympa ....je vais prendre le temps de bien comprendre toutes vos propositions et essayer de me les approprier ...


    bon WE à vous.


    Bien cordialement

  18. #18
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 75
    Points : 190
    Points
    190
    Par défaut
    Bonjour,

    Dans ton exemple, la taille 13 est incorrecte mais 013 sera correct d'après ta regex, ainsi que 001 et 000.

  19. #19
    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
    Je sais. Mais le point important dans l’exemple n’est pas que le contrôle en lui même fonctionne mais que le système qui gère les contrôles si.
    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.

  20. #20
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 75
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par badaze Voir le message
    Je sais. Mais le point important dans l’exemple n’est pas que le contrôle en lui même fonctionne mais que le système qui gère les contrôles si.
    Désolé d'avoir signalé une erreur dans le code. Ça ne se reproduira plus, promis.

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