sql BEGIN创建错误

时间:2017-09-14 19:25:19

标签: php mysql sql pdo

我尝试根据行是否已存在来更新我的数据库。

在我的php文件中,我创建了这个字符串:

 IF EXISTS(SELECT updown
              FROM voted_source
              WHERE ID = ? AND userID = ?)
                BEGIN
                    UPDATE voted_source
                    SET updown = TRUE
                    WHERE ID = ?;

                    UPDATE source
                    SET score_up = score_up + 1, 
                        score_down = score_down - 1
                    WHERE ID = ?;
                END;
                ELSE
                BEGIN
                    INSERT INTO voted_source (ID, userID, updown)
                    VALUES (?, ?, TRUE);

                    UPDATE source
                    SET score_up = score_up + 1,
                        score_down = score_down - 1
                    WHERE ID = ?;
                END

我用pdo这样称呼它:

$pdo = new PDO('mysql: host='.$servername.';dbname='.$db, $user, $pass, array(
        PDO::ATTR_PERSISTENT => true
    ));
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $pdo->beginTransaction();

    $stmt = $pdo->prepare($sqlString);
    $stmt->execute([$sourceID, $userID, $sourceID, $sourceID, $sourceID, $userID, $sourceID ]);

    $pdo->commit();

    $pdo = null;

这将返回错误:

  

致命错误:未捕获的异常' PDOException'与消息   ' SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MariaDB服务器版本,用于在“BEGIN UPDATE”附近使用正确的语法   voted_source SET updown = TRUE WHERE ID =' 1' at line 4' in voteSource.php:74堆栈跟踪:#0 voteSource.php(74):PDOStatement->执行(数组)#1 {main}在第74行的voteSource.php中抛出;

用户拥有SELECT INSERT和UPDATE的权限。任何帮助都会受到极大的抨击。

1 个答案:

答案 0 :(得分:0)

看起来您已经从您在某处找到的存储过程示例中复制并粘贴了代码,然后根据您的需要对其进行了更改。从MySQL手册的“13.6.1 BEGIN ... END复合语句语法”(see here)部分:

  

BEGIN ... END语法用于编写复合语句,它可以出现在存储的程序(存储过程和函数,触发器和事件)中。 [...]

我理解这一点是因为BEGIN ... END 不能在正常查询中使用,而存储过程和函数,触发器和事件;因此错误消息。在您的情况下,您不需要它们,所以请将它们留下。

此外,从MySQL手册的“13.6.5.2 IF语法”(see here)部分:

  

IF search_condition THEN statement_list
  [ELSEIF search_condition THEN statement_list] ...
  [ELSE statement_list]
  结束如果

所以你真的应该在END IF末尾的新行添加$sqlString