我在SQL交易中收到Uncaught PDO Exepction错误

时间:2020-05-10 16:03:37

标签: php mysql pdo

此代码:

$sql = '
    START TRANSACTION;
    INSERT INTO translation (lang, author, title, text)
      VALUES(:lang, :author, :title, :text);
    INSERT INTO article (translation, author, category, views, banner, visible) 
      VALUES(LAST_INSERT_ID(), :author, :category, 0, :banner, :visible);
    COMMIT;';


    $params = array("lang" => $lang, 
                    "author" => $author, 
                    "title" => $title, 
                    "text" => $content, 
                    "category" => $category, 
                    "banner" => $banner, 
                    "visible" => $v);


    $stmt = $conn->prepare($sql);
    $stmt->execute($params);

给我这个错误:

Fatal error: Uncaught PDOException: 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 'INSERT INTO translation (lang, author, title, text) VALUES(?, ?, ?, ?); ' at line 2 in C:\xampp\htdocs\admin\add-article.php:57 Stack trace: #0 C:\xampp\htdocs\admin\add-article.php(57): PDO->prepare('\r\n START TRA...') #1 {main} thrown in C:\xampp\htdocs\admin\add-article.php on line 57

这是我第一次尝试使用PDO Transactions。我直接在phpMyAdmin中尝试了此sql

BEGIN;
    INSERT INTO translation (lang, author, title, text)
      VALUES(1, 2, "test", "test");
    INSERT INTO article (translation, author, category, views, banner, visible) 
      VALUES(LAST_INSERT_ID(), 2, 1, 100, "", 1);
COMMIT;

它有效,但是在php脚本中不起作用。我根据this post写了“开始交易” 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要分别运行每个查询。

此外,通常将事务包装在try catch中。

 try {
    $pdo->beginTransaction();
    $sql = 'INSERT INTO translation (lang, author, title, text)
        VALUES(:lang, :author, :title, :text)';
    $params = array("lang" => $lang, 
                    "author" => $author, 
                    "title" => $title, 
                    "text" => $content, 
    );
    $stmt = $conn->prepare($sql);
    $stmt->execute($params);    

    $sql = 'INSERT INTO article (translation, author, category, views, banner, visible) 
        VALUES(LAST_INSERT_ID(), :author, :category, 0, :banner, :visible)';
    $params = array(
                    "author" => $author, 
                    "category" => $category, 
                    "banner" => $banner, 
                    "visible" => $v
    );
    $stmt = $conn->prepare($sql);
    $stmt->execute($params);    

    $pdo->commit();
}catch (Exception $e){
    $pdo->rollback();
    throw $e;
}