php - fatal error : Call to a member function prepare() on a non-object

标签 php mysql file loops file-io

我们有一个文档管理应用程序。我在 mysql DB 中加载了 5000 个图像文件。在客户端删除文件夹时需要将其删除。

使用以下代码,

public function delete($dbh){

    $sql = "DELETE FROM fileTable WHERE FID=:fid;
            DELETE FROM file_blobTable WHERE FID=:fid";
    $stmt = $dbh -> prepare($sql);
    $stmt -> bindParam(":fid", $this->fid, PDO::PARAM_INT);
    $this -> fdid = -1; //
    if ($stmt -> execute()) {
        return 0;
    }
    return 1;
}

上面的函数就是这样循环调用的,

// Loop through the folder and delete all the files it contains.

foreach ($files as $fileID) {
     // Get DB handle
     $dbh1 = DB::getWriteDB();

      $f = new File($fileID);
      $f -> delete($dbh1);
}

如果数据库中的图像数量少于 500,那么当我们删除时,这将非常有效。 如果更多,我就会遇到可怕的事情,

"Fatal error: Call to a member function prepare() on a non-object".

最佳答案

为每次调用函数删除生成准备好的语句不仅效率低下,而且很可能是导致错误的原因。您只需要准备一次查询,这是它们存在的两个主要原因之一。您可以使用静态变量:

public function delete($dbh) {
    static $sql = "DELETE FROM fileTable WHERE FID=:fid;
        DELETE FROM file_blobTable WHERE FID=:fid";
    static $stmt = $dbh -> prepare($sql);

或者,因为您无论如何都在使用对象,所以使用类变量:

static protected function getDeleteQuery($dbh) {
    static $sql = "DELETE FROM fileTable WHERE FID=:fid;
        DELETE FROM file_blobTable WHERE FID=:fid";
    if (is_null(self::$queries['delete'])) {
        self::$queries['delete'] = $dbh->prepare($sql);
    }
    return self::$queries['delete'];
}
public function delete($dbh) {
    $stmt = self::getDeleteQuery($dbh);
    ...

关于php - fatal error : Call to a member function prepare() on a non-object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1807295/

相关文章:

php - 文件问题由空格和单引号组成?

file - 更改名称会破坏项目的运行能力! Xcode

java - 如何在Java中组合多个.gz文件?

javascript - php 中不弹出警报

php - MySql 插入到具有最高 ID 的行

php - paypal 成功 url 返回 null

python - 如何在 python 中将 pandas.qcut 作为 sqlalchemy 查询的一部分应用?

php - Symfony 2 + Doctrine 2 覆盖实体配置

mysql - Laravel 查询 : Different where clauses for each select

c# - 使用两个表生成 Crystal 报表