我正在尝试使用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语句,它就可以正常工作。但当运行方式低于此值时,它就不起作用了。我真的不知道我做错了什么。
1条答案
按热度按时间gmol16391#
您的查询包含错误。你想逃跑
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