2010-05-23 5 views
3

J'ai une question à propos de PHP Class. J'essaie d'obtenir le résultat de Mysql via PHP. Je voudrais savoir si la meilleure pratique est d'afficher le résultat dans la classe ou de stocker le résultat et le gérer en HTML.Résultat de requête PHP echo dans Class?

Par exemple, le résultat d'affichage dans la classe

class Schedule { 
      public $currentWeek; 

      function teamQuery($currentWeek){ 

      $this->currentWeek=$currentWeek; 


      } 
      function getSchedule(){ 
       $connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS); 
        if (!$connection) { 
         die("Database connection failed: " . mysql_error()); 
        } 

        $db_select = mysql_select_db(DB_NAME,$connection); 
        if (!$db_select) { 
         die("Database selection failed: " . mysql_error()); 
        } 

        $scheduleQuery=mysql_query("SELECT guest, home, time, winner, pickEnable FROM $this->currentWeek ORDER BY time", $connection); 

        if (!$scheduleQuery){ 
         die("database has errors: ".mysql_error()); 
          } 


        while($row=mysql_fetch_array($scheduleQuery, MYSQL_NUMS)){ 
        //display the result..ex: echo $row['winner']; 

        }  
        mysql_close($scheduleQuery); 

        //no returns 
        } 


     } 

Ou retourner le résultat de la requête en tant que variable et gérer en php

class Schedule { 
      public $currentWeek; 

      function teamQuery($currentWeek){ 

      $this->currentWeek=$currentWeek; 


      } 
      function getSchedule(){ 
       $connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS); 
        if (!$connection) { 
         die("Database connection failed: " . mysql_error()); 
        } 

        $db_select = mysql_select_db(DB_NAME,$connection); 
        if (!$db_select) { 
         die("Database selection failed: " . mysql_error()); 
        } 

        $scheduleQuery=mysql_query("SELECT guest, home, time, winner, pickEnable FROM $this->currentWeek ORDER BY time", $connection); 

        if (!$scheduleQuery){ 
         die("database has errors: ".mysql_error()); 
        // create an array } 
        $ret = array(); 

        while($row=mysql_fetch_array($scheduleQuery, MYSQL_NUMS)){ 

        $ret[]=$row; 
        }  
        mysql_close($scheduleQuery); 

        return $ret; // and handle the return value in php 
        } 


      } 

Deux choses ici:

  1. I trouvé que retourné variable en php est un peu complexe à jouer car c'est un tableau à deux dimensions. Je ne suis pas sûr de ce qu'est la meilleure pratique et je voudrais vous demander des opinions d'experts.

  2. Chaque fois que je crée une nouvelle méthode, je dois recréer la variable de connexion $: voir ci-dessous

    $ connection = mysql_connect (db_server, DB_USER, DB_PASS); if (! $ Connection) { die ("Échec de la connexion à la base de données:". Mysql_error()); }

        $db_select = mysql_select_db(DB_NAME,$connection); 
            if (!$db_select) { 
             die("Database selection failed: " . mysql_error()); 
            } 
    

Il semble que redondant pour moi. Puis-je le faire une fois au lieu de l'appeler à chaque fois que j'ai besoin d'une requête? Je suis nouveau en classe php. J'espère que vous pouvez m'aider. Merci.

Répondre

2

Je traite les classes comme celles-ci en tant qu '«accesseurs» afin qu'elles interrogent uniquement la base de données et retournent le résultat. Ainsi, tout code PHP qui l'appelle peut faire ce qu'il veut avec. cela peut être l'affichage ou il peut être une vérification ou il peut être une mise à jour. C'est une bonne conception car elle sépare le magasin de données de la logique de l'affichage et signifie que votre code sera plus flexible. Mais oui, c'est un peu plus complexe.

En ce qui concerne la recréation de la connexion à chaque fois. Cela peut être ou ne pas être nécessaire. Selon votre configuration, vous pouvez créer un pool de connexions. Pour vous faciliter la tâche pour le moment, vous pouvez résumer la création d'une connexion à sa propre méthode. De cette façon, vous n'avez qu'à appeler cette méthode au début pour obtenir un handle de connexion. Cela vous évite d'avoir plusieurs copies du même code partout.

Si vous êtes novice en PHP, je vous suggère de faire un peu de recherche sur la conception orientée objet. Cela vous donnera une idée de la raison pour laquelle il serait bénéfique d'abstraire certaines fonctions, et aussi pourquoi vous voudriez retourner les résultats au lieu de les afficher.

+0

Je suis juste fatigué de faire face à un tableau à deux dimensions, mais je vais suivre votre suggestion. Merci beaucoup. – FlyingCat

+0

Merci Jerry. Je suis également d'accord avec prodigitalson qu'il serait préférable d'utiliser PDO. Une autre suggestion pour s'éloigner des tableaux 2D, est de créer des classes qui correspondent aux tables de base de données, puis dès que vous obtenez le tableau 2D, vous pouvez instancier et retourner une classe avec les résultats. Cela rend le travail avec les résultats plus facile et plus standardisé, bien qu'il y ait beaucoup de travail en créant des classes supplémentaires etc. Si vous regardez dans la fonction d'extraction PDO, il peut même faire l'instanciation pour vous, sans traiter les tableaux 2D. Alternativement, regardez dans cakePHP ... trop d'options :) bonne chance :) – Jacob

1

Il est probablement une mauvaise idée d'écho du résultat dans la classe nstead, vous devriez retourner le résultat ou l'ensemble de résultats pour l'écho ailleurs où.

mai la connexion d'un mebmer de la classe comme:

protected $_connection = null;

Ensuite, dans votre constructeur, vous pouvez affecter la connexion de base de données. Bien que normalement votre connexion DB serait enveloppée par une autre classe.

De plus, si j'étais vous je ne voudrais pas utiliser les fonctions mysql. Utilisez plutôt les pilotes Mysqli ou PDO_Mysql.Ils encapsulent toutes ces fonctionnalités de manière orientée objet par défaut. Vous pouvez ensuite étendre ces classes avec votre fonctionnalité personnalisée au lieu de travailler à partir de zéro.

+0

Merci prodigitalson. Je vais vérifier votre suggestion aussi. – FlyingCat

+1

Vous m'avez tous deux donné de bonnes réponses. Puisque vous avez déjà 6K. Je donnerai ma réponse acceptée à Jacob. Merci. : D – FlyingCat

+0

@jerry: haha ​​... je pensais que j'étais la seule personne qui a fait ça :-P – prodigitalson