我尝试根据行是否已存在来更新我的数据库。
在我的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的权限。任何帮助都会受到极大的抨击。
答案 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
。