尝试使用php prepared语句和mysqli执行update/insert查询,但没有结果

6tdlim6h  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(412)

我正在尝试使用php将以下代码作为准备好的语句执行:

private function prepQuery(){
$this->prepSQL = $this->con->prepare('
    IF EXIST(SELECT * FROM tablename WHERE reference=?)
        UPDATE tablename
            SET
                column1=?,
                column2=?,
                column3=?
            WHERE reference=?
    ELSE
        INSERT INTO tablename(
            column1,
            column2,
            column3,
            column4
        ) VALUES(?, ?, ?, ?);
');}

代码在对象上下文中执行,其中连接对象是类中的私有字段变量。该函数应将$prepsql字段变量初始化为对象,但出现以下错误:
致命错误:未捕获错误:对布尔值上的成员函数bind_param()调用
代码的目的是读取定期更新的文件(文件大小和字段数据超出我的控制范围,因此使用准备好的语句将是速度和安全性的最佳选择)。代码应该检查数据库中是否存在记录,如果存在,则更新它以包含所做的更改。否则,将文件中的新行插入数据库。
但是,它并不完整,因为它说$prepsql变量是一个布尔值,不能对其调用bind_param方法。
我尝试手动执行sql,效果很好。如果我在代码中使用普通的insert语句,它就可以正常工作。但当运行方式低于此值时,它就不起作用了。我真的不知道我做错了什么。

gmol1639

gmol16391#

您的查询包含错误。你想逃跑 bind_param 在一些不起作用的事情上。
你可能在做:

$this->prepSQL = $this->con->prepare('...');
$this->prepSQL->bind_param()

prepare()方法可以返回false,您应该对此进行检查。至于为什么返回false,可能是表名或列名(在select或where子句中)不正确?
另外,考虑使用类似$this->db->conn->error\u list的方法来检查解析sql时发生的错误(我偶尔会回显实际的sql语句字符串,并粘贴到phpmyadmin中进行测试,但肯定有什么地方失败了。)
也就是说,虽然不是对实际问题的回答,但请听听其他人的意见:
使用 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 比你的if-else语句简单得多。
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

相关问题