php - 调用非对象上的成员函数prepare() PHP 帮助

标签 php mysqli prepared-statement

我正在尝试编写一个 PHP 函数。这很简单。这只是一个查询数据库的准备好的语句,但我无法让它工作。我不断收到错误 Call to a member function prepare() on a non-object.这是代码:

$DBH = new mysqli("host", "test", "123456", "dbname");
function selectInfo($limit, $offset){
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
    $stmt->bind_param("ii", $limit, $offset);
    $stmt->execute();
    }
selectInfo();

每当我调用该函数时,我都会收到该错误。有人可以帮忙吗?

最佳答案

这是一个范围错误。您正在将 $DBH 设为全局变量。所以当你进入函数时,全局变量是不可用的。您有 5 个实际选择。

<强>1。使用全局关键字

function doSomething() {
    global $DBH;
    //...

这不是一个好主意,因为它使维护和测试成为 PITA。想象一下尝试调试该函数调用。您现在需要找出 $DBH 的定义位置,以尝试弄清楚发生了什么......

<强>2。将$DBH作为函数的参数

function doSomething(MySQLi $DBH) {

它的优点是明确。但这仍然不是很好,因为调用代码需要跟踪全局变量。

<强>3。创建一个函数来“获取”$DBH 对象

function getDBH() {
    static $DBH = null;
    if (is_null($DBH)) {
        $DBH = new mysqli(...);
    }
    return $DBH;
}

function doSomething() {
    $DBH = getDBH();
}

这样做的优点是可以完全解决全局变量问题。但也很难拥有多个连接或为其他连接重复使用任何代码。

<强>4。创建一个类来包装数据库访问

class Database {
    public function __construct($host, $user, $pass) {
        $this->DBH = new MySQli($host, $user, $pass);
    }
    public function doSOmething() {
        $this->DBH->foo();
    }
}

这为您封装了一切。所有数据库访问都将通过单个类,因此您无需担心全局变量访问或其他任何事情。

<强>5。使用预构建的类/框架

这是最好的选择,因为您无需担心自己这样做。

数据库访问类:

完整框架:

确实,选择是无穷无尽的。找到你喜欢的东西,然后坚持下去。它确实会让您的生活更轻松......

关于php - 调用非对象上的成员函数prepare() PHP 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463441/

相关文章:

ffmpeg - php-fpm 卡住 ffmpeg exec 上的用户 session

php - mysql 列中的最低自由值

java - 是否可以在 JDBC 中执行 "field IN list"查询,并将列表作为参数传递?

java - 在 Java 的 PreparedStatement 中使用大于或等于 (>=)

php - 通过 PHP REST API 检索 JSON

php - 我应该将应用程序设置存储在一列数组中吗?或者创建一个多列表?

php - 引用 - 这个错误在 PHP 中是什么意思?

php - 这个php 'know'里面的SQL逻辑怎么选什么?

php - 查询在本地机器上工作正常,但在服务器上失败

php - MYSQL PHP session