【问题标题】:PHP Initialize one class with multiple variables multiple timesPHP用多个变量多次初始化一个类
【发布时间】:2013-03-04 21:59:52
【问题描述】:

我正在尝试运行一个可以联系多个数据库的数据库类。我是这样设置的:

$auth = new Auth($db['host'], $db['user'], $db['name']['api'], $db['pass']['api']);
$apiuser = new APIUser($db['host'], $db['user'], $db['name']['users'], $db['pass']['users']);

所有这些 $db 数组变量都可以正常工作,但不能正常工作的是类。在每个类的 __construct 函数中,我都有这个:

function __construct($dbh, $dbu, $dbn, $dbp) {

        $this->db = new DB($dbh, $dbu, $dbn, $dbp);
    }

但是,当我尝试运行 $this->db->query("my query here"); (它包含一个带有输入变量的简单返回 mysql_query),它返回一个布尔值而不是资源 ID...这是因为该类正在恢复到用户数据库而不是 api 数据库,因为 $apiuser 在 $apiauth 之后......

如果这有任何意义,我真的可以在这方面提供一些帮助!谢谢!

编辑:部分 DB 类给出错误:

function __construct($host, $user, $name, $pass) {
        $this->error = new Error();
        if(!mysql_connect($host, $user, $pass)) {
            $this->error->db_connect_error($host, $user, $pass);
        }
        if(!mysql_select_db($name)) {
            $this->error->db_select_error($name);
        }
    }
    function query($input) {
        return mysql_query($input);
    }

【问题讨论】:

  • 如果也能看到 DB 类就好了
  • 刚刚发布,谢谢!
  • 我会说直接返回 $resource 是一种不好的做法,返回实际结果可能会更好。无论如何,如果它返回 FALSE,这意味着:1. 您的查询有错误 2. 数据库连接有错误 3. 给定的用户没有访问表的权限。
  • 您应该将您的 DB 实例作为参数传递。依赖注入、DRY 等。也没有重复的实例化。

标签: php mysql oop class


【解决方案1】:

但是,当我尝试运行 $this->db->query("my query here"); (它包含一个带有输入变量的简单返回 mysql_query),它返回一个布尔值而不是资源 ID...这是因为该类正在恢复到用户数据库而不是 api 数据库,因为 $apiuser 在 $apiauth 之后......

如果您使用多个数据库,那么您需要指定您使用的链接:

class DB {
   private $dbRsrc;

   function __construct($host, $user, $name, $pass) {
        $this->error = new Error();
        $this->dbRsrc = mysql_connect($host, $user, $pass);
        if(!$this->dbRsrc) {
            $this->error->db_connect_error($host, $user, $pass);
        }
        if(!mysql_select_db($name)) {
            $this->error->db_select_error($name);
        }
    }
    function query($input) {
        return mysql_query($input, $this->dbRsrc);
    }
}

也就是说,您应该按照@WaleedKahn 的建议将DB 实例真正注入到其他类中。此外,您不应该使用 mysql_* 函数。请改用MysqliPDO。两者都已经有了面向对象的接口。

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多