代码之家  ›  专栏  ›  技术社区  ›  FlyingCat

类中的php echo查询结果?

  •  3
  • FlyingCat  · 技术社区  · 14 年前

    我有一个关于PHP类的问题。我试图通过php从mysql中得到结果。我想知道最佳实践是在类中显示结果,还是存储结果并用HTML处理。

    例如,在类内显示结果

    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
                        }
    
    
            }
    

    或者以变量的形式返回查询结果并在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
                        }
    
    
                }
    

    这里有两件事:

    1. 我发现PHP中返回的变量有点复杂,因为它是二维数组。我不确定什么是最佳实践,我想问你的专家意见。

    2. 每次我创建一个新方法时,我都必须重新创建$connection变量:见下面

      $connection=mysql_connect(db_server,db_user,db_pass); 如果(!)$连接){ die(“数据库连接失败:”。MySqLyError()); }

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

    我觉得这是多余的。我可以只做一次而不是在任何需要查询的时候调用它吗?我是PHP类的新手。希望你们能帮助我。谢谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jacob    14 年前

    我将这些类视为“访问器”,因此它们只查询数据库并返回结果。这样,任何调用它的PHP代码都可以用它做任何它喜欢的事情。这可能正在显示,也可能是一个检查,也可能是一个更新。这是一个很好的设计,因为它将数据存储和逻辑从显示中分离出来,这意味着您的代码将更加灵活。但是的,这有点复杂。

    关于每次重新创建连接。这可能是必要的,也可能不是必要的。根据您的设置,您可能可以创建连接池。为了使您现在更方便,您可以抽象到自己方法的连接的创建。这样,您只需要在开始时调用此方法来获取连接句柄。这样可以避免在整个地方有许多相同代码的副本。

    如果您对PHP类不熟悉,我建议您对面向对象的设计做一些研究。这将使您了解为什么抽象一些函数会有好处,以及为什么您希望返回结果而不是显示它们。

        2
  •  1
  •   prodigitalson    14 年前

    在类nstead中回送结果可能是个坏主意,您应该返回结果或结果集,以便在其他位置回送。

    可连接一个类的Mebmer,如:

    protected $_connection = null;

    然后,在构造函数中,您可以分配数据库连接。尽管通常情况下,您的DB连接将被另一个类包装。

    另外,如果我是你,我不会使用 mysql 功能。而是使用mysqli或pdo-mysql驱动程序。默认情况下,它们以面向对象的方式封装所有这些功能。然后,您可以使用自定义功能扩展这些类,而不是从头开始工作。