Php 无法获取数据库

Php 无法获取数据库,php,mysql,oop,mysqli,Php,Mysql,Oop,Mysqli,我被这个错误激怒了。我一直在获取mysqli::query:无法在mysqli查询上获取数据库 以下是我的mysqli扩展类database.php: class database extends mysqli { private $host; private $username; private $password; private $database; private $name; private $connected; public

我被这个错误激怒了。我一直在获取mysqli::query:无法在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 )";
    }

}
下面是我使用query 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();

?>

好吧,我自己部分地解决了。无论如何,如果一位经验丰富的PHP开发人员能够为将来的问题和其他人的问题更清楚地解释这一点,那就太好了

如果我在会话方法中检查mysqli连接的状态,它会显示为手动断开连接,这意味着$db->stop已被调用。我只在index.php的末尾调用该函数,这是我的项目中的基本索引,这基本上意味着会话类内部发生的所有事情都发生在整个“外部”php代码运行之后

通过打开数据库类的另一个连接mysqli的扩展,并在会话类中使用该连接,我已经修复了问题。

读取功能应该可以正常工作,但写入功能不能在相同的连接中工作

最好的方法是在会话对象内部为类本身创建一个特定的连接

它将是这样的:

class session {

  private $db;

  public function __construct( $params ) {
    $this->db = new database( $params );
  }
  .
  .
  .
}
$session = new session( $params );
然后创建会话对象,如下所示:

class session {

  private $db;

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

您从未实例化会话类,因此无法使用共享代码获得该错误there@PeeHaa键入问题时出错,我确实在$db之后实例化了它,我编辑了问题。为什么要使用STFU@operator?@PeeHaa忽略错误(如果有错误),但是我用下面的_errnoa行抓住了它。@PeeHaa我不觉得你的评论太有帮助或友好,任何PHP程序员都会知道,@mark只会忽略连接错误,我没有任何错误。这样,你只会将数据库类与会话类紧密耦合,而不会进行任何交换。这也意味着您不能在其他地方重用数据库连接。您确定这一点吗?谢谢你的否决票!为什么我不能在别处重用数据库连接?没有比这更好的逻辑方法了。您必须在类内手动创建新连接,或者使用db类。您确定这一点吗?是的,非常肯定。谢谢你的否决票!不客气。注:我根据内容投票,而不是根据感觉投票。为什么我不能在别处重用数据库连接?因为您将数据库连接的实例耦合到会话类。您必须在类内手动创建新连接,或者使用db类Yes,这正是OP所做的。将带有连接的实例传递给@PeeHaa所需的类/方法据我所知,当DB实例被销毁时,会调用write函数。因此,您没有直接访问实例的权限。这是OP提出问题的主要原因。因此,您不能将db实例传递给这个特定的类。这就是为什么实际问题——销毁实例——应该得到解决,而不是通过管道找到解决方案