【发布时间】:2012-02-07 17:33:38
【问题描述】:
我正在尝试通过 PHP 将一些数据插入到关系数据库(使用 InnoDB 引擎的 MySQL)中,并使用下面的表和列。
- 测验(ID,姓名)
- 问题(quiz_id、id、姓名)
- 答案(question_id, id, name)
主键id都是自增的。
这将允许我搜索特定测验,然后获取属于该测验的问题以及(反过来)属于这些问题的多项选择可能答案。每个问题至少有两个可能的答案。
我正在创建一个允许用户创建新测验的界面。我已经看到了如何使用事务和 LAST_INSERT_ID() 来确保主键匹配的示例,但是 当有多个依赖于前一个“父级”的插入时,它无法正常工作(可能的答案必须与正确的问题相关联)。
即该过程将是:
插入新测验
使用测验 ID 插入问题
使用问题 ID 插入该问题的所有可能答案
重复步骤 2 和 3,直到输入所有问题和答案,然后提交事务
我试图在 PHP 中对此进行概述。问题和答案通过 POST 作为字符串提供,以逗号分隔。我使用 explode() 将它们转换为数组,然后将变量分配给数组中的每个值。我已经开始使用 for 循环,我认为它原则上适用于问题,但不适用于答案。
$dbc = @mysqli_connect($host, $user, $password, $db) or die ('Could not connect to MySQL: ' . mysqli_connect_error());
$qN= ($_POST['quizName']);
$quizName = mysqli_real_escape_string($qN);
$qu = ($_POST['question']);
$question = mysqli_real_escape_string($qu);
$questionArray = explode(',', $question);
$numberQuestions = count($questionArray);
$i = 1;
foreach ($questionArray as $variable)
{
${'q_'.$i} = $variable;
++$i;
}
$an = ($_POST['answer']);
$answer = mysqli_real_escape_string($an);
$answerArray = explode(',', $answer);
$numberAnswers = count($answerArray);
$j = 1;
foreach ($answerArray as $variable)
{
${'a_'.$j} = $variable;
++$j;
}
//turn off AUTOCOMMIT, then run the required queries
$dbc->autocommit(FALSE);
$dbc->query("INSERT INTO Quiz(name)
VALUES
(".$quizName.")");
$quizID = $dbc->insert_id;
$n = 1;
for ($x=0; $x<$numberQuestions; $x++)
{
$dbc->query("INSERT INTO Question (quiz_id, question_name)
VALUES
(".$quizID.",".${'q_'.$n}.")");
$questionID = $dbc->insert_id;
echo $questionID;
++$n;
$m = 1;
for ($y=0; $y<$numberAnswers; $y++)
{
$dbc->query("INSERT INTO Answer(question_id, name)
VALUES
(".$questionID.",".${'a_'.$m}.")");
++$m;
}
}
// commit transaction
$dbc->commit();
// close connection
$dbc->close();
非常感谢您提供的任何帮助 - 如果您需要更多信息或任何说明,请告诉我。
【问题讨论】:
-
警告!您的代码容易受到 sql 注入攻击!
-
谢谢,Daniel - 我在 POST 字符串上使用了 mysqli_real_escape_string()。 (我知道准备好的陈述更好,但感觉这个问题已经足够长了!)感谢您的建议。
-
@DanielA.White:只有代码 1. 有效且 2. 需要改进才属于代码审查。这属于这里,因为当有多个依赖于前一个“父级”的插入时,OP 无法使其工作
标签: php mysql transactions mysqli relational-database