2

在研究了 php.net 之后,我仍然感到困惑。

来自 php.net:mysqli_stmt::bind_result - mysqli_stmt_bind_result - 将变量绑定到预准备语句以存储结果,并将结果集中的列绑定到变量。

我的不确定性: “绑定列” - 哪些列?PHP 是否将变量(var1、var2 等)放入列中。列是否引用数据库中的列?同时,我将研究与 myqli bind_result() 相关的专栏。

来自 php.net: 当调用 mysqli_stmt_fetch() 来获取数据时,MySQL 客户端/服务器协议将绑定列的数据放入指定的变量 var1, ....

我的不确定性: “将数据写入指定变量 var1” - 什么数据?这是用户提供的数据吗?这是 bind_result($x) 生成并返回的数据吗(神奇地?)

我还尝试通过来自有类似问题的成员的 Stackoverflow 帖子了解此功能 - (使用 bind_result 推入数组)在 6 月 17 日 20:36 jskidd3 询问 - 虽然他的代码示例与我的非常相似,他的问题不像我在这里的问题那么基本。

我试图深入了解 mysqli“bind_result()”函数,但我不知道表面上发生了什么。那么,这个函数的目的是什么?另外,你能从理论上说明在绑定结果之后准备语句会是什么样子吗?如果可能的话,你能澄清一下我在 PHP.net 网站上留下的歧义吗?您可以使用我从http://www.mustbebuilt.co.uk/2011/11/17/mysqli-cheatsheet/获得的以下示例。

在下面的示例中,我不明白 $filmName 的什么值被传递给 bind_result($filmName),而且我不明白通过回显输出的结果是什么?

我非常感谢您的帮助并帮助我了解此功能的情况。谢谢!!

查询场景 - 使用 prepare 从用户输入中提取一行:

$stmt = $mysqli->prepare("SELECT filmID, filmName FROM movies WHERE filmID = ?");
$stmt->bind_param('i', $_GET['filmID']);
$stmt->execute(); 

//what value is being passed - and where is $filmName(and it's value) coming from?
$stmt->bind_result($filmName); 
$stmt->fetch();
$stmt->close();

//resulting value or output displayed? 
echo $filmName;
4

2 回答 2

0

当您在 PHP 中执行以下语句时,结果将存储在 MySQL 中,而不是 PHP 中。二进制 MySQL 协议的工作方式是,您需要从语句中获取每一行,直到 MySQL 告诉您没有更多内容需要获取。

$stmt = $mysqli->prepare("SELECT filmID, filmName FROM movies WHERE filmID = ?");
$stmt->bind_param('i', $_GET['filmID']);
$stmt->execute(); 

mysqli 扩展的设计者认为,如果不是获取 PHP 数组,而是每次调用fetch()方法时,将来自 MySQL 服务器的数据绑定到单独的变量中,这将是一个好主意(不是)。变量需要使用bind_result()方法绑定。该方法将创建变量,并且每次fetch()调用时都会将来自 MySQL 的数据分配给 PHP 变量。如果数据存储在 PHP 中,那么数据将从内部缓冲区中获取。

这些列是指您在SELECT语句中指定的列列表。变量的绑定顺序与列在 SQL 中列出的顺序相同。您正在选择两列filmID, filmName,因此理想情况下您应该为 PHP 提供两个变量以将数据插入其中。

$stmt->bind_result($filmID, $filmName); 
于 2020-05-22T18:39:58.183 回答
-1

“绑定列”

指查询结果的列。

“将数据放入指定的变量 var1”

当您执行 fetch (like $stmt->fetch()) 时,绑定的变量会根据绑定分配值。您不需要每次都显式分配值。

为您查询

$stmt = $mysqli->prepare("SELECT filmID, filmName FROM movies WHERE filmID = ?");

这些列按顺序是filmID, filmName

当您调用 时bind_result,它将第一个变量绑定到结果中的第一列。在这种情况下,

$stmt->bind_result($filmName); 

实际上最终将变量绑定$fileName到该filmID字段。

如果您希望正确绑定电影名称,您可以重新编写查询,以便首先设置电影名称:

$stmt = $mysqli->prepare("SELECT filmName, filmID FROM movies WHERE filmID = ?");

或者您可以绑定filmID 变量:

$stmt->bind_result($filmID, $filmName); 
于 2013-10-21T05:54:13.767 回答