检索多列时预准备语句不起作用


Prepared statement not working when retrieving multiple columns

我正在尝试从用户表中获取名称和电子邮件,其中用户ID是我在其他地方设置的会话['id']。顺便说一句,将用户 ID 放在会话变量中是一种好的做法吗?

编辑:经过进一步测试,仅当我从用户表,单列或多列中检索内容时,才会发生此问题。使用 WHERE userid = 以外的WHERE email/username/name/etc =会给出相同的 bind_param() 错误。但这仅在使用预准备语句时发生。而且没有错别字。

准备好的声明给了我Fatal error: Call to a member function bind_param() on a non-object.检索一列时,相同的代码(在同一个 php 文件中,就在以下代码下方)工作得很好。

$sessionid = $_SESSION['id'];
// Prepare
$stmt = $conn->prepare('SELECT name, email FROM users WHERE userid = ?');
// Set Parameters
$ps_userid   = $sessionid;
// Bind
$stmt->bind_param("i", $ps_userid);
// Execute
$stmt->execute();
$stmt->bind_result($mail_name, $mail_email);
$stmt->fetch();

'下面的代码工作得很好

$data       = mysqli_query($conn, 'SELECT name, email FROM users WHERE userid='.$_SESSION["id"]);
$row        = mysqli_fetch_array($data, MYSQL_ASSOC);
$mail_name  = $row['name'];
$mail_email = $row['email'];

我几乎可以肯定问题出在这段代码中:

// Bind
$stmt->bind_param('i', $userid);
// Set Parameters
$userid   = $_SESSION['id'];

您不能绑定未定义的变量,因为bind_param引用它并且不能引用未定义的变量,只需交换行即可。

// Set Parameters
$userid   = $_SESSION['id'];
// Bind
$stmt->bind_param('i', $userid);

您的评论对绑定结果也是正确的,请使用$stmt->bind_result($mail_name, $mail_email);

如果你不熟悉mysqli文档,php.net 是你的好朋友。只需向下滚动到一些示例

这段代码应该做得更好。我发表了评论,为什么会有变化。

// first test your connection is valid
if ($conn->connect_error) {
    die('Connect Error: ' . $conn->connect_error);
}
// Prepare, without parentheses around question mark. 
$stmt = $conn->prepare('SELECT name, email FROM users WHERE userid = ?')
      or die($conn->error);
// First Set Parameters(!)
$userid   = $_SESSION['id'];
// Only then: Bind
$stmt->bind_param('i', $userid);
// Execute and show error if any
$stmt->execute() or die($stmt->error);
$stmt->bind_result($mail_name, $mail_email); // needs to be this way
$stmt->fetch() or die ("no results");  // fetch is OK, but make sure you have result.
// output variables have received the result values:
echo $mail_name;
echo $mail_email;

所以实际上存在以下问题:

  • 输入变量在绑定它们之前需要有它们的值,否则为时已晚
  • 绑定的输出变量需要作为单独的参数列出;数组不是这里所期望的。然后,无需进一步处理即可处理这些绑定输出变量。
  • 不需要占位符(?)周围的括号。
  • 执行一些错误检查,显示错误消息。

在绑定参数之前尝试分配$userid值,设置然后绑定

// Set Parameters
$userid   = $_SESSION['id'];
// Bind
$stmt->bind_param('i', $userid);