我似乎无法弄清楚问题是什么。我对交易还很陌生,似乎我需要一个插入下一个自动递增的ID。
这是查询:
START TRANSACTION;
INSERT INTO posts (title, text, user, club, time)
VALUES ('$title', '$text', '$name', '$club', '$time');
INSERT INTO post_likes (user, post)
VALUES ('$name', LAST_INSERT_ID());
COMMIT;
语法错误使我在INSERT INTO帖子发布之前就被切断了。
最佳答案
PDO的query()
和prepare()
方法每次执行仅支持单个SQL语句,但是通过调用START TRANSACTION/COMMIT
以及指向INSERT
附近错误语法的错误消息,我们必须假定您正在尝试执行所有这些语句。立刻。那是行不通的,因为PDO不会在执行前在;
分隔符上将它们分开。
PDO提供了API方法来处理代码中的事务,而不需要通过PDO::beginTransaction()
和PDO::commit()
执行SQL语句。因此,您必须将两个INSERT
语句分开,并将它们包装在事务方法中,两次调用query()
或prepare()/execute()
。
// Assuming your PDO connection is $pdo...
$pdo->beginTransaction();
$pdo->query("INSERT INTO posts (title, text, user, club, time) VALUES ('$title', '$text', '$name', '$club', '$time')");
$pdo->query("INSERT INTO post_likes (user, post) VALUES ('$name', LAST_INSERT_ID())");
$pdo->commit();
现在,没有看到您的原始PDO代码,我假设您当前如何直接使用变量执行它。我们可以做出重大改进。
PDO对预处理语句提供了出色的支持,从而为防止SQL注入提供了强大的保护。让我们使用命名参数切换对
query()
的两个prepare()/execute()
调用。另外,如果您愿意,可以将$pdo->lastInsertId()
替换为MySQL的本机LAST_INSERT_ID()
。$pdo->beginTransaction();
// Prepare the first statement
$stmt = $pdo->prepare('INSERT INTO posts (title, text, user, club, time) VALUES (:title, :text, :user, :club, :time)');
// Execute the statement with an array of bound values
$stmt->execute(array(':title' => $title, ':text' => $text, ':user' => $user, ':club' => $club, ':time' => $time));
// Prepare & execute the second one
$stmt = $pdo->prepare('INSERT INTO post_likes (user, post) VALUES (:name, :post)');
$stmt->execute(array(':name' => $name, ':post' => $pdo->lastInsertId()));
// Commit it
$pdo->commit();
关于mysql - 简单mysql事务的语法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31063602/