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 に答える