我试图通过PHP将下面的表和列插入关系数据库(使用InnoDB引擎的MySQL)中的一些数据。将值插入到关系数据库中
- 测验(ID,姓名)
- 问题(quiz_id,编号,名称)
- 解答(question_id,编号,名称)
主键的id都是自动递增。
这将允许我搜索特定的测验,然后获取属于该测验的问题以及属于这些问题的多项选择可能的答案。每个问题将至少有两个可能的答案。
我正在创建一个界面,允许用户创建一个新的测验。我见过如何使用事务和LAST_INSERT_ID()来确保主键匹配的例子,但当有多个插入依赖于以前的“父”(可能的答案)时,无法使其工作必须链接到正确的问题)。
即这一过程将会是:
插入新的测验
使用测验ID插入一个问题
使用问题ID插入所有可能的答案,这个问题
重复步骤2 & 3直到所有问题和答案都已经en然后进行交易
我试图在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注入攻击! – 2012-02-07 17:34:26
属于代码审查。 – 2012-02-07 17:34:52
谢谢Daniel,我在POST字符串上使用了mysqli_real_escape_string()。 (我知道准备好的陈述更好,但是觉得这个问题足够长!)感谢您的建议。 – 2012-02-08 09:47:58