1

显然我的数据库功能无法获取数据库?

警告:mysqli::real_escape_string():无法获取数据库

我创建了一个扩展 MySQLi 的自定义数据库类。

这是我构建它的方式。

public function __construct(){
    $db = new mysqli(
        DB_HOST, DB_USER, DB_PASS, DB_NAME);

    $db->select_db(DB_NAME);
    return $db;
}

我正在选择数据库,不是吗?

发生这种情况的代码在这里:

    private static function readSession($sessionId)
    {
    global $database;
    $sessionId = session_id();
    $sessionId = $database->real_escape_string($sessionId);
    $time = time();
    $result = $database->query("SELECT sessiondata FROM sessions WHERE sessionid='$sessionId' AND expiry > $time");
    if ($result->num_rows > 0) {
        $row = $result->fetch_array();
        return $row['sessiondata'];
    }
    return "";
}

在调用会话管理功能之前启动数据库。

4

1 回答 1

3

你说你的自定义类扩展了 mysqli。如果是这种情况,您需要__construct()在扩展构造函数中调用 mysqli,而不返回任何内容:

class YourDatabase extends mysqli {
  public function __construct() {
    // Call the mysqli constructor explictly
    parent::__construct(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    // No need to call select_db() again, since default db was selected in the 
    // parent constructor

    // Don't return anything
    // the constructor returns $this, which extends mysqli
    return;
  }
}

// Use as:
$database = new YourClass();
$database->query("SELECT * FROM atable");

扩展类意味着您正在使用父类的后代。您不需要实例化父类的实例,但如果您需要使用其构造函数并扩展其功能,则必须显式调用parent::__construct(...)子类的__construct().

于 2012-11-17T22:44:25.660 回答