我们有一个文档管理应用程序。我在 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/