2012-09-20 51 views
7

我正在研究关于mysqli的准备语句,我有两个关于它的问题。mysqli编写语句,如何循环结果集

,因为我是阅读,我想出一个事先准备好的声明的执行顺序看起来像下面这样:

$sql = 'SELECT image_id, filename, caption FROM images WHERE image_id = ?'; 

// connect to the database 
$conn = .... 

$stmt = $conn->stmt_init(); 

$stmt->prepare($sql); 

$stmt->bind_param('i', $id); 

$stmt->execute(); 

$stmt->bind_result($image_id, $filename, $caption); 

// optional: get total of records in the result set 
$stmt->store_result(); 
$numRows = $stmt->num_rows; 

// loop through the result set 
while ($stmt->fetch()) { 
    // code goes here... 
} 

or 

// fetch the result for one record 
$stmt->fetch() 

// free & close 
$stmt->free_result(); 
$stmt->close; 

$conn->close(); 

这是我的第一个问题:

,因为我是读书,这也提到以下内容:

如果不将结果绑定到变量,请使用$ row = $ stmt-> fetch(),并以$ row ['column_name']的形式访问每个变量。所以,

他们有任何优点/缺点使用2种方法之一来循环结果集? 如果没有区别,那为什么还要用$ stmt-> bind_result来绑定结果呢?有什么意思,如果我可以使用$ row = $ stmt-> fetch()来代替?

这里是我的其他问题:

  • $ stmt-> free_result();释放到底是什么? prepare()或store_result()或者其他?
  • $ stmt-> close;我准确地结束了什么? stmt_init()或prepare()还是其他?

希望你的答案都会让我更好地了解准备的语句,所以我可以建立一些安全...

感谢

回答

4
  • $ stmt-> free_result()就像什么名字说:它释放与结果相关的内存。

  • $ stmt-> close关闭语句句柄(实际上是光标),使得无法遍历结果集(再次)。

虽然manual指出:“你应该永远免费使用mysqli_free_result你的结果(),当不需要你的结果对象了”,通常的做法是不使用free_result和关闭的声明。关闭时,不能再使用结果集,或者重新使用它,当php死亡时,无论如何都会释放内存。

+0

如果我想执行另一个查询呢?我是否释放内存并将语句句柄打开?或者我绝对需要关闭语句句柄并重新打开一个新的$ stmt = $ conn-> stmt_init(); ? – Marco

+2

只需执行另一个查询,不需要关闭并且免费。将新结果指定给陈述时,旧结果将关闭并自动释放。 – JvdBerg

+0

好吧,因此更多的查询我基本上需要准备,bind_param,执行,bind_result。对于每个新的查询,不需要stmt_init,只需要一次,就像数据库连接一样,只需要一次。对? – Marco