Utilisation d'instance de classe.

Utilisation d'instance de classe. - PHP - Programmation

Marsh Posté le 17-05-2007 à 12:26:47    

Bonjour,
 
Tout d'abord je vais vous expliquer ce que je cherche à faire :
    Je travaille actuellement sur la réalisation d'un questionnaire et je dois le faire en PHP. Ce qui me paraissait plus que logique c'est de le faire de façon objet. A savoir je crée une classe Question qui gère elle même tout ce qui est les requettes pour trouver dans la base de donnée son intitullé et les propositions de réponses a cette question. Cette classe doit également gérer elle même son affichage et enregistrer elle même la réponse de l'utlilisateur dans la base.
    Ainsi je créé également une classe Questionnaire qui va chercher dans la base de donnée toutes les question qui sont asscié a ce questionnaire, et ensuite il appellera les fonctions de la classe Question pour faire toutes les opérations que je désire (a savoir l'affichage, et l'enregistrement dans la base de donnée).
 
Donc j'ai déja pas mal avancé dans le code : j'ai déja presque fini mes classes Question et Questionnaire...

Code :
  1. <?php
  2. class Question {
  3. // intitulé de la question
  4. var $questionName;
  5. // tableau qui contient toutes les proposition de réponces
  6. var $anserArray;
  7. // Variable qui mémorise la réponce donnée
  8. var $anser;
  9. // Variable qui mémorise la chaine réponse complémentaire de l'utilisateur
  10. var $textAnser;
  11. // variable qui donne le type de question (0 : radio ; 1 checkbox )
  12. var $questionType;
  13. // variable qui mémorise l'identifiant de la question
  14. var $questionId;
  15. // variable qui conserve en mémoire la base de donnée
  16. var $dataBase;
  17. //Constructeur de la classe question
  18. //@param $questionId : l'id de la question que l'on souhaite proposer
  19. //@param $questionType : l'identifiant du type de question (0 : radio ; 1 checkbox, 2 champ de texte libre)
  20. //@param $dataBase : la base de donnée
  21. function Question($questionId, $dataBase) {
  22.  $this->anser = 0;
  23.  $this->questionId = $questionId;
  24.  $this->dataBase = $dataBase;
  25.  // On réalise la requette pour récupérer le texte de la question
  26.  $dataBase->select("texte" );
  27.  $dataBase->from("phpt_question" );
  28.  $dataBase->where("id = $questionId" );
  29.  // on covertit la réponse de la base en un array
  30.  $ar = mysql_fetch_assoc($dataBase->exec());
  31.  // on récupère la valeur du champ et on rentre la valeur du champ de texte de la question
  32.  foreach($ar as $value)
  33.   $this->questionName = $value;
  34.  // On réalise la requette pour récupérer le type de question
  35.  $dataBase->select("type" );
  36.  $dataBase->from("phpt_question" );
  37.  $dataBase->where("id = $questionId" );
  38.  // on covertit la réponse de la base en un array
  39.  $ar = mysql_fetch_assoc($dataBase->exec());
  40.  // on récupère la valeur du champ et on rentre la valeur du champ de texte de la question
  41.  foreach($ar as $value)
  42.   $this->questionType = intval($value);
  43.  // on cherche dans la base les réponses que l'on doit proposer
  44.  $dataBase->select("id_reponse" );
  45.  $dataBase->from("phpt_repquest" );
  46.  $dataBase->where("id_question = $questionId" );
  47.  // On lance la requette  
  48.  $tempResult = $dataBase->exec();
  49.  // on crée un tableau temporaire qui va mémoriser tous les identifiants des réponses possibles
  50.  $idResults = array();
  51.  // variable qui va compter le nombre de réponse déja entrée
  52.  $i = 0;
  53.  // Tant qu'il existe de nouvelle réponse
  54.  while($tempAnser = mysql_fetch_assoc($tempResult)) {
  55.   // On cherche l'identifiant dans le conteneur associatif et on le met dans notre array a l'indice i
  56.   foreach($tempAnser as $possibleAnser)
  57.    $idResults[$i++] = $possibleAnser;
  58.  }
  59.  // On cherche maintenant les champ de texte assotié aux identifiants que l'on a déterminé
  60.  $i = 0;
  61.  $this->questionArray = array();
  62.  // Pour chacuns des identifiants de question
  63.  foreach($idResults as $id) {
  64.   // On cherche la valeur sous forme de chaine de caractère de l'identifiant
  65.   $dataBase->select("texte" );
  66.   $dataBase->from("phpt_reponse" );
  67.   $dataBase->where("id=$id" );
  68.   // On lance la requette
  69.   $tempResult = $dataBase->exec();
  70.   // Tant qu'il existe une chaine de caractère
  71.   while($tempAnser = mysql_fetch_assoc($tempResult)) {
  72.    // On cherche la chaine de caractère dans le conteneur associatif et on le met dans notre array a l'indice i
  73.    foreach($tempAnser as $possibleAnser)
  74.     $this->anserArray[$i++] = $possibleAnser;
  75.   }
  76.  }
  77. }
  78. //Fonction qui gère l'affichage d'une question
  79. function display() {
  80.  // affichage de la question
  81.  echo($this->questionName);
  82.  ?> <br /> <?php
  83.  // affichage des boutons associé à chaque propositions
  84.  foreach($this->anserArray as $possibleAnser) {
  85.   // On affiche un bouton de type différent en fonction de la question,
  86.   // l'identifiant anserId et le nom de la proposition est obtenue dans questionArray
  87.   switch($this->questionType) {
  88.   // Si il sagit d'un questionnaire de type CheckBox
  89.   case 1:
  90.    ?>
  91.    <label><input type="checkbox" name=<?php echo($this->questionId); ?> /> <?php echo($possibleAnser) ?></label><br />
  92.    <?php
  93.    break;
  94.   // Si il sagit d'un questionnaire de tye Radio  
  95.   case 2:
  96.    ?>
  97.    <label><input type="radio" name=<?php echo($this->questionId); ?> /> <?php echo($possibleAnser) ?></label><br />
  98.    <?php
  99.    break;
  100.   // Si il sagit d'un simple champ de texte
  101.   case 3:
  102.    ?>
  103.    <label><textarea name="textAnser" rows="6" cols="50"></textarea><br />
  104.    <?php
  105.    return;
  106.   // si le type de questionnaire n'est pas reconnu on affiche un message d'erreur et on quitte  
  107.   default:
  108.    echo("Erreur le type de question est incorrect !!! " ); ?> <br /> <?php
  109.    return;
  110.   }
  111.  }
  112.  // On met un champ de texte pour que l'utisateur puisse expliquer son choix
  113.  ?>
  114.  <label><br /> Une remarque sur votre réponse ? (optionnel) <br /> <textarea name="textAnser"></textarea><br />
  115.  <?php
  116. }
  117. // Fonction qui retourne l'indice de la réponce donné par l'utilisateur
  118. function getAnser() {
  119.   return ($this->anser);
  120. }
  121. //Fonction qui retourne le texte complémentaire que l'utilisateur a éventuellement donné
  122. function getTextAnser() {
  123.  return ($this->textAnser);
  124. }
  125. // Fonction qui enregistre dans la base de donnée la réponse donnée a la question par l'utilisateur
  126. // @param playerId : l'identifiant du joueur qui a répondu a la question.
  127. function storeAnser($playerId) {
  128.  $this->dataBase->insert("phpt_result_joueur(id_joueur, id_question, id_reponse, texte)" );
  129.  $this->dataBase->values("$playerId, $questionId, $this->getAnser(), $this->getTextAnser()" );
  130.  $this->dataBase->exec();
  131. }
  132. }


 
