Php 致命错误:对中的非对象调用成员函数bindValue()

Php 致命错误:对中的非对象调用成员函数bindValue(),php,pdo,bindvalue,Php,Pdo,Bindvalue,我得到了上面显示的错误。我已经浏览了这个网站,但是我找不到解决问题的正确方法 我正在尝试编写一个用户类。以下代码是到目前为止我的代码 class User { private $_id; public function __construct($id) { $this->_id = $id; } public function getUsername() { global $db; $q

我得到了上面显示的错误。我已经浏览了这个网站,但是我找不到解决问题的正确方法

我正在尝试编写一个用户类。以下代码是到目前为止我的代码

class User
{

    private $_id;

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

    public function getUsername()
    {
        global $db;

        $query = $db->prepare("SELECT * FROM users WHERE id = ?");
        $query->bindValue(1, $this->_id);

        $query->execute();

    }

}
结果是以下错误,我不知道如何修复此错误

致命错误:对中的非对象调用成员函数bindValue()

编辑:

session_start();
$id = $_SESSION['logged_in'];
$conn = new PDO('xxx');
$user = new User($id, $conn); 
$username = $user->getUsername();
以下是我如何使用它:

$user = new User($_SESSION['logged_in']); 
$username = $user->getUsername();

旁注:
session_start()
已加载。

我认为您的查询对象是
$db
而不是
$query
。。。如果是这样,那么$query缺少
bindValue()
,这是正常的,因为它不是一个对象,因此没有任何方法


试着使用
$db->bindValue()
并让我们知道它是如何运行的:D

使用全局变量确实是一种糟糕的方法

阅读以下博客:

这解释了为什么这不是一个好主意

如果
$db
为空,则prepare很可能不会返回语句对象

然后,
$query
将不是statemnt,因此,
bindValue
将无法识别

相反,将连接传递给您的类,并停止使用globals

而且你的函数没有返回任何数据,我修改它以返回用户名

class User
{

    private $_id;
    private $db;

    public function __construct($id, $conn)
    {
        $this->_id = $id;
        $this->$db = $conn;
    }

    public function getUsername()
    {
        $query = $this->db->prepare("SELECT username FROM users WHERE id = ?");
        $query->bindValue(1, $this->_id);

        $query->execute();
        $data = $query->fetch();

        return $data['username'];

    }

}

用法:

session_start();
$id = $_SESSION['logged_in'];
$conn = new PDO('xxx');
$user = new User($id, $conn); 
$username = $user->getUsername();

您是如何使用此功能的?$user=新用户($\u会话['logged\u in'])$username=$user->getUsername();哦,又一个可爱的
global$db
.Is
session_start()加载?是的,它是@Fred-ii-我在上面定义$query。好的,然后。。。我错过了,抱歉:D var_在bindValue()之前转储$query以检查它是否是一个对象。如果没有,则没有创建db对象。谢谢您的回答。它帮助了我。