使用必要的 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-&gt;prepare() 失败以及原因。

如果密码以明文形式存储:不要这样做。仅存储密码的加盐哈希。

【讨论】:

非常感谢!我必须为这个项目学习 php,所以这对我来说很多都是新的,我非常感谢这样有用的解释。

以上是关于使用必要的 WHERE 子句时出现“在 bool 上调用成员函数 bind_param()”错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

date_part - 当使用where子句时出现错误。

在MySQL数据库中使用多个WHERE子句值更新多个列值时出现错误。

#1054 - MySQL 中“where 子句”中的未知列“proximite”

UPDATE 查询的 WHERE 子句中的 SELECT 查询 [重复]

在 where 子句中使用 case 语句的 Oracle Missing 关键字

使用 Load when 子句时出现问题?