绑定后不从 mysqli 语句输出变量

variables are not output from mysqli statement after binding

我正在尝试 select 我的数据库中的内容并回显它们。出于某种原因,我唯一可以回应的就是电子邮件。 id 和用户名不显示。我没有收到任何错误,它们只是没有出现。

 $sql = "SELECT id, email, username FROM users WHERE email = ?";
    if ($stmt = mysqli_prepare($link, $sql)) {
      mysqli_stmt_bind_param($stmt, "s", $param_email);
      $param_email = $email;
      if (mysqli_stmt_execute($stmt)) {
        mysqli_stmt_store_result($stmt);
        if (mysqli_stmt_num_rows($stmt) == 1) {
          mysqli_stmt_bind_result($stmt, $id, $email, $username);
          $error = 0;
          $to = $email;
          echo "id:".$id;
          echo $username;
          echo $email;
        } else {
         //some stuff
        }
      } else {
        $error = 1;
      }
    }

我错过了什么?

您看不到从数据库中提取的任何值的原因是您忘记在 bind_result() 之后调用 fetch()

但是,你把事情复杂化了。您不需要那么多 if 语句,如果您有多个列,则不应使用 bind_result()。这变得非常混乱。使用 get_result() 获取结果,然后获取您需要的单行(假设电子邮件是唯一的并且您的 SELECT return 有 0 或 1 条记录)。

$stmt = $link->prepare("SELECT id, email, username FROM users WHERE email = ?");
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result()->fetch_assoc();

if ($result) {
    $error = 0;
    $to = $result['email'];
    echo "id:".$result['id'];
    echo $result['username'];
    echo $result['email'];
} else {
    $error = 1;
}

不需要mysqli_stmt_num_rows。数据本身会告诉您某些内容是否被 return 编辑。这也可以防止您在使用无缓冲查询时遇到类似的问题。很容易不小心遗漏了mysqli_stmt_store_result().

永远不要检查 mysqli_stmt_execute()mysqli_prepare() 的 return 值。这是一种可怕而混乱的做法。确保您已打开错误报告。参见 How to get the error message in MySQLi?