【问题标题】:PHP echo query result in Class?类中的PHP回显查询结果?
【发布时间】:2010-05-23 21:46:15
【问题描述】:

我有一个关于 PHP 类的问题。我正在尝试通过 PHP 从 Mysql 获取结果。我想知道最佳做法是在类中显示结果还是将结果存储并在 html 中处理。

例如在Class里面显示结果

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("数据库连接失败:" .mysql_error()); }

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

这对我来说似乎是多余的。我可以只做一次而不是在需要查询时调用它吗?我是 php 类的新手。希望你们能帮助我。谢谢。

【问题讨论】:

    标签: php class


    【解决方案1】:

    我将这些类视为“访问器”,因此它们纯粹是查询数据库并返回结果。这样,任何调用它的 PHP 代码都可以随心所欲地做任何事情。这可能正在显示,也可能是支票,也可能是更新。这是一个很好的设计,因为它将数据存储与显示的逻辑分开,这意味着您的代码将更加灵活。但是,是的,它有点复杂。

    关于每次重新创建连接。这可能是必要的,也可能不是必要的。根据您的设置,您可能能够创建连接池。为了让您现在更容易,您可以将连接的创建抽象为它自己的方法。这样,您只需要在开始时调用此方法即可获得连接句柄。这样可以避免您到处都拥有许多相同代码的副本。

    如果您是 PHP 类的新手,我建议您对面向对象设计进行一些研究。这将使您了解为什么抽象某些函数是有益的,以及为什么要返回结果而不是显示它们。

    【讨论】:

    • 我只是厌倦了处理二维数组,但我会听从你的建议。非常感谢。
    • 谢谢杰瑞。我也同意 prodigitalson 的观点,即使用 PDO 会更好。摆脱二维数组的另一个建议是创建与数据库表匹配的类,然后一旦获得二维数组,您就可以实例化并返回一个带有结果的类。这使得处理结果更容易、更标准化,尽管创建额外的类等需要做很多工作。如果您查看 PDO 获取函数,它甚至可以为您进行实例化,无需处理 2D 数组。或者,看看 cakePHP...太多的选择:) 祝你好运 :)
    【解决方案2】:

    在类中回显结果可能是个坏主意,相反您应该返回结果或结果集以在其他地方回显。

    可以连接类的成员,例如:

    protected $_connection = null;

    然后在您的构造函数中,您可以分配数据库连接。虽然通常您的数据库连接会被另一个类包装。

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

    【讨论】:

    • 感谢 prodigitalson。我也会看看你的建议。
    • 你们俩都给了我很好的答复。因为你已经有6K了。我会向雅各布给出我接受的答案。谢谢。 :D
    • @jerry: 哈哈...我以为我是唯一这样做的人 :-P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多