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 :

Objet et récupération de champs


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 72
    Points : 57
    Points
    57
    Par défaut Objet et récupération de champs
    Bonjour,
    je commence seulement à m'intéresser à la poo et je dois dire que je suis depuis quelques jours dans une impasse.
    Je ne dois surement pas tout comprendre ou alors, je bloque sur un truc que je n'ai pas intégré...
    En ce moment, l'idée est de faire une requête dans une DB, de récupérer les résultats dans un objet et de pouvoir, bien sur, utiliser ces résultats plus tard dans le code.

    J'utilise pour ce faire un fichier Specialite.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
    <?php
    class Specialite 
    	{   
        private $id = Null;    
        private $libelle = Null; 
     
    	function assign($row) {
    	if (isset($row['id_specialite']))
        {
    		$this->setIdSpecialite($row['id_specialite']); 
    	}
    	if (isset($row['libelle']))
        {
    		$this->setLibelle($row['libelle']); 
    	}
    	}
     
        function getIdSpecialite() {
            return $this -> id;
        }
     
        function setIdSpecialite($id) {
            $this -> id = $id;
        }
     
        function getLibelle() {
            return $this -> libelle;
        }
     
        function setLibelle($libelle) {
            $this -> libelle = $libelle;
        }
    }
    ?>
    Un autre fichier SpecialiteDAO.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
    <?php
    class SpecialiteDAO {
        /**
         * Recuperation de la liste des specialite
         * @return la liste des Specialite
         */
        function getListeSpecialites() {
    			try
    			{
    			$bdd = new PDO('mysql:host=localhost;dbname=xxxxxxx', 'root', 'xxxxxxxxx');
    			}
    			catch (Exception $e)
    			{
            	die('Erreur : ' . $e->getMessage());
    			}
     
    			$q = "SELECT * FROM specialite";
                $q_result = $bdd -> query($q);
    			if (!$q_result) die (" ECHEC : " . mysql_error());
     
    			//Traitement			
    			$result = Null;
    			$i = 0;
     
    			//Traitement
    			while ($q_row = $q_result -> fetch(PDO::FETCH_ASSOC)) {	
     
    								$result[$i] = new Specialite();
    								$result[$i] -> assign($q_row);
    								$i++;
    							}
    			//Nettoyage
    			$q_result -> closeCursor(); // Termine le traitement de la requête;		
             	return (object)$result; 
     	}    
    }
    ?>
    Et enfin la page d'affichage :
    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
     
    <?php
    // Recuperation de la liste des specialites :
    $SpecialiteDAO = new SpecialiteDAO();
    $spec = $SpecialiteDAO -> getListeSpecialites();
    $speMAX = ????? //Je ne sais comment récupérer le nombre d'objets retournés :(
    //var_dump($spec);
    ?>
    <select id="specialite">
                    <option id_spec="0" selected>Indifférent</option>                
                    <?php 
    				$i=0;
    				for ($i=0; $i<=$speMAX; $i++) {                    
                    ?>
                    <option id_spec="<?php echo $spec -> getIdSpecialite(); ?>"><?php echo $spec -> getLibelle(); ?></option>
                    <?php } ?>
                </select>
    Le var_dump commenté me retourne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object(stdClass)#13 (9) { [0]=> object(Specialite)#4 (2) { ["id:private"]=> string(1) "1" ["libelle:private"]=> string(11) "Cardiologue" } [1]=> object(Specialite)#5 (2) { ["id:private"]=> string(1) "2" ["libelle:private"]=> string(8) "Chir. CV" } [2]=> object(Specialite)#6 (2) { ["id:private"]=> string(1) "3" ["libelle:private"]=> string(14) "Chir digestive" } [3]=> object(Specialite)#7 (2) { ["id:private"]=> string(1) "4" ["libelle:private"]=> string(11) "Generaliste" } [4]=> object(Specialite)#8 (2) { ["id:private"]=> string(1) "5" ["libelle:private"]=> string(11) "Gynecologue" } [5]=> object(Specialite)#9 (2) { ["id:private"]=> string(1) "6" ["libelle:private"]=> string(12) "Orthopediste" } [6]=> object(Specialite)#10 (2) { ["id:private"]=> string(1) "7" ["libelle:private"]=> string(11) "Pneumologue" } [7]=> object(Specialite)#11 (2) { ["id:private"]=> string(1) "8" ["libelle:private"]=> string(10) "Radiologue" } [8]=> object(Specialite)#12 (2) { ["id:private"]=> string(1) "9" ["libelle:private"]=> string(12) "Rhumatologue" } }
    J'ai tous mes éléments.

    Plusieurs choses donc :
    je ne sais comment récupérer la valeur de ma variable $specMAX censée me faire la sortie de boucle.
    Pire, je ne sais comment afficher les valeurs id ou libelle de mon objet.

    Si une âme charitable pouvait éclairer ma lanterne et m'indiquer mes erreurs.
    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Personnellement, je ne créerais pas un objet pour chaque spécialité.

    Pourquoi ne pas créer un seul objet qui contient toutes tes spécialités ? Tu pourrais avoir une méthode qui récupère tes lignes pour former un seul tableau unique. Ainsi ton $speMAX serait juste un count($ton_tableau de l'objet).

    Sinon, pour pas tout modifier ton code, tu peux créer une classe qui hérite de Spécialité (pour garder tes fonctions de bases si tu veux utiliser des méthodes dans la classe héritée) qui serait un objet qui te permet de retourner tous tes objets Spécialités du genre :
    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
    class SpecialiteGlobal extends Specialite
    {
    	public $tab_objets_speciailite[];
     
    	function AddSpecialite($Specialite)
    	{
    		$this->tab_objets_speciailite = $Specialite; // Tu ajoutes chaque objet dans ton tableau
    	}
     
    	function AllSpecialite()
    	{
    		return $this->tab_objets_speciailite; // Tu retourne ton objet qui contient toutes tes spécialités
    	}
     
            function CountSpeciailites()
    	{
    		return count($this->tab_objets_speciailite);
    	}
    }
    Ensuite dans la boucle while, tu appelles cette classe à chaque itération pour ajouter la spécialité nouvellement créé.

    Le code n'est pas testé, c'est juste pour donner une idée.
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 72
    Points : 57
    Points
    57
    Par défaut
    Le problème initial est que je dois "adapter" un programme initialement codé en java pour le basculer en php, plus facilement "compréhensible" par les personnes qui vont en assurer la maintenance ultérieure.

    En java, ça donnait ça au niveau de la page d'affichage :

    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
    <%
    /*
     * GESTIONCORRESPONDANT.php
     *
     * Page de recherche / modification / suppression des correspondants
     *
     * VARIABLES RECUES : NEANT
     * VARIABLES ENVOYEES :
     *
     * APPELE PAR : administration.php
     * RENVOI VERS : NEANT
     *
     * AFFICHE :
     * 
     */
     
    // Recuperation de la liste des specialites des correspondants
    SpecialiteDAO sdao = new SpecialiteDAO();sdao.init();
    List spec = sdao.getListeSpecialites();
    Iterator specIt = spec.iterator();
    Specialite s = null;
    %>
    <li>
                <div class="fleche_stat"></div>
                <label>Spécialité : </label>
                <select id="specialite">
                    <option id_spec="0" selected>Indifférent</option>
                    <% while (specIt.hasNext()) {
                        s = (Specialite) specIt.next();
                    %>
                    <option id_spec="<%=s.getIdSpecialite()%>"><%=s.getLibelle()%></option>
                    <% }%>
                </select>
            </li>
    Pour les fichiers de classe, les adaptations ne posent pas de pb.
    Là, c'est l'appel de l'iterator que je n'arrive pas à faire "migrer" vers php.
    C'est apparemment si simple en java (3 lignes de codes) mais je ne "sens" pas l'équivalence et j'avoue qu'après plusieurs jours dessus, je ne dois plus être vraiment apte à voir quoi que ce soit...

    En tout cas, merci pour la piste et je vais voir ce que je peux en tirer

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Citation Envoyé par ksper92 Voir le message
    Le problème initial est que je dois "adapter" un programme initialement codé en java pour le basculer en php, plus facilement "compréhensible" par les personnes qui vont en assurer la maintenance ultérieure.

    En java, ça donnait ça au niveau de la page d'affichage :

    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
    <%
    /*
     * GESTIONCORRESPONDANT.php
     *
     * Page de recherche / modification / suppression des correspondants
     *
     * VARIABLES RECUES : NEANT
     * VARIABLES ENVOYEES :
     *
     * APPELE PAR : administration.php
     * RENVOI VERS : NEANT
     *
     * AFFICHE :
     * 
     */
     
    // Recuperation de la liste des specialites des correspondants
    SpecialiteDAO sdao = new SpecialiteDAO();sdao.init();
    List spec = sdao.getListeSpecialites();
    Iterator specIt = spec.iterator();
    Specialite s = null;
    %>
    <li>
                <div class="fleche_stat"></div>
                <label>Spécialité : </label>
                <select id="specialite">
                    <option id_spec="0" selected>Indifférent</option>
                    <% while (specIt.hasNext()) {
                        s = (Specialite) specIt.next();
                    %>
                    <option id_spec="<%=s.getIdSpecialite()%>"><%=s.getLibelle()%></option>
                    <% }%>
                </select>
            </li>
    Pour les fichiers de classe, les adaptations ne posent pas de pb.
    Là, c'est l'appel de l'iterator que je n'arrive pas à faire "migrer" vers php.
    C'est apparemment si simple en java (3 lignes de codes) mais je ne "sens" pas l'équivalence et j'avoue qu'après plusieurs jours dessus, je ne dois plus être vraiment apte à voir quoi que ce soit...

    En tout cas, merci pour la piste et je vais voir ce que je peux en tirer
    Je suis pas pro Java, mais si je comprend bien, tu as une liste de spécialité dans 'spec'.

    Iterator specIt doit être une sorte de curseur sur la liste de spécialité (.iterator est une propriété de list) pour pouvoir accéder à chaque élément de list.

    Ensuite ta boucle while parcours ton itération en appelant la spécialité suivante à chaque boucle (.hasNext) et affecte la Specialite s à chaque boucle.

    Donc ici, on utile le même objet spécialité, on n'en créé pas un à chaque fois.

    En PHP tu peux très bien utiliser la même chose :
    - Un array d'objet spécialité (Ta classe Specialite doit avoir une méthode qui te retourne un tableau de plusieurs objets)
    - Déclaration d'un seul objet Specialite
    - Une boucle sur ton array (for...sizeof($tableau))
    - Affectation de ton objet dans la boucle
    - Affichage dans ton select

    Les étapes sont les mêmes, sauf que tu n'auras pas besoin des fonctions .hasNext .. iterator vu qu'on peut facilement boucler sur un tableau en PHP.
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 72
    Points : 57
    Points
    57
    Par défaut
    Merci Bob, c'est effectivement plus clair dans mon esprit.
    Je vais donc m'orienter sur cela plutôt car cela semble bien plus facile.
    Merci

    Alors après plusieurs tests et modifications, mon code affiche désormais des choses dans le SELECT...mais il demeure une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    // Recuperation de la liste des specialites des correspondants
    $SpecialiteDAO = new SpecialiteDAO();
    $spec = $SpecialiteDAO -> getListeSpecialites();
    $nb_spec = count($spec);
    var_dump($spec);
    ?>
    Là, le var_dump($spec) m'affiche bien un array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    array(9) { 
    [0]=> object(Specialite)#4 (2) { ["id:private"]=> string(1) "1" ["libelle:private"]=> string(11) "Cardiologue" } 
    [1]=> object(Specialite)#5 (2) { ["id:private"]=> string(1) "2" ["libelle:private"]=> string(8) "Chir. CV" } 
    [2]=> object(Specialite)#6 (2) { ["id:private"]=> string(1) "3" ["libelle:private"]=> string(14) "Chir digestive" } 
    [3]=> object(Specialite)#7 (2) { ["id:private"]=> string(1) "4" ["libelle:private"]=> string(11) "Generaliste" } 
    [4]=> object(Specialite)#8 (2) { ["id:private"]=> string(1) "5" ["libelle:private"]=> string(11) "Gynecologue" } 
    [5]=> object(Specialite)#9 (2) { ["id:private"]=> string(1) "6" ["libelle:private"]=> string(12) "Orthopediste" } 
    [6]=> object(Specialite)#10 (2) { ["id:private"]=> string(1) "7" ["libelle:private"]=> string(11) "Pneumologue" } 
    [7]=> object(Specialite)#11 (2) { ["id:private"]=> string(1) "8" ["libelle:private"]=> string(10) "Radiologue" } 
    [8]=> object(Specialite)#12 (2) { ["id:private"]=> string(1) "9" ["libelle:private"]=> string(12) "Rhumatologue" } }
    et je sais donc récupérer la taille par le count($spec).

    Mais dans le SELECT un problème se pose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <label>Spécialité : </label>
                <select id="specialite">            
                    <option id_spec="0" selected>Indifférent</option>                
                    <?php 
    				$i=0;
    				for ($i=0; $i<=$nb_spec; $i++) {                    
                    ?>
                    <option id_spec="<?php echo $spec[$i] -> getIdSpecialite(); ?>"><?php echo $spec[$i] -> getLibelle(); ?></option>
                    <?php } ?>
                </select>
    J'ai bien ma liste déroulante à l'écran :

    Et malgré tout, le code de ma page s'arrête et je n'ai pas là fin à cause de ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error : Call to a member function getLibelle() on a non-object in.....
    Qu'y a-t-il encore que je ferai mal ?
    Merci de m'aider

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Points : 1 638
    Points
    1 638
    Par défaut
    Ca serait pas ta boucle qui ferait un tour de trop ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i=0; $i<=$nb_spec; $i++) {
    Ton $nb_spec doit ramener la valeur 9, cependant l'indice de tableau max est 8 vu qu'on commence à 0. De ce fait, il appel la fonction sur une ligne de tableau qui n'existe pas (objet non existant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i=0; $i<$nb_spec; $i++) {
    Règle N° 1 : Si tout va bien, ne touchez à rien.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 72
    Points : 57
    Points
    57
    Par défaut
    Oh le con !!!

    Quand je disais qu'à force de triturer dans tous les sens, on ne voyait plus l'essentiel

    Cela fonctionne beaucoup mieux bob633.

    Je te remercie du temps que tu as passé à ce problème.

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

Discussions similaires

  1. Récupération de champs de type 'Choice' via le Modèle objet client
    Par synapsis dans le forum Développement Sharepoint
    Réponses: 0
    Dernier message: 07/06/2010, 14h24
  2. Réponses: 16
    Dernier message: 17/06/2005, 15h51
  3. [JTextField] Récupération du champ
    Par cmoa59 dans le forum Composants
    Réponses: 3
    Dernier message: 22/04/2005, 10h24
  4. Réponses: 3
    Dernier message: 19/11/2004, 21h48
  5. Récupération des champs d'un form dans un autre
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 10
    Dernier message: 22/06/2004, 10h31

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