2016-11-29 51 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