【问题标题】:Warning: mysqli_query() expects parameter 1 to be mysqli, object given in [class file] [duplicate]警告:mysqli_query() 期望参数 1 是 mysqli,在 [class file] [duplicate] 中给出的对象
【发布时间】:2015-06-14 06:02:47
【问题描述】:

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

来自我的数据库类文件:

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

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

所以这是我的成员类文件:

<?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 语句时,这段代码都可以正常工作,但是转换为 mysqli 让我很头疼。

我已经阅读了几个 Stack Overflow 答案是这个错误 - “给定对象” - 还有几十个是其他不适用的“给定字符串”。我不知道我做错了什么。

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

【问题讨论】:

  • 只是一个警告:不要再使用 MD5。这是一个非常古老的算法并且不安全:en.wikipedia.org/wiki/MD5
  • 显然整个教程有点过时了。呵呵。感谢您的提醒。 :)

标签: php class oop mysqli


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您需要将$connection 放入mysqli_query,最简单的方法可能是将mysqli_query 的包装器添加到您的自定义类中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2016-02-29
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多