我正在创建一个基于测验的系统,其中一部分包括两个表:
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();
但是我遇到的问题是ab_qb_id
表中的answer_bank
始终会插入0
而不是qb_id
的ID。这是不正确的方法吗?答案表包含qb_id
的最佳方法是什么?...那么答案就与特定问题有关。谢谢
答案 0 :(得分:4)
我个人会获得刚插入answers_bank.ab_qb_id
表中的行的ID,然后使用该ID作为您插入$db->lastInsertId()
列的值。因为您使用的是PDO,所以可以使用:$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());
}
语句添加到交易中:
例如:
sqrt(number)