2016-11-29 81 views
0

我一直停留在這個約30分鐘,我不知道如果IM俯瞰什麼,但我不斷收到以下錯誤(主要是意味着我的SQL無效):IF ELSE不適用於MySQL?

Fatal error: Call to a member function bind_param() on a non-object...

SQL:

IF (SELECT value FROM votes WHERE thread = ? AND owner = ?) THEN 
    UPDATE votes SET (value = ?) WHERE thread = ? AND owner = ? 
ELSE 
    INSERT INTO votes (thread, owner, value) VALUES (?, ?, ?) 
END IF 

PHP:

$stmt = $this->database->prepare("IF (SELECT value FROM votes WHERE thread = ? AND owner = ?) THEN UPDATE votes SET (value = ?) WHERE thread = ? AND owner = ? ELSE INSERT INTO votes (thread, owner, value) VALUES (?, ?, ?) END IF"); 
$stmt->bind_param("dddddddd", $this->id, $userId, $value, $this->id, $userId, $this->id, $userId, $value); 
$stmt->execute(); 

根據MySQL的文檔,我應該是正確的?

IF search_condition THEN statement_list 
    [ELSEIF search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END IF 
+0

您正在使用庫MySQLi或PDO(用PHP檢查)? –

+0

@ErolKESKİNMySQLI –

+1

@CodeCaster Nope。另一個線程正在討論如何獲取錯誤。這是關於爲什麼錯誤正在發生以及如何避開它 – Machavity

回答

4

IF聲明僅適用於編程塊 - 存儲過程,函數和觸發器。

你可以做你想要on duplicate key update什麼:

INSERT INTO votes (thread, owner, value) 
    VALUES (?, ?, ?) 
    ON DUPLICATE KEY UPDATE value = VALUES(value); 

對於這個工作,你應該定義在thread/owner唯一鍵/約束:

create unique index unq_votes_thread_owner on votes(thread, owner); 
+0

'IF'在'SELECT'和'UPDATE'中工作。但你的方法是首選。甚至比'REPLACE'更好。 – DanFromGermany

+1

@DanFromGermany。 。 。不要將'IF()'*函數*與'IF'語句混淆。 –

+0

工程就像一個魅力! –

2

不,你可以」不要這樣做。

您提到的if syntax是存儲過程/函數(而不是查詢)。

您可以使用兩種不同的查詢爲:

  1. 選擇(SQL
  2. 檢查結果(PHP)。根據結果​​
  3. 插入/更新(SQL
+0

我希望我可以在一個查詢中做到這一點(越少越好:)) –

+0

將欣賞來自downvoter的評論... – Dekel

+1

@HunterMitchell,根據情況你可以使用'replace into'語法,但它真的取決於你的數據。 – Dekel