$ stmt-> free_result()的重要性

时间:2013-09-11 17:00:25

标签: php mysql mysqli

$stmt = $mysqli->prepare("SELECT id, expire, status, username FROM username WHERE username= ?");
$stmt->bind_param('s', $username);
$stmt->execute();
// Store the result (so you can get the properties, like num_rows)
$stmt->store_result();
// Get the number of rows
$amountOfRows = $stmt->num_rows;

// Bind the result to variables
$stmt->bind_result($id, $expire, $status, $db_username);
// Process the variables
while($stmt->fetch()) {
    printf("%d %s %s %s\n", $id, $expire, $status, $db_username);
}

我需要添加

吗?
$stmt->free_result();

怎么样?
$stmt->close();

$mysqli->close();

问题1:我猜答案是肯定的,但我想知道这三者中的每一项是什么,所以我可以更好地理解如何使用它们。

我找不到很多描述他们做什么以及为什么重要的文档。

问题2:我的代码在面值上运行得非常好,那么使用这些代码有什么好处?数据管理,性能,安全性,SQL注入......

1 个答案:

答案 0 :(得分:1)

简短回答:不重要

答案很长:我认为以下命令可以释放内存:

$stmt->free_result();
$stmt->close();
$mysqli->close();

我不确定,所以我测试了它。

echo(memory_get_usage());  // returns 226472

$mysqli = new mysqli(/* credentials */);
$stmt = $mysqli->prepare("SELECT id, username FROM members");
$stmt->execute();
$stmt->store_result();
$amountOfRows = $stmt->num_rows;
$stmt->bind_result($id, $username);

while($stmt->fetch()) {
    printf("%d %s\n", $id, $username);
}

echo(memory_get_usage());  // now returns 230176 (gained 3704)

$stmt->free_result();
echo(memory_get_usage());  // returns 230176 (lost 0)

$stmt->close();
echo(memory_get_usage());  // returns 229816 (lost 360)

$mysqli->close();
echo(memory_get_usage());  // returns 229720 (lost 96)

$stmt->close()$mysqli->close()实际上释放了内存,但它只是一点点。

您的系统不会再受到攻击,因为您选择不写这两条/三条线。它们只释放(小)内存。在您的代码中包含至少$mysqli->close()可能是更好的风格,但这取决于您。

结论:不重要