sql IF语句在准备好的mysqli语句中

时间:2013-05-27 01:58:56

标签: sql mysqli prepared-statement

我已经多次审查了这个问题,并且找不到它为什么不起作用的原因希望有人能够揭示我在这里缺少的是我准备好的陈述。

在初始化预准备语句后直接在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

注意:如果这不是达到相同结果的最佳方式,请提供建议

3 个答案:

答案 0 :(得分:1)

的MySQL

  

IF EXISTS

语法仅适用于存储过程。

您可以创建一个存储过程,然后从您的代码中调用它以进行验证并插入或更新。

供参考:mySql If Syntax

如果你在SELECT Queries上使用'IF'函数,它有不同的语法。这是Link

答案 1 :(得分:1)

Mysql中的预准备语句不支持

IF语句。有关支持的语句的完整列表,请阅读 SQL Syntax for Prepared Statements

恕我直言,你有几个选择

  1. 尝试使用INSERT INTO ... ON DUPLICATE KEY UPDATEREPLACE。你需要有正确的UNIQUE索引(索引)。
  2. 将代码包装到存储过程中
  3. 存储过程可能看起来像

    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