警告:mysqli_query() 期望参数 1 为 mysqli,[class 文件] 中给出的对象

Warning: mysqli_query() expects parameter 1 to be mysqli, object given in [class file]

我正在学习 OOP,所以我可能做了一些愚蠢的事情。我有使用 mysql 的代码,但读到 mysqli 更好,特别是因为我想从数据库中获取对象数组。我已经更新我的代码以尝试使用 mysqli 现在,并解决了一些问题,但现在我被卡住了。

来自我的数据库class 文件:

class Database {

    function __construct() {
        $connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE) or die(mysqli_error($db));
        ?><pre><?
        var_dump($connection);
        ?></pre><?
    }
}

转储包含一些变量,我不会在这里粘贴,但前几行:

object(mysqli)#3 (19) {
  ["affected_rows"]=>
  int(0)
  ["client_info"]=>
  string(6) "5.5.40"
  ["client_version"]=>
  int(50540)
  ["connect_errno"]=>
  int(0)
  ["connect_error"]=>
  NULL

我相信这意味着我已成功连接到数据库。

这是我的会员 class 文件:

<?php

include_once (inc('_class.db'));

class Member {

    //Database connect 
    public function __construct() {
        $db = new Database();
    }

/*snip a registration function */

    // Login process
    public function check_login($emailusername, $password) {
        $db = new Database(); # added for troubleshooting, seems to do nothing...
        var_dump($db);

        $password = md5($password);
        $result = mysqli_query($db,"SELECT * from members WHERE email = '$emailusername' or username='$emailusername' and password = '$password'") or die(mysqli_error($db));
        $user_data = mysqli_fetch_array($result,MYSQLI_ASSOC);
        $no_rows = mysqli_num_rows($result);

/* snip code that runs after that */
}
?>

var_dump 产生以下结果:

object(Database)#2 (0) { } 

同样,这段代码在我使用 mysql 语句时都有效,但转换为 mysql 我很烦。

我读过几个 Stack Overflow 的答案是这个错误 - "object given" - 还有几十个不适用的 "string given" 之类的答案。我不知道我做错了什么。

据我所知,这不是一个重复的问题,尽管像这样的问题经常被问到。

我不会尝试 return 构造函数中的任何内容。为什么不调用一个单独的函数来获取连接?

 class Database {

    function __construct() {}
    function getConnection(){
        $connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
        return $connection;
    }
}

然后实例化后从Database对象中获取连接:

$result = mysqli_query($db->getConnection(),"SELECT * from members WHERE email = '$emailusername' or username='$emailusername' and password = '$password'") or die(mysqli_error($db));
    

您不能将自定义 Database class 的实例传递给 mysqli_query。它需要一个特定的连接,而不是您定义的任意 class 的实例。

您需要将 $connection 转换为 mysqli_query,最简单的方法可能是为 mysqli_query 添加一个包装器到您的自定义 class:

class Database {
    private $connection;

    function __construct() {
        $this->connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE) or die(mysqli_error($db));
    
    }

    function query($query_string) {
        return mysqli_query($this->connection, $query_string);
    }
}