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 :

Hydrater une classe depuis $_POST


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut Hydrater une classe depuis $_POST
    Bonjour,

    Je dois remplir une classe au départ d'un formulaire reçu par la méthode POST.
    Le formulaire de saisie est un tableau, ce qui implique que chaque élément de $_POST peut-être un tableau de longueur variable.

    J'aimerais que la fonction d'hydratation que je rédige soit générale, à savoir que si l'élément $_POST est un attribut de ma classe, cet attribut prenne la valeur de l'élément du tableau POST que je lis.

    Du coup, j'aurais :
    - un foreach qui parcourt tout $_POST
    - pour chaque clé trouvée, je la parcourt comme un tableau
    - je regarde si j'ai un attribut de classe portant le nom de la clé (précédé par _ )
    - si il existe, je lui assigne la valeur de l'élément en cours.

    Ce qui , en théorie, devrait donner un code qui ressemble à ceci :


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for ($i = 0; $i < $nbchats - 1; $i++) {
        foreach ($_POST as $key => $value) {
            if (isset($chat->_$key)) {
                $chat->_$key = $_POST[$key][(count($_POST[$key]) - $i)];
            }
        }
    }


    Evidemment... Cela ne fonctionne pas.

    Quelqu'un sait comment faire fonctionner cette idée ?

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Bonjour, j'ai un peu de mal avec votre raisonnement ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $chat->_$key = $_POST[$key][(count($_POST[$key]) - $i)];
    1 vous présuposez que $_POST[$key] soit un tableau
    2 vous presuposez que $_POST[$key][(count($_POST[$key]) - $i)] soit un tableau supérieur à la valeur de $i + 1 de votre boucle for et ceci de façon expotentielle ?

    Vous devriez regarder du côté des méthodes __get() et __set() des objets .

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut
    1 vous présuposez que $_POST[$key] soit un tableau

    => Oui, c'en est un car c'est moi qui construit le formulaire d'origine sous forme de tableau.


    2 vous presuposez que $_POST[$key][(count($_POST[$key]) - $i)] soit un tableau supérieur à la valeur de $i + 1 de votre boucle for et ceci de façon expotentielle ?

    ==> $i est une variable d'incrémentation dont la valeur maximale sera celle du tableau en sachant que l'entrée 0 du tableau ne devra pas être utilisée (à cet endroit), soit une boucle for de 1 a count()
    Dans un tableau de 4 éléments , je ne dois donc exploiter que les 3 dernières valeurs.
    $i prendra les valeurs 1,2,et 3
    La lecture se fera sur les éléments du tableau 3,2 et 1.

    Je vais me plonger sur __set() et __get() , merci.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Citation Envoyé par Louprouge Voir le message
    1 vous présuposez que $_POST[$key]

    ==> $i est une variable d'incrémentation dont la valeur maximale sera celle du tableau en sachant que l'entrée 0 du tableau ne devra pas être utilisée (à cet endroit), soit une boucle for de 1 a count()
    Dans un tableau de 4 éléments , je ne dois donc exploiter que les 3 dernières valeurs.
    $i prendra les valeurs 1,2,et 3
    La lecture se fera sur les éléments du tableau 3,2 et 1.
    Pas d'accord, vous compter sur $_POST[$key] , cela veux dire que dans votre formulaire vous n'avez que des selects ? et pas un seul input ?

    Le plus facile serait de faire un dump de $_POST, pour voir ce que vous voulez faire

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Pour qu'une variable dans $_POST contienne un tableau, il faut soit que ce soit nommé ainsi dans le formulaire. Par exemple <input name="le_champ[1]" value="42"/>, c'est bien le cas ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 348
    Billets dans le blog
    17
    Par défaut
    Comme MaitrePylos et Celira j'ai un doute sur le raisonnement.

    D'un point de vue syntaxe il y a un problème ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($chat->_$key)) {
    Pour accéder à une propriété variable il faudrait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($chat->{'_' . $key})) { ...
    À noter qu'il existe property_exists() http://php.net/property-exists qui présente un avantage sur isset() :

    Note:
    property_exists() retourne TRUE même si la propriété a une valeur NULL, contrairement à la fonction isset().

Discussions similaires

  1. STL list : acceder aux enfant d'une class depuis un liste
    Par poussinphp dans le forum SL & STL
    Réponses: 6
    Dernier message: 29/04/2007, 17h21
  2. Réponses: 5
    Dernier message: 23/04/2007, 16h31
  3. Lancer une class depuis une methode
    Par Bulscope dans le forum Langage
    Réponses: 2
    Dernier message: 31/12/2006, 10h23
  4. [AS2] Atteindre attribut d'une classe depuis une fonction interne a la classe
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/04/2006, 21h03
  5. Réponses: 3
    Dernier message: 12/10/2005, 09h23

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