2009-12-19 153 views
4

我为我正在努力的一个项目创建了一个简单的MySQLi类,使它更容易和更简化,以便从数据库中提取并推送到数据库。 (也可以更熟悉PHP中的OOPPHP如何检查MySQLi查询是否需要关闭?

我不断遇到的一个问题是努力使其尽可能高效。我尝试关闭/释放每个查询/语句/结果集。在此过程中,我得到以下错误很多:

Warning: mysqli_result::close(): Couldn't fetch mysqli_result 

我觉得我得到了上述特别是因为它试图两次关闭查询连胜。

目前,我的课程可以做好准备和准备不足的陈述。所以我尝试关闭2个地方的查询/语句。如果我已经准备好一份声明,我会在准备一份声明时检查一下,如果是这样的话,我需要先关闭一个声明,然后再做一个新声明,最后再在课堂的析构函数中进行。

我意识到我可以关闭查询/语句后,我拉和存储的结果,但这似乎是混乱的原因有几个。对于一个它删除了重复使用准备好的语句的可能性。以及不允许我在运行后查询某些查询的相关信息,例如受影响的行等。

我知道我可以只为每个查询存储这些信息,但不过它似乎正确的方式去解决这个问题将关闭/释放查询/语句,如果我需要做另一个,并且再次在脚本的末尾。

我已经试过环顾四周,阅读我应该如何妥善处理这个任务,但我一直未能拿出任何东西。

所以我的问题是,有无论如何测试是否需要关闭或释放查询或语句?还是有更好的方法我应该试图解决这个问题?

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

回答

1

我认为如果结果集中没有剩余行,它应该自动关闭。因此,如果您遍历整个结果集,则无需致电mysqli_result。但是,如果您只读取包含约100行的结果集中的第一行,则应该关闭它。

+0

这似乎有点真实。我正在搞一些测试代码,在执行完后执行'var_dump',取出后执行另一个测试代码。他们打印相同的东西。当关闭后执行'var_dump'时,虽然你得到'属性访问不被允许',所以它显然做了一些不同的事情。虽然如果它有什么不同的效率明智的问题呢? 另外,当我将查询限制为1行(例如'LIMIT 0,1')时,它自己调用$ stmt-> fetch()不会关闭语句。虽然如果我做'while'循环和'echo'来确认只有一行,它会关闭它。 任何想法? – anomareh 2009-12-19 08:23:39

0

关闭它后,您可以将它设置为null,然后在关闭它之前在析构函数中检查null。

显然,只有在确定已经完成使用时才需要清空已准备好的语句。

+0

这是否与关闭声明相同?我真的没有任何问题,让事情可以这么说。我绝不会确定它无缘无故关闭。我只是觉得,结束语句和释放结果集是处理效率问题的正确方法。我知道,对于小事情来说,这可能不是最大的交易,但如果你的项目看到很多流量和扩展,那么它很重要。如果你在这样的条件下工作,那么每一点效率都是重要的,那么正确的做法是什么? – anomareh 2009-12-19 08:31:24

0

您可以使用RAII或工厂类+引用计数来管理语句。这样你就不需要明确地检查什么时候关闭任何东西。没有看到你如何使用包装器的细节,很难进入细节。 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]; 
} 
0

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

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

    return FALSE; 
} 
0

如果mysqli的查询结果已经null,你会得到以下警告在PHP 5:

Warning: myfunction(): Property access is not allowed yet in .... 

原则上一个可以处理这些案件有一个自定义错误处理或简单地抑制警告/错误,即is_object($mysqliqresult) && @$mysqliqresult->free()

或者使用mysqli- statements经由prepare方法,而然后直接运行mysqlidblink->查询,如下所示:

$query = "SELECT heptagon,hexagon FROM pentagon ORDER BY hexagon"; 
$stmt = $dblink->prepare($query); 
$stmt->execute(); 
!$stmt->field_count() && $stmt->free_result(); 

贾斯汀的建议是没关系。