【问题标题】:scope in PHP classesPHP 类中的作用域
【发布时间】:2010-10-05 00:36:30
【问题描述】:

我正在创建一个数据库连接对象,但我不确定最好的方法是什么...

如果我创建了一个建立连接的 dbConnection 类(使用 mysql_connect),我可以从主脚本的任何位置调用 mysql_query 吗?

从 OTHER 类内部呢?我需要将对象或属性作为参数传递吗?

基本上,我正在寻找使用简单类一次连接到数据库的最佳方式(在速度+内存方面)...

我已经发布了数据库连接类的构造函数:

function __construct($database="") {
if (!empty($database)){ $this->db = $database; }
$this->dblink = mysql_connect($this->host,$this->username,$this->password);
if (!this->dblink) {
    //Fatal Error
}
mysql_select_db($this->db, $this->dblink);

}

【问题讨论】:

  • 您是否有理由不使用 PDO 或 MySQLi 库?如果您使用 __construct(),那么您必须至少使用 v5.x 的 PHP。

标签: php database connection scope


【解决方案1】:

当您要执行查询时,您应该将连接对象作为参数传递给查询函数。您需要在要运行查询的任何地方访问连接对象。

require_once DBConnection;
require_once SomeClass;

$con = new DBConnection();
$query = "Select * FROM Users";
mysql_query($query, $con->link);

// Use the connection in another class that takes a connection object in the constructor
$someclass = new SomeClass($con);
$someclass->executeQueryThree();

但是,我更倾向于在 DBConnection 类中使用 mysql_query 作为方法,如下所示:

公共函数查询($query) { $result = mysql_query($query, $this->link); 返回$结果; }

然后执行以下操作:

$query = "Select * FROM Users";
$con = new DBConnection();
$result = $con->query($query);

// From within SomeClass
$someclass = new SomeClass();
$result = $con->query($someclass->getQuery3());

【讨论】:

    【解决方案2】:

    你快到了。我的数据库类是这样的:

    class DB {
      function __construct($host,$user,$pass,$db) {
        // error checking has been removed for brevity
        $this->mysql = mysql_connect($host,$user,$pass);
        mysql_select_db($this->mysql, $db);
      }
      function fetchRows($query) {
        // error checking removed again
        $result = mysql_query($this->mysql);
        $return = array();
        while($data = mysql_fetch_assoc($result))
          $return[] = $data;
        mysql_free_result($result);
        return $return;
      }
    }
    

    在我的主要包含文件中,我有这样的东西:

    require 'DB.inc.php';
    $GLOBALS['DB'] = new DB('localhost', 'root', '', 'my_database');
    

    然后在我项目的任何部分,我都可以运行这样的查询:

    global $DB;
    $query = 'SELECT UserID, UserName FROM users';
    foreach($DB->fetchRows($query) as $user)
        echo "$user[UserID]: $user[UserName]\n";
    

    注意事项: 不推荐使用mysql_pconnect(),原因见manual page用户cmets。

    【讨论】:

      【解决方案3】:

      与其创建自己的数据库抽象类,我建议尝试ezSQL。作者在使它非常易于使用方面做得非常出色。类查询返回的数据结构比mysql_query返回的数据结构灵活得多,可以省去很多工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        • 2011-08-03
        • 2011-05-09
        • 1970-01-01
        • 2011-01-20
        相关资源
        最近更新 更多