我正在创建一个基于测验的系统,其中一部分包括 2 个表格:
Answer_bank 表:
+-------+---------+----------+
| ab_id | ab_name | ab_qb_id |
+-------+---------+----------+
和 Question_bank 表:
+-------+-------------+
| qb_id | qb_question |
+-------+-------------+
目的是允许某人创建问题和答案,答案将存储在答案库表中,ab_qb_id
等于qb_id
。我不希望它在同一个表中,因为我会让它变得更加复杂。
我尝试使用以下 PDO/SQL 插入到两个表中。
//questions
$qb_id = $_POST['qb_id'];
$qb_question = $_POST['qb_question'];
$sql = "INSERT INTO questions_bank (`qb_id`, `qb_question`)
VALUES (:qb_id, :qtn)";
$stmt = $db->prepare($sql);
$stmt->bindValue(":qb_id", $qb_id);
$stmt->bindValue(":qtn", $qb_question);
$stmt->execute();
//answers
$ab_name = $_POST['ab_name'];
$sql = "INSERT INTO answers_bank (`ab_name`, `ab_qb_id`) VALUES (:ab_name, :qb_id)";
$stmt = $db->prepare($sql);
$stmt->bindValue(':ab_name', $ab_name);
$stmt->bindValue(':qb_id', $qb_id);
$stmt->execute();
但是我遇到的问题是 answer_bank
表中的 ab_qb_id
始终插入 0
并且与 qb_id< 的 ID 不同
。这是执行此操作的错误方法吗?答案表包含 qb_id
的最佳方式是什么?...这样答案就与特定问题相关。谢谢
最佳答案
我个人会获取刚刚插入到 questions_bank
表中的行 ID,然后使用该 ID 作为插入到 answers_bank.ab_qb_id
列中的值。由于您使用的是 PDO,因此可以使用:$db->lastInsertId()
。例如:
$qb_id = $_POST['qb_id'];
$qb_question = $_POST['qb_question'];
$sql = "INSERT INTO questions_bank (`qb_id`, `qb_question`)
VALUES (:qb_id, :qtn)";
$stmt = $db->prepare($sql);
$stmt->bindValue(":qb_id", $qb_id);
$stmt->bindValue(":qtn", $qb_question);
$stmt->execute();
$inserted_id = $db->lastInsertId();
//answers
$ab_name = $_POST['ab_name'];
$sql = "INSERT INTO answers_bank (`ab_name`, `ab_qb_id`) VALUES (:ab_name, :qb_id)";
$stmt = $db->prepare($sql);
$stmt->bindValue(':ab_name', $ab_name);
$stmt->bindValue(':qb_id', $inserted_id); //Use the previously inserted ID
$stmt->execute();
使用此方法将确保 questions_bank.qb_id
和 answers_bank.ab_qb_id
相同。为了确保任何中断(电涌、磁盘故障等)都不会影响此情况,您可以将它们包装在事务中。然后您可以确保这些值始终匹配。
编辑我忘记将 try{}catch{}
语句添加到事务中:
例如:
try{
$db->beginTransaction();
//Your current queries
$db->commit();
}catch(Exception $e){
$db->rollback();
die($e->getMessage());
}
关于php - 使用 PDO 插入时来自另一个表的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35611809/