小编典典

使用PDO插入时来自另一个表的ID

sql

我正在创建一个基于测验的系统,该系统的一部分包括2个表:

Answer_bank表:

+-------+---------+----------+
| ab_id | ab_name | ab_qb_id |
+-------+---------+----------+

和Question_bank表:

+-------+-------------+
| qb_id | qb_question | 
+-------+-------------+

目的是允许某人创建一个问题和一个答案,答案将以等于的形式存储在答案库表ab_qb_idqb_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_idanswer_bank表总是插入0,而不是相同的ID
qb_id。这是这样做的不正确方法吗?答案表包括qb_id?的最佳方法是什么?这样答案就与特定问题有关。谢谢


阅读 147

收藏
2021-04-28

共1个答案

小编典典

我个人将获得刚刚插入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_idanswers_bank.ab_qb_id相同。为确保任何中断(电涌,磁盘故障等)都没有机会影响这一点,可以将它们包装在事务中。然后,您可以确保这些值将始终匹配。

编辑 我忘记将try{}catch{}语句添加到事务中:

例如:

try{
    $db->beginTransaction();
    //Your current queries
    $db->commit();
}catch(Exception $e){
    $db->rollback();
    die($e->getMessage());
}
2021-04-28