3

我不熟悉以 OOP 方式使用 PHP,但发现我的数据库连接类存在问题。

我在这里有一个带有这个 mysqli 连接类的文件

$db_name = 'dbname';
$db_user = 'dbuser';        
$db_password = 'dbpassword';
$db_host = 'localhost';

class database {

    public $mysqli;

    public function connect($db_host, $db_user, $db_password, $db_name){

        $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);

        if ($mysqli->connect_errno) {
            return "Sorry Andre, but you seem to have messed up the DB connection :(";
        }
    }
}

$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);

然后我想在另一个文件的数据库连接中使用变量 $mysqli - 这是一个使用 $mysqli 变量连接的简单插入数据库。我在连接文件中包含了上述内容,但是当我在数据库类中调用该方法时,似乎没有返回 $mysqli 变量。我收到 PHP 错误说...

Fatal error: Call to a member function prepare() on a non-object in...

我已经看到使用

global $mysqli; 

可以,但是我想以正确的方式来做,因为我听说这不是好的做法。

我知道我在这里可能做错了一些事情,因为我是使用 OOP 的新手,但我假设通过在连接函数中返回该变量,我可以通过在外部创建类来访问它。

感谢您的帮助,谢谢。

4

3 回答 3

3

你需要改变:

$mysqli->connect_errno

到:

$this->mysqli->connect_errno
于 2013-01-26T14:54:54.753 回答
3

在外部使用它时,您可以通过实例访问类变量...

$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);
$newConnection->mysqli /* here you have access from outside */

从内部你使用关键字 $this...

// like this from inside
if ($this->mysqli->connect_errno) {
    return "Sorry Andre, but you seem to have messed up the DB connection :(";
}

如果您想保护您的变量免受外部访问,请使用:

  private $mysqli; 
  // instead of 
  public $mysqli;
于 2013-01-26T14:55:21.533 回答
1
Fatal error: Call to a member function prepare() on a non-object in...

这始终意味着,您调用该方法的对象不是对象。在您的情况下: mysqli 未初始化。

一般提示: connect 看起来像一些东西,应该在构造函数中。

class d {
  public function __construct($db_host, $db_user, $db_password, $db_name){
    $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
    if ($this->mysqli->connect_errno) {
      return "Sorry Andre, but you seem to have messed up the DB connection :(";
    }
  }

  public $mysqli;
}

$foo = new d('host', 'user', 'pass', 'dbname');
$foo->mysqli->prepare("something");

因此,当您获取此类的实例时,它会自动初始化。同样,每次要初始化它时,您都可以保存一行。

于 2013-01-26T14:55:55.470 回答