我正在尝试从用户表中获取名称和电子邮件,其中用户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);