我似乎无法弄清问题是什么。我对交易还不熟悉,似乎我需要一个用于插入下一个自动递增的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帖子之前,语法错误会让我失望。
答案 0 :(得分:1)
PDO的query()
和prepare()
方法每次执行仅支持单个SQL语句,但通过调用START TRANSACTION/COMMIT
以及指向{{1附近的错误语法的错误消息我们必须假设你试图一次执行所有这些语句。这不会起作用,因为PDO在执行前不会在INSERT
分隔符上将它们分开。
PDO提供API方法来处理代码中的事务,而不是通过PDO::beginTransaction()
和PDO::commit()
执行SQL语句。因此,您必须将两个;
语句分开,并将它们包装在事务方法中,调用INSERT
或query()
两次。
prepare()/execute()
现在,没有看到你原来的PDO代码,我正在假设你当前如何使用变量直接执行它。 我们可以做出重大改进。
PDO对预准备语句提供了出色的支持,这些语句提供了强大的SQL注入保护。让我们使用命名参数切换对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->lastInsertId()
替换为MySQL的原生query()
。
LAST_INSERT_ID()
答案 1 :(得分:-2)
使用反引号引用时间和用户,这是一个保留字:
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;
如果启用了ANSI SQL模式,则可以使用" (双引号)。