【问题标题】:Need in-depth understanding of mysqli "bind_result()"需要深入了解mysqli“bind_result()”
【发布时间】:2013-10-21 05:09:08
【问题描述】:

我在研究 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),并且我不明白通过 echo 输出的结果是什么?

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

查询场景 - 使用 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;

【问题讨论】:

  • 为什么不直接运行上面的代码看看?
  • @Nirk 如果我也可以提出建议-如果您想回答某些技术,请先尝试使用它。

标签: php mysqli


【解决方案1】:

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

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

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

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

$stmt->bind_result($filmID, $filmName); 

【讨论】:

    【解决方案2】:

    “绑定列”

    引用查询结果的列。

    "数据写入指定变量var1"

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

    供您查询

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

    这些列依次为filmIDfilmName

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

    $stmt->bind_result($filmName); 
    

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

    如果您希望正确绑定电影名称,您可以重新编写查询以使电影名称位于第一位:

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

    或者你可以绑定filmID变量:

    $stmt->bind_result($filmID, $filmName); 
    

    【讨论】:

    • 感谢 Nirk 为我解决了这个问题。因此,发布“必须构建”的示例是一个坏示例。首先,您不需要选择“filmID”,因为它包含在查询的 WHERE 语句中。
    • 那么,如果索引值 3 被绑定到“?”通过 bind_params 函数和数据库“filmID”字段/列,其中记录/行对应于(3)索引,恰好具有“乱世佳人”的电影名称值,然后是我们分配的变量“$filmName”通过使用 bind_result($filmName) 到标记为“filmName”的数据库列将具有“乱世佳人”的值。 Nirk,你让我很开心!非常感谢!!此致,mmtalon。
    • 我的坏尼尔克。这是我的第一篇文章,我不知道我应该点击复选标记。我现在搞定了。再次感谢!
    • 哦,顺便说一句,我发现你的回答很有用;它对我帮助很大。我希望我的问题和你的回答能帮助其他人理解这个功能,就像它对我有帮助一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多