PHP如何检查是否需要关闭MySQLi查询?

PHP如何检查是否需要关闭MySQLi查询?,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我为我正在进行的一个项目创建了一个简单的MySQLi类,以使从数据库拉入和推入数据库更容易、更精简。(也是为了更熟悉PHP中的OOP) 我一直遇到的一个问题是如何尽可能提高效率。我尝试关闭/释放每个查询/语句/结果集。在这样做的过程中,我经常遇到以下错误: Warning: mysqli_result::close(): Couldn't fetch mysqli_result 我想我得到上面的信息是因为它试图连续两次关闭查询 目前,我的班级可以做有准备和无准备的陈述。因此,我尝试在两个位置关

我为我正在进行的一个项目创建了一个简单的MySQLi类,以使从数据库拉入和推入数据库更容易、更精简。(也是为了更熟悉PHP中的OOP)

我一直遇到的一个问题是如何尽可能提高效率。我尝试关闭/释放每个查询/语句/结果集。在这样做的过程中,我经常遇到以下错误:

Warning: mysqli_result::close(): Couldn't fetch mysqli_result
我想我得到上面的信息是因为它试图连续两次关闭查询

目前,我的班级可以做有准备和无准备的陈述。因此,我尝试在两个位置关闭查询/语句。我在准备语句时检查是否已经准备好了语句,如果已经准备好了,我需要在创建新语句之前关闭旧语句,最后在类的析构函数中关闭旧语句

我意识到我可以在拉取并存储结果后关闭查询/语句,但由于一些原因,这看起来很混乱。首先,它消除了重用准备好的语句的可能性。以及不允许我在查询运行后提取有关查询的一些信息,例如受影响的行等

我知道我可以为每个查询存储这些信息,但似乎解决这个问题的正确方法是关闭/释放查询/语句(如果需要进行另一个查询/语句),然后在脚本末尾再次关闭/释放

我试着环顾四周,仔细阅读我应该如何正确地处理这项任务,但我没有想出任何办法

所以我的问题是,是否有必要测试查询或语句是否需要关闭或释放?还是有更好的方法来解决这个问题


感谢任何人提供的帮助或见解。

我认为如果结果集中没有行,应该自动关闭。因此,如果迭代整个结果集,则无需调用
mysqli\u result
。但是,如果只从包含大约100行的结果集中提取第一行,则应该将其关闭。

关闭后,可以将其设置为
null
,并在析构函数中检查null,然后在那里关闭它

显然,只有在确定已完成使用准备好的语句时,才需要将其设为null。

您可以使用或factory类+引用计数来管理语句。这样,您就不需要显式地检查何时关闭任何东西。如果看不到如何使用包装器的细节,就很难深入了解细节。Objective-C的访问器模式也可能有用,它看起来像:

private function unsetStatement() {
    if (isset($this->_stmt)) {
        $this->_stmt->close();
        unset($this->_stmt);
    }
}
function getStatement() {
    return $this->_stmt;
}
function setStatement($stmt) {
    $this->unsetStatement();
    $this->_stmt = $stmt;
}
您只能通过上述函数访问语句成员字段,即使在类中也是如此。实际上,它看起来更像:

-(Statement *)statement {
    return stmt_;
}
-(void)setStatement:(Statement *)stmt {
    [stmt_ release];
    stmt = [stmt retain];
}

这是我用的。如果声明中有任何结果,我知道我需要释放结果:

if($stmt->num_rows() != 0)
{
    $stmt->free_result();

    return FALSE;
}
如果mysqli查询结果已经是
null
,您将在PHP 5中得到以下警告:

 Warning: myfunction(): Property access is not allowed yet in ....
原则上,我们可以使用自定义错误处理程序处理这些情况,或者简单地抑制警告/错误,即
is_object($mysqliqresult)&&&@$mysqliqresult->free()

或者通过
prepare
方法使用mysqli-
语句,而不是直接运行mysqlidblink->查询,如下所示:

$query = "SELECT heptagon,hexagon FROM pentagon ORDER BY hexagon";
$stmt = $dblink->prepare($query);
$stmt->execute();
!$stmt->field_count() && $stmt->free_result();
贾斯汀的建议也不错。

我发现最安全的方法是:

try { 
    $result->close(); 
} 
catch (Exception $exception){}

人力资源管理这似乎有些道理。我在一些测试代码中混混,在执行之后执行
var\u dump
,在获取之后执行另一个。他们打印同样的东西。在收盘后进行
var\u转储时
,虽然您获得了
属性访问权限,但这是不允许的
,因此它显然做了一些不同的事情。不过,从效率的角度来看,这是否有什么不同呢?另外,当我将查询限制为1行时(例如,
limit0,1
),单独调用$stmt->fetch()不会关闭语句。虽然如果我执行
while
循环和
echo
以确认只有一行,它会关闭它。有什么想法吗?这和结束一份声明一样吗?我真的没有问题让事情这么说。我可不想无缘无故地把它关上。我当时的印象是,关闭一个语句并释放结果集是高效处理事情的正确方法。我知道,对于小规模的项目来说,这可能不是最大的交易,尽管如果你的项目看到大量的流量和扩展,这很重要。如果你在这样的条件下工作,那么每一点效率都很重要,那么应该怎么做?