使用PDO插入的另一个表中的ID

时间:2016-02-24 19:57:02

标签: php mysql sql pdo insert

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

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的最佳方法是什么?...那么答案就与特定问题有关。谢谢

1 个答案:

答案 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_idtry{}catch{}相同。要确保任何中断(电源浪涌,磁盘故障等)没有机会影响这一点,您可以将它们包装在事务中。然后,您可以确保值始终匹配。

编辑我忘记将try{ $db->beginTransaction(); //Your current queries $db->commit(); }catch(Exception $e){ $db->rollback(); die($e->getMessage()); } 语句添加到交易中:

例如:

sqrt(number)