2012-11-17 115 views
1

显然我的数据库函数不能获取数据库?mysqli无法获取数据库?

警告: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 ""; 
} 

数据库。

+0

发布你想要调用'real_escape_string()'的代码。当你调用它时,你是否通过实例化上述类来建立数据库连接?如果不是,它将不起作用。您必须拥有活动连接。 –

+0

连接后不需要调用'select_db()',因为您已经在'new mysqli()'构造函数中选择了数据库。 –

+1

哦,我看到您在构造函数中返回'$ db'。不要这样做。构造函数隐式返回对象。请发布其他代码以获取更多上下文。 –

回答

3

你说你的自定义类扩展了mysqli。如果是这样的话,你需要调用的mysqli __construct()在扩展构造,不返回任何东西:

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"); 

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