使用必要的 WHERE 子句时出现“在 bool 上调用成员函数 bind_param()”错误 [重复]
Posted
技术标签:
【中文标题】使用必要的 WHERE 子句时出现“在 bool 上调用成员函数 bind_param()”错误 [重复]【英文标题】:"Call to a member function bind_param() on bool" error when using a necessary WHERE clause [duplicate] 【发布时间】:2020-03-01 21:02:33 【问题描述】:当用户编辑他们的信息时,我试图更新数据库中的条目,但是当我测试它时,它在尝试使用带有 WHERE 子句的 bind_param 语句时抛出了一个错误(因为可能没有任何这样的实例)。我的代码传入当前用户的用户 ID 以在 WHERE 子句中使用,所以无论如何,总会有该用户 ID 的实例,但系统拒绝识别。我的代码如下:
if(preg_match("#^[a-zA-Z0-9\d._-]+$#", $userpassword))
$sql = "SELECT * FROM User WHERE (Email = '$email' and UserID != '$userid')";
$res = $mysqli->query($sql);
if ($res->num_rows > 0)
$row = $res->fetch_assoc();
echo "<script type='text/javascript'>
alert('This email is already in use. For security purposes, you have been signed out.');
window.location.href = '../volunteer.html';
</script>";
else
$sql = "SELECT * FROM User WHERE (UserID = '$userid')";
$res = $mysqli->query($sql);
if ($res->num_rows > 0)
$stmt = $mysqli->prepare("UPDATE User SET FirstName, LastName, Email, Phone, UserPassword WHERE UserID = '$userid' VALUES (?,?,?,?,?)");
$stmt->bind_param("sssss", $firstname, $lastname, $email, $phone, $userpassword);
echo $stmt;
$stmt->execute();
echo "<script type='text/javascript'>
alert('The changes were successfully saved. For security purposes, you have been signed out.');
window.location.href = '../volunteer.html';
</script>";
以及存储信息的数据库:
CREATE DATABASE IF NOT EXISTS VOLUNTEER_HOURS;
USE VOLUNTEER_HOURS;
DROP TABLE IF EXISTS ACTIVITY;
DROP TABLE IF EXISTS USER;
CREATE TABLE IF NOT EXISTS USER(
UserID int NOT NULL AUTO_INCREMENT,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
Email varchar(30) NOT NULL,
Phone bigint NOT NULL,
UserPassword varchar(30) NOT NULL,
PRIMARY KEY (UserID)
) ENGINE = INNODB;
CREATE TABLE IF NOT EXISTS ACTIVITY(
ActivityID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ActivityType varchar(50) NOT NULL,
ActivityDate date NOT NULL,
Length double NOT NULL,
UserID int,
FOREIGN KEY (UserID) REFERENCES USER(UserID)
) ENGINE = INNODB;
如何使用 WHERE 子句编辑当前用户的记录而不抛出此错误?
【问题讨论】:
【参考方案1】:UPDATE
的语法是
UPDATE <table name>
SET <1st column name> = <1st value>
...
<1st column name> = <1st value>
WHERE <conditions>;
VALUES
子句通常用于INSERT
语句中。你似乎把他们弄糊涂了。
所以改变
$stmt = $mysqli->prepare("UPDATE User SET FirstName, LastName, Email, Phone, UserPassword WHERE UserID = '$userid' VALUES (?,?,?,?,?)");
到
$stmt = $mysqli->prepare("UPDATE User SET FirstName = ?, LastName = ?, Email =?, Phone = ?, UserPassword = ? WHERE UserID = ?");
请注意,您还应该参数化用户 ID 和其他查询中的所有其他值。
检查错误。就像这样,您会收到一条消息,指出 $mysqli->prepare()
失败以及原因。
如果密码以明文形式存储:不要这样做。仅存储密码的加盐哈希。
【讨论】:
非常感谢!我必须为这个项目学习 php,所以这对我来说很多都是新的,我非常感谢这样有用的解释。以上是关于使用必要的 WHERE 子句时出现“在 bool 上调用成员函数 bind_param()”错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在MySQL数据库中使用多个WHERE子句值更新多个列值时出现错误。
#1054 - MySQL 中“where 子句”中的未知列“proximite”
UPDATE 查询的 WHERE 子句中的 SELECT 查询 [重复]