我正在研究关于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()还是其他?
希望你的答案都会让我更好地了解准备的语句,所以我可以建立一些安全...
感谢
如果我想执行另一个查询呢?我是否释放内存并将语句句柄打开?或者我绝对需要关闭语句句柄并重新打开一个新的$ stmt = $ conn-> stmt_init(); ? – Marco
只需执行另一个查询,不需要关闭并且免费。将新结果指定给陈述时,旧结果将关闭并自动释放。 – JvdBerg
好吧,因此更多的查询我基本上需要准备,bind_param,执行,bind_result。对于每个新的查询,不需要stmt_init,只需要一次,就像数据库连接一样,只需要一次。对? – Marco