我正在创建一个基于测验的系统,该系统的一部分包括2个表:
Answer_bank表:
+-------+---------+----------+ | ab_id | ab_name | ab_qb_id | +-------+---------+----------+
和Question_bank表:
+-------+-------------+ | qb_id | qb_question | +-------+-------------+
目的是允许某人创建一个问题和一个答案,答案将以等于的形式存储在答案库表ab_qb_id中qb_id。我不想在同一张表中使用它,因为这会使我变得更加复杂。
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,而不是相同的ID qb_id。这是这样做的不正确方法吗?答案表包括qb_id?的最佳方法是什么?这样答案就与特定问题有关。谢谢
answer_bank
0
我个人将获得刚刚插入questions_bank表中的行的ID,然后使用该ID作为您插入answers_bank.ab_qb_id列中的值。由于您使用的是PDO,因此可以使用:$db->lastInsertId()。例如:
questions_bank
answers_bank.ab_qb_id
$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相同。为确保任何中断(电涌,磁盘故障等)都没有机会影响这一点,可以将它们包装在事务中。然后,您可以确保这些值将始终匹配。
questions_bank.qb_id
编辑 我忘记将try{}catch{}语句添加到事务中:
try{}catch{}
例如:
try{ $db->beginTransaction(); //Your current queries $db->commit(); }catch(Exception $e){ $db->rollback(); die($e->getMessage()); }