0

我刚开始做OOP,所以如果有一个简单的解决方案,我提前道歉。基本上我需要在一个类中使用我的$mysqli对象。我把它分成了两个文件。

config2.php

class Config
{

    public $host = 'localhost';
    public $username = '****';
    public $password = '****';
    public $database = '****';

    function report_error($query)
    {
        $email = '*@hotmail.com';
        $subject = 'MySQL error.';
        $message = "IP: {$_SERVER['REMOTE_ADDR']} \n URL: http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']} \n\n MySQL query: {$query} \n\n MySQL error: " . $mysqli->error();

        mail($email, $subject, $message);
        die('Oops, an error has occured. The administrator has been notified.');
    }

}

$config = new Config();
$mysqli = new mysqli($config->host, $config->username, $config->password, $config->database);

if($mysqli->connect_error)
    report_error($mysqli);

管理.php

require('includes/config2.php');

$mysqli->real_escape_string();   // Works out of scope.

class Account
{
    public $username = $mysqli->real_escape_string();   // Doesn't work in scope.
    public $password;

    function login()
    {

    }
}

感谢您的帮助,我很感激:)。

4

2 回答 2

3

您应该将对象传递给构造函数Account并将其保存为私有实例变量。

Account直接依赖于 的实例mysqli,因此通过在构造函数中将其指定为必需参数来明确这一点并没有错。这是您可以确保无论何时Account使用 mysqli 对象的唯一方法。如果您从全局状态访问它(通过使用静态访问器或直接访问全局范围),您永远无法保证它确实存在。

于 2012-06-28T11:38:59.677 回答
0

您应该封装 $mysqli 对象并将其设为静态

通常你会将数据库封装在一些名为“DBConnection”或类似的类中。这个实例应该将真正的 $mysqli 对象作为单例来管理

(非常)简短:

class Config
{
    public $host = 'localhost';
    [...]
    public static  $connectionObj 
    public static getConnection(){
      if (!isset($this->connectionObj ){
        $connectionObj = new mysqli($this->host, $config->this, $config->this, $this->database);
        if($mysqli->connect_error){
          report_error($mysqli);
        }
      }
      return $this->connectionObj;
    }
}

您可以从任何地方访问此对象:

$mysqlObj = Config.getConnection()

免责声明: 这是非常短的,未经测试的代码和数据库不应该进入配置类,而是它自己的数据库类,所有 SQL 函数作为方法,这只是为了重用您提供的代码

于 2012-06-28T11:37:56.357 回答