8

我正在研究 mysqli 准备好的语句,我有 2 个问题。

当我阅读时,我发现准备好的语句的执行顺序如下所示:

$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'] 访问。所以,

使用这两种方法中的任何一种来循环结果集是否有任何优点/缺点?如果没有区别,那么为什么要首先使用 $stmt->bind_result 绑定结果呢?如果我可以改用 $row = $stmt->fetch() 有什么意义?

这是我的另一个问题:

  • $stmt->free_result(); 究竟释放了什么?prepare() 或 store_result() 还是?
  • $stmt->关闭;我到底在关闭什么?stmt_init() 或 prepare() 还是其他?

希望你的回答能让我更好地理解准备好的陈述,这样我就可以建立一些安全的东西......

谢谢

4

1 回答 1

5
  • $stmt->free_result() 就像名字所说的那样:它释放与结果相关的内存。

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

尽管手册声明:“当不再需要结果对象时,您应该始终使用 mysqli_free_result() 释放结果”,但通常的做法是不要使用 free_result 并关闭语句。关闭后,您不能再使用结果集,也不能重用它,当 php 死机时,无论如何都会释放内存。

于 2012-09-20T08:15:22.583 回答