2013-05-27 101 views
0

我已經查看了幾次,找不到一個原因,爲什麼它不應該工作,希望有人能夠透露我錯過了什麼,這是我準備好的聲明。準備好的mysqli語句中的sql IF語句

在初始化準備好的語句後直接在$query上執行var_dump時,它返回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 

注意:如果這不是來達到同樣的結果,那麼最好的辦法,請提供一個建議

回答

1

IF語句未在MySQL準備好的語句的支持。對於支持語句的完整列表和詳細閱讀SQL Syntax for Prepared Statements

恕我直言,你有幾種選擇

  1. 嘗試使用INSERT INTO ... ON DUPLICATE KEY UPDATEREPLACE。你需要有正確的UNIQUE索引(索引)。
  2. 總結你的代碼放到一個存儲過程

存儲過程可能看起來像

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']); 
+0

乾淨多了藏漢謝謝:) – Ciaran

1

MySQL的

IF EXISTS

語法僅適用於存儲過程。

您可以創建一個存儲過程,然後從您的代碼中調用它來驗證和插入或更新。

供您參考:mySql If Syntax

如果你使用的是「IF」上選擇查詢功能,它有不同的語法。這裏是Link