关闭准备好的陈述有哪些规则?

时间:2011-07-01 19:31:40

标签: php database sqlite

我目前正在使用PHPite的SQLite3类。我注意到SQLite3Stmt::close()以及SQLite3Result::finalize()

调用这些功能是否必不可少?我在调用它们时遇到了一些麻烦,因为我不知道它们何时不再用于我的数据库包装器类中,因为我将不得不经常返回一个SQLite3Result

例如:

function execSomething(){
  $stmt = $db->prepare($sql);
  return $stmt->execute();
}

您是否应该一直关闭准备好的声明?

3 个答案:

答案 0 :(得分:0)

  

我不确切知道它们何时不再在我的数据库中使用   包装类

您可以在PHP包装器类上创建一个调用这些方法的destructor吗?当你的包装器对象被PHP的垃圾收集器销毁时,你将知道你的语句/结果将不再被使用。

答案 1 :(得分:0)

  

我在调用它们时遇到了一些麻烦,因为我不知道它们何时不再在我的数据库包装器类中使用,因为我将不得不经常返回一个SQLite3Result

通常,每次执行查询时都会获得一个新的结果对象。这意味着,您应该在不再需要这个时立即关闭结果集。

但是,您不必自己释放每个资源,因为PHP会在执行结束时为您执行此操作。如果你没有创造许多(意思是......不知道50?)准备好的陈述,我没有看到原因,为什么你应该自己关闭它们。

答案 2 :(得分:0)

我也很好奇,因为对于不熟悉PHP及其SQLite3扩展的人来说,文档并不清楚这些函数实际上是什么做什么(即,当你调用它们时,SQLite中发生了什么? ):

  

SQLite3Stmt::close - 关闭准备好的声明

     

SQLite3Result::finalize - 关闭结果集

在撰写本文时,采用(高度不合格)来源(https://github.com/php/php-src/blob/master/ext/sqlite3/sqlite3.c):

SQLite3Result::finalize处的{p> PHP_METHOD(sqlite3result, finalize)似乎最终会在任何关联的预准备语句上调用sqlite3_reset,并释放一些内部数据结构。

SQLite3Stmt::close处的{p> PHP_METHOD(sqlite3stmt, close)似乎最终释放了该声明的内部数据结构。

因此,据我所知,这似乎是一个管理内部资源和触发sqlite3_reset调用的问题,根据SQLite文档:

  

“... [重置]准备好的语句对象回到其初始状态,准备就绪   被重新执行“

没有评论当您的脚本终止并且您没有调用这些内容时会发生什么,因为我没有尝试过调查它。

所有这一切,我是这个部门的新手,这是我第一次破解PHP源代码,所以我很感激PHP / SQLite3专家踩到这里来纠正任何错误或误导。< / p>