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

Php 使用PDO插入时来自另一个表的ID,php,mysql,sql,pdo,insert,Php,Mysql,Sql,Pdo,Insert,我正在创建一个基于测验的系统,其中包括两个表: 答复(银行表格): +-------+---------+----------+ | ab_id | ab_name | ab_qb_id | +-------+---------+----------+ +-------+-------------+ | qb_id | qb_question | +-------+-------------+ 和一个问题库表: +-------+---------+----------+ | ab_id

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

答复(银行表格):

+-------+---------+----------+
| ab_id | ab_name | ab_qb_id |
+-------+---------+----------+
+-------+-------------+
| qb_id | qb_question | 
+-------+-------------+
和一个问题库表:

+-------+---------+----------+
| ab_id | ab_name | ab_qb_id |
+-------+---------+----------+
+-------+-------------+
| 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();

然而,我的问题是
answer\u bank
表中的
ab\u qb\u id
总是插入
0
,而不是与
qb\u id
相同的id。这是不正确的方法吗?答案表包含
qb_id
的最佳方式是什么?。。。所以答案与一个特定的问题有关。谢谢

我会亲自获取刚刚插入
问题库
表的行ID,然后将该ID用作插入
答案库.ab\u qb\u 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();
try{
    $db->beginTransaction();
    //Your current queries
    $db->commit();
}catch(Exception $e){
    $db->rollback();
    die($e->getMessage());
}
使用此方法将确保
问题库.qb\u id
答案库.ab\u qb\u id
相同。为了确保任何中断(电源浪涌、磁盘故障等)都不会影响这一点,您可以将它们包装在事务中。然后可以确保这些值始终匹配

EDIT我忘了将
try{}catch{}
语句添加到事务中:

例如:

$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();
try{
    $db->beginTransaction();
    //Your current queries
    $db->commit();
}catch(Exception $e){
    $db->rollback();
    die($e->getMessage());
}

你用的是两种不同的表格吗?只有一种表格,我应该用两种吗@弗雷德二世真的很难说,到底填了什么还是没填。如果其中一个没有被填满,那就是我怀疑正在发生的事情;它保留为空,并且您的列的默认值为0。确保所有表单元素都有各自的和匹配的名称属性。是否有一个
$\u POST['qb\u id']
,或者生成的
$qb\u id
只是空的,并且依赖于数据库的自动增量值?这听起来至少是这样的…@Fred ii-qb_id将问题插入银行表格,echo在页面上很好。但它会在银行表中插入0。这只是一个标准的int行。您可能想补充一点,这可能是因为没有
$\u POST['qb\u id']
;这就是为什么在第一个查询中插入值,但在第二个查询中不插入值。因此,只有问题需要插入firest查询中。@jeroen,这基本上就是我之前告诉OP的;-)@jeroen“很难说真话,也很难说到底有没有人填写。如果其中一个没有填写,那就是我怀疑正在发生的事情”——)这就是我的意思。和“确保所有表单元素都有各自的和匹配的名称属性”@Fred ii-这是漫长的一天:-)这是我能做的最好的事情,就浓缩咖啡的双镜头而言|__|