我已经多次审查了这个问题,并且找不到它为什么不起作用的原因希望有人能够揭示我在这里缺少的是我准备好的陈述。
在初始化预准备语句后直接在var_dump
上执行$query
时,它返回false。
$query = $link->prepare("IF (EXISTS(SELECT * FROM banned WHERE ipAddr=? OR uid=?)) THEN UPDATE banned SET isBanned='1', ipAddr=?, uid=?, bannedAt=NOW(), reason=? WHERE ipAddr=? OR uid=? ELSE INSERT INTO banned (isBanned, ipAddr, uid, bannedAt, reason) VALUES('1', ?, ?, NOW(), ?) END IF");
$query->bind_param("sisissisis", $details['IP'], $details['uid'], $details['IP'], $details['uid'], $details['reason'], $details['IP'], $details['uid'], $details['IP'], $details['uid'], $details['reason']);
表格结构
banned
------
id, uid, ipAddr, bannedAt, reason, isBanned
注意:如果这不是达到相同结果的最佳方式,请提供建议
答案 0 :(得分:1)
的MySQL
IF EXISTS
语法仅适用于存储过程。
您可以创建一个存储过程,然后从您的代码中调用它以进行验证并插入或更新。
供参考:mySql If Syntax
如果你在SELECT Queries上使用'IF'函数,它有不同的语法。这是Link
答案 1 :(得分:1)
IF
语句。有关支持的语句的完整列表,请阅读 SQL Syntax for Prepared Statements
恕我直言,你有几个选择
INSERT INTO ... ON DUPLICATE KEY UPDATE
或REPLACE
。你需要有正确的UNIQUE
索引(索引)。存储过程可能看起来像
DELIMITER $$
CREATE PROCEDURE sp_add_banned(IN aIP VARCHAR(15), IN aId INT, aReason VARCHAR(100))
BEGIN
IF (EXISTS(SELECT * FROM banned WHERE ipAddr=aIP OR uid=aId)) THEN
UPDATE banned
SET isBanned='1', ipAddr=aIP, uid=aId, bannedAt=NOW(), reason=aReason
WHERE ipAddr=aIP OR uid=aId;
ELSE
INSERT INTO banned (isBanned, ipAddr, uid, bannedAt, reason)
VALUES('1', aIP, aId, NOW(), aReason);
END IF;
END$$
DELIMITER ;
调整IN
表中定义的banned
参数的数据类型
这是 SQLFiddle 演示。
你的php部分看起来像
$query = $link->prepare('CALL sp_add_banned(?, ?, ?)');
$query->bind_param('sis', $details['IP'], $details['uid'], $details['reason']);
答案 2 :(得分:0)
您可以使用ON DUPLICATE
语法。
以下是文档:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html