【问题标题】:PHP mysqli query: couldn't fetch mysqliPHP mysqli 查询:无法获取 mysqli
【发布时间】:2014-01-14 14:35:31
【问题描述】:

我正在尝试建立数据库连接并检查表中的现有数据。但是我收到此错误,但我无法找到原因:


警告:mysqli::query():无法获取 mysqli in /usr/share/nginx/www/me/container/class_lib.php上线 33

警告:mysql_fetch_assoc() 需要 参数 1 为资源,在 /usr/share/nginx/www/me/container/class_lib.php上线 97

class dbHandler {

    static $dbObj          = null;
    protected $db_host     = 'localhost';       #db host
    protected $db_username = 'user';  #db username
    protected $db_password = 'password';        #db password
    protected $db_name     = 'db';  #db name

    function __construct()
    {
        # connect if not connected
        if(self::$dbObj === null)
        {
            self::$dbObj = new mysqli($this->db_host, $this->db_username, $this->db_password, $this->db_name)
            or die($this->dbObj->error);
        }

        mysqli_set_charset(self::$dbObj, "utf8");

    }

    // query: query the db
    public function query($query)
    {
        return self::$dbObj->query($query);
    }

}

/*
    class userLogin
    create user login
*/
class userLogin {

    private $username;
    private $password;

    function __construct($username, $password) {

        $this->_dbConn = new dbHandler();

        $this->username = $username;
        $this->password = $password;

    }

    public function verifyCredentials() {

        if($this->verifyUsername())
        {

        } else {

            exit;

        }

        if($this->verifyPassword())
        {

        } else {

            exit;

        }


    }

    private function verifyUsername() {

        if(!(preg_match('/[^a-z_\-0-9]/i', $this->username)))
        {

            return true;

        }

    }

    private function verifyPassword() {

        $query  = "SELECT * FROM tbl_user";
        $result = $this->_dbConn->query($query);
        $row    = mysql_fetch_assoc($result);

        var_dump($row);
    }

}

我在这里做错了什么?

【问题讨论】:

  • 此外,即使 tbl_user 表中有数据,任何转储或打印 $row 都会返回 NULL。
  • 你在哪里创建类实例?
  • 我使用 $username = $_POST['username']; 在这个 class_lib 之外调用这个类$password = $_POST['密码']; $login = new userLogin($username, $password); $login->verifyCredentials();然后我在 userLogin 构造函数中调用 db 处理程序。
  • mysql_fetch_assoc($result) 在 verifyPassword 函数中应该是 mysqli
  • 仍然返回相同的错误和 NULL。

标签: php mysqli


【解决方案1】:

你所有的包装器都是基于 mysqli 面向对象的方式,突然你有了这条线?

$row    = mysql_fetch_assoc($result);

你必须使用 mysqli 结果对象中的 fetch_assoc

$result->fetch_assoc()

【讨论】:

  • 是的,我注意到了。但是,这会返回 致命错误:在 /usr/share/nginx/www/me/container/class_lib.php 中的非对象上调用成员函数 fetch_assoc()上线97
  • @Martin 您的查询似乎失败了。因为查询返回 false。所以试试这个:if ($result) { $result->fetch_assoc() }
  • 是的,它返回 false。怎么会这样?不,我不再使用 mysql,只有 mysqli。
  • 我已将其从代码中删除。我现在使用 $result->fetch_assoc();
  • 没关系,从我最后的评论开始。咖啡还没有开始@Martin
【解决方案2】:

您的 SQL 查询显然失败了。为什么你有一个函数查询来调用我不知道的查询,但我觉得这是你问题的原因。使用这样的东西会更好:

class dbHandler extends mysqli {

    protected $db_host     = 'localhost';       #db host
    protected $db_username = 'user';  #db username
    protected $db_password = 'password';        #db password
    protected $db_name     = 'db';  #db name

    function __construct()
    {
            parent::__construct($this->db_host, $this->db_username, $this->db_password, $this->db_name);
            if($this->connect_errno)
            {
                    trigger_error('Unable to connect to the database [' . $this->connect_errno . ']: ' . $this->connect_error, E_USER_ERROR);
            }

    }

    public function __destruct()
    {
        parent::close();
    }

}

/*
    class userLogin
    create user login
*/
class userLogin {

    private $username;
    private $password;

    function __construct($username, $password) {

        $this->_dbConn = new dbHandler();

        $this->username = $username;
        $this->password = $password;

    }

    public function verifyCredentials() {

        if($this->verifyUsername())
        {

        } else {

            exit;

        }

        if($this->verifyPassword())
        {

        } else {

            exit;

        }


    }

    private function verifyUsername() {

        if(!(preg_match('/[^a-z_\-0-9]/i', $this->username)))
        {

            return true;

        }

    }

    private function verifyPassword() {

        $query  = "SELECT * FROM tbl_user";
        $result = $this->_dbConn->query($query);
            if($this->_dbConn->errno)
            {
                trigger_error('Error fetching users from table. Query: ' . $query . '. Error: ' . $this->_dbConn->error);
                return false;
            }
            if($result->num_rows)
            {
                while($row = $result->fetch_assoc())
                {
                    var_dump($row);
                }
            }
    }

}

让我知道你是怎么做的。

【讨论】:

  • 我的代码在您使用 root mysql 登录时有效。如果我的代码无效,这怎么可能?
  • @Martin 我从来没有说过它是无效的,我说它令人困惑并且可能导致问题。
【解决方案3】:

所以...我从来没有给 localhost 的 mysql 用户任何授权。仅来自远程 LAN。问题解决了。

【讨论】:

    【解决方案4】:

    可能您关闭连接太早了? DBConnect->close();?

    所以,如果你在那之后尝试执行任何查询,你会得到一个错误!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 2013-11-25
      • 2017-02-28
      • 1970-01-01
      相关资源
      最近更新 更多