当前位置: 首页 > 面试题库 >

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

叶修永
2023-03-14
问题内容

我正在创建一个基于测验的系统,该系统的一部分包括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?的最佳方法是什么?这样答案就与特定问题有关。谢谢


问题答案:

我个人将获得刚刚插入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());
}


 类似资料:
  • 问题内容: 我想知道是否有一种方法可以完全在sql中执行此操作: 注意: q1将返回约3万行。 有什么办法可以在直式sql中完成上述操作?要直接从一个表(基本上是原始数据表)中提取数据并插入到另一个表(基本上是已处理数据表)中? 问题答案:

  • 问题内容: 这是场景: 我正在尝试在插入表时创建引用记录。但是我得到的是null,因为它是自动从序列中生成的。我也尝试了触发器插入,但是结果是一样的。有什么办法解决吗? 问题答案: 避免使用规则,因为它们会再次咬住您。 在每行运行的表a上使用after触发器。它看起来应该像这样(未经测试):

  • 问题内容: 我正在使用PDO 进行SQL查询的注册表单。插入之后,我想提取刚刚创建的(自动递增,主键),并将其放入另一个表(“确认代码”表)中。 但是,如何确定该用户名不是第二位用户的用户名,后者在第一位用户之后的1/1000秒内注册呢? 我应该找到某种方法锁定桌子吗?我应该使用交易吗? 问题答案: 返回 在该连接 上插入的最后一行的标识符,因此并发用户(与数据库具有不同的连接)不会受到干扰。

  • 问题内容: 是否可以在带有子选择的mysql 5.0上运行UPDATE命令。 我要运行的命令是这样的: ISBN13当前存储为字符串。 这应该更新10k +行。 谢谢, 威廉 问题答案: 只需更改一下即可:

  • MySQL中有两个表,如下所示: 请注意,category_id是类别表中category_key的FOREIGN KEY 我想在第三个表(名为“catalog”)中插入目录项,这样每个目录ID都将从其类别和子类别ID生成,每个类别子类别ID的串联编号都会自动递增。 例如: 假设“categories”表中有一行的categories_键为“ABC”,而“sub_categories”表中也有一行

  • 问题内容: 我有这段代码可以从“ jobseeker”表中选择所有字段,并可以通过将userType设置为“ admin”来更新“ user”表,其中userID =$ userID(此userID是我用户中的一个用户数据库)。然后,该语句应将这些值从“ jobseeker”表插入到“ admin”表中,然后从“ jobseeker表”中删除该用户。sql表很好,我的语句正在将userType更改