何时关闭Prepared Statement

26

何时在PHP中关闭预处理语句?

示例:

    $query = "insert into web_reviews (title,added_date,reviewer_home_url,read_more_link,summary) values(?,?,?,?,?)";
    $stmt = $this->db->prepare($query);
    $stmt->bind_params($this->title,$this->added_date,$this->reviewer_home_url,$this->read_more,$this->summary);
    $stmt->execute() or die("Cannot add the date to the database, please try again.");
    $stmt->close();

    $stmt = $this->db->prepare("select id from web_reviews where title = ? and read_more = ?");
    $stmt->bind_params($this->title,$this->read_more);
    $stmt->execute();
    $stmt->bind_results($web_review_id);
    $stmt->close();

我应该在此处使用$stmt->close();吗?

编辑:

PHP手册上所写的,以及来自手册的一条评论说:

关闭一个准备好的语句。 mysqli_stmt_close()还会释放语句句柄。如果当前语句有未执行完或未读取的结果,这个函数将取消它们,以便下一个查询可以被执行。

评论:

如果你正在使用bind_param等在循环中重复执行语句进行更大规模的操作。我认为用stmt->close清理它会很好,但在大约250次操作后总是会出错。当我尝试使用stmt->reset时,它对我起作用了。


1
我也很好奇...在关注这个帖子! - Drewdin
2个回答

11

这是close的好用法,特别是您计划进行另一个查询。对于PDO语句和MySQLi语句,我发现在保持整洁方面犯错误几乎总是最好的选择——它可以消除后续潜在的错误。

至于那位有250个操作的先生...我不知道真正的使用场景是什么。为什么他需要查询数据库250次?为什么他不能一次查询250条记录呢?更可能的是,为什么他不能查询25次数据库,每次只查询10条记录呢?


1
你是说这只对清洁有好处吗?因为我遇到了一个问题,当我使用两个prepare语句而没有关闭第一个时,我会得到一个错误(请参见https://dev59.com/gJbfa4cB1Zd3GeqP0_SQ)。不太确定为什么,因为我从未读过这很关键。 - Adam

0

我目前无法评论,所以我只提供一个答案。当您运行查询数据库结果的准备语句时,它不会执行另一个查询,除非您删除它正在存储的当前结果。$result = $stmt->get_result()。 其次,如果您需要保存第一个查询的结果以便稍后使用,则建议使用两个结果集。第一个存储来自$stmt的第一次执行的结果,第二个存储第二次执行的结果。这可能不能直接回答问题,但可以帮助某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接