关于mysqli预备语句的问题

时间:2011-03-04 23:27:15

标签: php mysql

我有关于mysqli准备语句的基本问题。例如,我想执行SELECT查询,我应该这样做:

<?
$city = "Amersfoort";

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    $stmt->bind_param("s", $city);
    $stmt->execute();
    $stmt->bind_result($district);
    $stmt->close();
}
$mysqli->close();
?>

在上面的代码中,还需要bind_result吗?它到底是做什么的?

另外,每次查询后我是否需要关闭mysqli连接? 感谢。

2 个答案:

答案 0 :(得分:2)

bind_result使得当您迭代查询结果时,结果集中的列会自动映射到局部变量。

例如,假设您执行的查询返回包含三列的结果集,如下所示:

$query = "SELECT Name, CountryCode, District FROM myCity";

您想要执行查询并对结果执行某些操作,例如打印它们:

if ($result = $mysqli->query($query)) {
    while ($row = $result->fetch_row()) {
        printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
    }
}

上述代码的“问题”是$row[0]不是很具描述性。另一种方法是使用bind_result,如下所示:

$query = "SELECT Name, CountryCode, District FROM myCity";

if ($stmt = $mysqli->prepare($query)) {
    $stmt->bind_result($name, $countryCode, $district);

    while ($stmt->fetch()) {
        printf("%s (%s,%s)\n", $name, $countryCode, $district);
    }
}

如您所见,每次拨打bind_result时使用fetch变量$name$countryCode$district会自动填充来自当前结果行。您必须确保一些细节,请阅读the documentation以获取更多信息。

要回答您的其他问题:您不需要,并且确实在每次查询后不得关闭连接(除非您非常清楚自己在做什么)。

答案 1 :(得分:0)

bind_result指定要写入数据的变量。你可以保持连接打开。只需确保在$stmt->fetch()

之后致电$stmt->bind_result($district);

在这里查看示例#1: http://www.php.net/manual/en/mysqli-stmt.bind-result.php