Mon problème c'est que j'ai quelques difficultées pour réussir a récupérer ce que rentre l'utilisateur.  
car pour afficher une question je fait simplement ça :

Code :
  1. <?php
  2. include 'Questionphp';
  3. ?><form method="post" action="include/files/validFormulaire.php"><p><?php
  4. $instance = new Question(1, $db);
  5. $instance->display();
  6. ?>
  7. <input type="submit" />
  8. </p>


alors dans la page qui affiche la question je n'ai pas de problème. Mais quand je passe a l'autre page ValidFormulaire.php je n'arrive plus a créer une nouvelle instance de la classe Question... si je fait ça :

Code :
  1. <?php
  2. include 'Question.php';
  3. $instance = new Question(1, $db);
  4. $instance->display();
  5. ?>


il me sort qu'il que quand j'apelle la ligne $dataBase->select() dans le constructeur de ma classe question que $dataBase n'est pas un objet... pourtant je vois pas pourquoi cela lui pose problème puisque avant cela marchait bien... ($db est une variable globale qui désigne une instance de classe qui gère la base de donnée...).
 
Bon après il y en a qui vont me dire : pourquoi créer un autre objet ? Et bien en fait je n'arrive pas a le passer d'une page a l'autre... Normalement il suffirai d'appeller les méthodes serialize() et unserialize() pour pouvoir se les passer via le conteneur assotiatif $_POST mais je n'y arrive pas...
J'ai également essayé de passer par des variable de session... mais là aussi ça a pas l'air de passer... Donc je me suis finalement rabatut sur la recréation de mon objet.  
 
