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

标签 php mysql sql pdo insert

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

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();

但是我遇到的问题是 answer_bank 表中的 ab_qb_id 始终插入 0 并且与 qb_id< 的 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());
}

关于php - 使用 PDO 插入时来自另一个表的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35611809/

相关文章:

php - 检测 PHP 字符串中的特定日期类型

c++ - SQLite 动态表中的分页

php - 在没有 serviceLocator->get() 方式的情况下,ZF2 中新的依赖注入(inject)方式是否更加低效?

php - 从数据库中提取图像路径并显示图像

php - 在 PDO 中传递多个参数

mysql - 如何使用 mysql 创建表日志触发器?

c# - 如何使用原始文件名作为有效的 Url 发布存储在 SQL 中的文档?

sql - 如何在 SQL Server 2005 中读取 XML 数据

mysql - 如何以最佳 SQL 性能获取最新值(value)

php - MySQL正则表达式匹配