行がすでに存在するかどうかによって、データベースを更新しようとしています。sql BEGINでエラーが発生する
私はこの文字列を作成し、私の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;
これはエラーを返します。
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BEGIN UPDATE voted_source SET updown = TRUE WHERE ID = '1'at line 4' in voteSource.php:74 Stack trace: #0 voteSource.php(74): PDOStatement->execute(Array) #1 {main} thrown in voteSource.php on line 74;
ユーザーSELECT INSERTとUPDATEの権限を持ちます。どんな助けも大いに評価されています。
可能性のある重複した[PDOパラメータ化クエリ - ?リユースという名前のプレースホルダ](https://stackoverflow.com/questions/2432084/pdo-parameterized-query-reuse-named-placeholders) – chiliNUT
あなたは、再使用はできませんという名前パラメータは ':sourceID'を5回使用し、':userID'を2回使用します。第2パラグラフを参照してください:http://php.net/manual/en/pdo.prepare.php – chiliNUT
あなたのコードは競合状態になりがちです(ロックによって何らかの形で保護されていない場合、スニペットには表示されません)。 EXISTS(...)によってテストされたばかりの行は、テストの直後に別の接続によって挿入される可能性があります。この場合、行が2回挿入されるか、エラーが発生します(ユニークなインデックスが影響を受けている場合)。 – Binarus