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

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?...这样答案就与特定问题相关。谢谢

Mic*_*ael 5

我个人会获取刚刚插入表中的行的 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)

  • 您可能需要补充一点,这可能会发生,因为没有 `$_POST['qb_id']`;这就是为什么值被插入到第一个查询中而不是第二个查询中。因此,只需将问题插入第一个查询中。 (2认同)
  • @jeroen *“真的很难说到底填写了什么或没有填写什么。如果其中之一没有被填写,那么这就是我怀疑正在发生的事情”*;-) 这就是我的意思。和*“确保所有表单元素都有各自且匹配的名称属性”* (2认同)
  • @Fred-ii-这是漫长的一天:-) (2认同)
  • 就双杯浓缩咖啡而言,这是我能做的最好的事情:.C|__| (2认同)