【问题标题】:PHP/MySQL Understanding What is Returned by Prepared Statement [duplicate]PHP / MySQL了解Prepared Statement返回的内容[重复]
【发布时间】:2013-08-16 11:02:54
【问题描述】:

我正在构建一个简单的登录脚本并具有以下内容:

$sparklyUsername = strtolower($_POST['sparklyUsername']);
$sparklyPassword = $_POST['sparklyPassword'];

if($stmt = $sparklyDatabaseConnection -> prepare("SELECT username FROM SYS_users WHERE username=?")) {
    
$stmt -> bind_param("s", $sparklyUsername); 
$stmt -> execute(); /* Execute the query */
$stmt -> bind_result($result);
$stmt -> fetch();

现在一切正常,但如果我尝试检索多个列怎么办,例如:

if($stmt = $sparklyDatabaseConnection -> prepare("SELECT username, password, email FROM SYS_users WHERE username=?")) {
     

我收到错误“绑定变量的数量与准备好的语句中的字段数量不匹配”。

现在我已经习惯了 VBScript,这样的查询会返回一个记录集(例如 resultsRS("")),然后您使用列名(例如 resultsRS("username" )) 来获取一个特定的列,但从我可以收集的内容来看,使用上面的代码,我将每个列绑定到一个变量,如下所示:

$stmt -> bind_result($username, $password, $email);

如果是这样,我如何检查 now 行是否已经返回?在 VBScript 中,我会检查记录集是否为空(例如 IF resultsRS.EOF)。

如果我需要遍历所有返回的记录,我看到的所有示例都显示如下:

while ($row = $result->fetch_assoc()) {

但是,如果这似乎从我期望的列中创建了一行!

【问题讨论】:

  • 真的需要$longWindyAndSparklyDatabaseConnection 的所有东西来处理变量吗?
  • 所以你可能不需要绑定结果。只需获取它并遍历获取的结果
  • 你的常识 - 不确定你在这里问什么?为什么我这样命名我的变量?由于我只输入一次并且可能会在其余时间复制和粘贴,因此长度无关紧要,但考虑到我正在编写代码以使其对其他开发人员尽可能清晰,它的描述性/直观性如何 是重要的。 (我正在制作我过去几年开发的 CMS 的 PHP 版本,并计划将其开源)。

标签: php mysqli


【解决方案1】:

Prepared Statement 返回什么

说来话长。书作家通常对此一无所知。

您真正需要知道的是,mysqli 准备好的语句并不打算按原样在应用程序代码中使用,而只是作为更高级别抽象库的源材料。

所以,如果你不打算写一个,就不要使用 mysqli,而是转向PDO。它有更直观的 API 和所有熟悉的方法来获得结果。

$sql  = "SELECT username, password, email FROM SYS_users WHERE username=?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['sparklyUsername']));
$row  = $stmt->fetch();

它确实会创建一个行,您可以像$row['username']那样寻址哪些列

这样,无论请求多少字段,您都可以获得数据。您也可以将 fetch() 放入 while 循环中。

【讨论】:

  • 你的常识 - 太棒了!非常感谢您花时间向我解释这一点,非常感谢。我将获取一些关于 PDO 的教程和信息并完成它们!一切顺利。
【解决方案2】:

在 while 循环中,您将需要具有列名的行,例如

while ($row = $result->fetch_assoc()) {
      echo $row['first_name']; // or whatever your column is called
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2021-08-03
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多