Donc en fait la question c'est : je vois pas pourquoi il ne veut plus considerer l'instance $db comme une instance d'objet dans la page suivante.
 
Voila je si vous aviez une idée ça m'intéresserai vu que ça fait bien une semaine que je suis sur ce problème...  
Merci :)
 
ps : désolé pour ce post si long... j'espère que certain aurront le courage de le lire pour m'aider... En tous cas merci à vous :)

Reply

Marsh Posté le 17-05-2007 à 12:26:47   

Reply

Marsh Posté le 17-05-2007 à 17:07:27    

Avec quelle version de PHP développe-tu ? Si c'est la version 4, beaucoup te diront d'abandonner. C'est trop "merdique" et je veux bien les croire.

 

Ensuite, pourquoi ne pas avoir créé une classe qui gère seulement la base de données (connexion, requête, etc...). Avec ta question tu peux hériter de cette classe et utiliser toutes (sous réserve de ne pas être en "private" ) les méthodes appropriées.

 

C'est comme ca que je fonctionne. Je ne prétend pas que c'est la meilleur méthode. Mais jusqu'à présent je n'ai pas à m'en plaindre :)

 

Dernière question : Est-ce que tu créé une instance $db à chaque changement de page ?


Message édité par AlphaZone le 17-05-2007 à 17:07:54
Reply

Marsh Posté le 18-05-2007 à 11:57:37    

Salut !
 
    Tout d'abord merci pour ta réponse :)
 
    Bon, pour ce qui est de la version de PHP que j'utilise et bien je t'avoue qu'en fait je sais pas trop... Car en fait j'ai découvert PHP (et HTML) il y juste quelques semaines. Avant j'ai surtout programmé en C++ ou Java (pour ce qui concerne les langages objets). Donc quand on m'a demandé de faire du PHP j'ai directement cherché à faire de l'objet comme j'en faisais d'habitude... Donc je suis passé sur le site du zéro, et quelques recherches google pour voir comment on faisait de l'objet en PHP et je me suis dit zou c'est partit :D
 
    Le problème avec l'organisation du code que tu me propose, c'est que ce que fait est sensé se greffer sur une base déjà existante qui s'appelle phpTournoi. L'idée c'est que l'on veut rajouter la possibilité de donner un questionnaire. Donc en fait toute la partie connection avec la base de donnée est déjà existante de même la sécurisation via un login. Donc en fait je ne peux pas toucher a la classe qui gère et non plus faire de l'héritage. car l'instance $db est déjà créé au moment où l'utilisateur s'identifie...  
 
Bon je pense que je vais devoir renoncer à l'objet même si c'est la solution que je trouvais la plus élégante pour faire ce genre de truc... Par ce que là, je vois pas ce que je peux faire...
 
Merci de ton aide :)

Reply

Marsh Posté le 18-05-2007 à 15:10:22    

Amonchakai a écrit :

Donc je suis passé sur le site du zéro, et quelques recherches google pour voir comment on faisait de l'objet en PHP et je me suis dit zou c'est partit :D)

 

T'as mal regardé. Si tu es en php5, ta syntaxe est obsolète.

 
Amonchakai a écrit :

Le problème avec l'organisation du code que tu me propose, c'est que ce que fait est sensé se greffer sur une base déjà existante qui s'appelle phpTournoi. L'idée c'est que l'on veut rajouter la possibilité de donner un questionnaire. Donc en fait toute la partie connection avec la base de donnée est déjà existante de même la sécurisation via un login. Donc en fait je ne peux pas toucher a la classe qui gère et non plus faire de l'héritage. car l'instance $db est déjà créé au moment où l'utilisateur s'identifie...

 

Il est initialisé où ton $db?

 

Pour ce qui est de renoncer à l'objet, je vois pas pourquoi...Alphazone n'a visiblement pas compris les reproches qu'il a lus/entendus sur l'objet en php 4. Ce n'est pas complet, il faut en connaitre les pièges, mais ça fonctionne.


Message édité par skeye le 18-05-2007 à 15:12:45

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-05-2007 à 15:17:38    

Quand à avoir une classe pour gérer la base de données je ne vois pas ce qui t'en empêche, même si je ne vois pas l'intérêt d'en faire hériter ta Question...une Question instanciera la classe gérant la base pour y accéder, c'est tout.


---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed