2017-09-14 24 views
0

行がすでに存在するかどうかによって、データベースを更新しようとしています。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の権限を持ちます。どんな助けも大いに評価されています。

+0

可能性のある重複した[PDOパラメータ化クエリ - ?リユースという名前のプレースホルダ](https://stackoverflow.com/questions/2432084/pdo-parameterized-query-reuse-named-placeholders) – chiliNUT

+0

あなたは、再使用はできませんという名前パラメータは ':sourceID'を5回使用し、':userID'を2回使用します。第2パラグラフを参照してください:http://php.net/manual/en/pdo.prepare.php – chiliNUT

+0

あなたのコードは競合状態になりがちです(ロックによって何らかの形で保護されていない場合、スニペットには表示されません)。 EXISTS(...)によってテストされたばかりの行は、テストの直後に別の接続によって挿入される可能性があります。この場合、行が2回挿入されるか、エラーが発生します(ユニークなインデックスが影響を受けている場合)。 – Binarus

答えて

0

どこかにあるストアドプロシージャのコードからコードをコピー&ペーストして、必要に応じて変更したようです。 MySQLのマニュアルからは、セクション(see here)「13.6.1は... END複合文の構文BEGIN」:

BEGIN ... END syntax is used for writing compound statements, which can appear within stored programs (stored procedures and functions, triggers, and events). [...]

私は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の最後に新しい行にEND IFを追加する必要があります。

関連する問題