首页 >后端开发 >php教程 >为什么我在 PHP 中收到'在非对象上调用成员函数准备()”错误?

为什么我在 PHP 中收到'在非对象上调用成员函数准备()”错误?

Patricia Arquette
Patricia Arquette原创
2024-11-25 20:07:12542浏览

Why am I getting a

在 PHP 中的非对象错误上调用成员函数prepare()

在 PHP 中,“在非对象错误上调用成员函数prepare()”当您尝试对非对象的变量调用prepare()方法时,会发生“-object”错误。当变量不引用 mysqli 类的实例或 mysqli 对象尚未正确初始化时,通常会发生这种情况。

理解问题

在您的根据提供的代码,当您调用 selectInfo() 函数时,$DBH 变量未初始化为 mysqli 类的对象。这就是您遇到错误的原因。要解决此问题,您可以使用以下任一方法:

方法 1:使用全局范围

global $DBH;
function selectInfo($limit, $offset) {
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}

此方法将 $DBH 声明为全局变量,允许您在 selectInfo() 函数中访问它。然而,它不被认为是最佳实践,因为它会导致全局变量污染。

方法 2:将对象作为参数传递

function selectInfo($DBH, $limit, $offset) {
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
selectInfo($DBH, 10, 20);

此方法直接传递mysqli 对象作为 selectInfo() 函数的参数。它更加明确,并确保对象正确初始化。

方法 3:使用数据库辅助函数

function getDBH() {
    static $DBH = null;
    if (is_null($DBH)) {
        $DBH = new mysqli("host", "test", "123456", "dbname");
    }
    return $DBH;
}

function selectInfo($limit, $offset) {
    $DBH = getDBH();
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}

此方法使用辅助函数来检索mysqli 对象并在必要时初始化它。它确保在调用 selectInfo() 时该对象始终可用。

方法 4:使用数据库类

class Database {
    private $DBH;

    public function __construct($host, $user, $pass, $dbname) {
        $this->DBH = new mysqli($host, $user, $pass, $dbname);
    }

    public function prepare($sql) {
        return $this->DBH->prepare($sql);
    }
}

$db = new Database("host", "test", "123456", "dbname");
$stmt = $db->prepare("SELECT * FROM information LIMIT ?,?");

此方法将数据库连接封装在一个班级。它提供了一种干净且结构化的方式来访问和准备语句。

以上是为什么我在 PHP 中收到'在非对象上调用成员函数准备()”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn