Sta*_*123 2 php mysql sql pdo insert
我正在创建一个基于测验的系统,其中一部分包括 2 个表:
Answer_bank 表:
+-------+---------+----------+
| ab_id | ab_name | ab_qb_id |
+-------+---------+----------+
Run Code Online (Sandbox Code Playgroud)
和 Question_bank 表:
+-------+-------------+
| qb_id | qb_question |
+-------+-------------+
Run Code Online (Sandbox Code Playgroud)
目的是允许某人创建一个问题和一个答案,答案将存储在答案库表中,其值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();
Run Code Online (Sandbox Code Playgroud)
然而我遇到的问题是ab_qb_id表中answer_bank总是插入0并且与 id 不一样qb_id。这是执行此操作的错误方法吗?答案表包含 的最佳方式是什么qb_id?...这样答案就与特定问题相关。谢谢
我个人会获取刚刚插入表中的行的 ID questions_bank,然后使用该 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();
Run Code Online (Sandbox Code Playgroud)
使用此方法将确保 和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());
}
Run Code Online (Sandbox Code Playgroud)