检索多列时,预处理语句不起作用

时间:2016-03-03 16:30:20

标签: php mysql

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

编辑:进一步测试时,只有当我从users表,单列或多列中检索内容时才会出现此问题。使用WHERE email/username/name/etc =以外的WHERE userid =会产生相同的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'];

3 个答案:

答案 0 :(得分:1)

此代码应该做得更好。我在评论中为什么会有变化。

// 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;

实际上存在以下问题:

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

答案 1 :(得分:1)

我几乎可以肯定问题在于此代码:

// 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);

如果你是php.net上的mysqli文档的新手是你的好朋友。只需向下滚动到some examples

即可

答案 2 :(得分:0)

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

// Set Parameters
$userid   = $_SESSION['id'];

// Bind
$stmt->bind_param('i', $userid);