2015-08-05 3 views
0

Меня раздражает эта ошибка. Я продолжаю получать mysqli::query(): Couldn't fetch database по запросу mysqli.Не удалось получить базу данных

Вот мой MySQLi расширенный класс (database.php):

class database extends mysqli { 

    private $host; 
    private $username; 
    private $password; 
    private $database; 
    private $name; 
    private $connected; 
    public $status; 

    public function __construct($param) { 

     $this->host = $param['host']; 
     $this->username = $param['username']; 
     $this->password = $param['password']; 
     $this->database = $param['name']; 

     @parent::__construct($this->host, $this->username, $this->password, $this->database); 

     $this->status = ($this->connect_errno) ? "Not Connected (Because of Error)" : "Connected"; 
     $this->connected = ($this->connect_errno) ? false : true; 
    } 

    public function stop() { 
     if($this->connected) { $this->close(); } 
     $this->status = "Not Connected (Manually Disconnected)"; 
    } 

} 

А вот где я использую запрос (sessions.php):

class session { 

    private $db; 

    public function __construct($db) { 
     $this->db = $db; 
    } 

    function open() { 
     return true; 
    } 

    function close() { 
     return true; 
    } 

    function read($id) { 


     $sql = "SELECT * FROM sessions WHERE sessionid = '{$id}'"; 
     $sqlq = $this->db->query($sql); 
     if($sqlq) { $row = $sqlq->fetch_assoc(); return $row['data']; } 
     else { return ''; } 

    } 

    function write($id, $data) { 

     $now = time(); 

     $sql = "SELECT * FROM sessions WHERE sessionid = '{$id}'"; 

     $sqlq = $this->db->query($sql); // HERE I GET THE ERROR 

     if(($sqlq) && ($sqlq->num_rows == 1)) { $sql = "UPDATE sessions SET data = '{$data}', updated = {$now} WHERE sessionid = '{$id}'"; return $this->db->query($sql); } 
     else { $sql = "INSERT INTO sessions (sessionid, updated, data) VALUES ('{$id}', {$now}, '{$data}')"; return $this->db->query($sql); } 

    } 

    function destroy($id) { 

     return $this->db->delete("FROM sessions WHERE sessionid = '{$id}'"); 

    } 

    function clean($max) { 

     $old = time() - $max; 

     return $this->db->delete("FROM sessions WHERE updated < {$old}"); 

    } 

} 

Это, как я их использовать в основном файле (main.php):

<? 
    $params = array(); 
    $params['host'] = XXXXXXXXXXXXX; 
    $params['username'] = XXXXXXXXXXXXX; 
    $params['password'] = XXXXXXXXXXXXX; 
    $params['name'] = XXXXXXXXXXXXX; 

    include("database.php"); 
    include("sessions.php"); 

    $db = new database($params); 
    $session = new session($db); 
    session_set_save_handler(array($session, "open"), array($session, "close"), array($session, "read"), array($session, "write"), array($session, "destroy"), array($session, "clean")); 
    session_start(); 

?> 
+0

Вы никогда не создать экземпляр класса сеанса, так что нет никакого способа (с общим кодом) чтобы получить эту ошибку там – PeeHaa

+0

@PeeHaa было ошибкой при вводе вопроса, я создаю его сразу после '$ db', я отредактировал вопрос. –

+0

Почему вы используете оператор STFU ('@')? – PeeHaa

ответ

-1

read function должно работать нормально, но write function не будет работать с тем же соединением.

Лучшим способом является создание соединения внутри вашего объекта сеанса, определенного для самого класса.

Это будет что-то вроде этого:

class session { 

    private $db; 

    public function __construct($params) { 
    $this->db = new database($params); 
    } 
    . 
    . 
    . 
} 

, а затем создать объект сессии, как это:

$session = new session($params); 
+0

Таким образом, вы просто плотно соединяете класс базы данных с классом сеанса без какой-либо войны, чтобы поменять его. Также это означает, что вы не можете повторно использовать соединение с базой данных в другом месте. – PeeHaa

+0

Уверены ли вы в этом? спасибо за downvote в любом случае! почему я не могу повторно использовать соединение с базой данных в другом месте? нет лучшего логического способа добиться этого.либо вам нужно создать новое соединение вручную внутри класса, либо использовать класс db – EhsanT

+0

«Вы уверены в этом?» Да, очень уверен. «Спасибо за downvote в любом случае!» Пожалуйста. Примечание. Я голосую на основе контента, не основанного на чувствах. «Почему я не могу повторно использовать соединение с базой данных в другом месте?» Потому что вы связали экземпляр соединения с базой данных с классом сеанса. «либо вам нужно создать новое соединение вручную внутри класса, либо использовать класс db« Да, что именно делает OP. Передача экземпляра (с соединением) в классы/методы, которые ему нужны [Что такое инъекция зависимостей] (http://stackoverflow.com/questions/130794/what-is-dependency-injection) – PeeHaa

0

Хорошо, я частично выяснил это сам. Во всяком случае, было бы здорово, если бы опытный разработчик PHP объяснил это более четко для будущих вопросов и вопросов других людей.

Кажется, что если я проверю состояние моего соединения mysqli внутри метода сеанса, он отображает «Вручную отключен», что означает, что вызывается $db->stop(). Я называю эту функцию только в конце моего index.php (базового индекса из моего проекта), что в основном означает, что все, что происходит внутри класса сеанса, происходит ПОСЛЕ завершения всего «внешнего» кода PHP.

Я исправил свою проблему, открыв другое соединение моего класса базы данных (расширение mysqli) и используя это соединение внутри класса сеанса.

Смежные вопросы