此代码:
$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写了“开始交易” 有什么想法吗?
答案 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;
}