【问题标题】:Inserting values into a relational database将值插入关系数据库
【发布时间】:2012-02-07 17:33:38
【问题描述】:

我正在尝试通过 PHP 将一些数据插入到关系数据库(使用 InnoDB 引擎的 MySQL)中,并使用下面的表和列。

  • 测验(ID,姓名)
  • 问题(quiz_id、id、姓名)
  • 答案(question_id, id, name)

主键id都是自增的。

这将允许我搜索特定测验,然后获取属于该测验的问题以及(反过来)属于这些问题的多项选择可能答案。每个问题至少有两个可能的答案。

我正在创建一个允许用户创建新测验的界面。我已经看到了如何使用事务和 LAST_INSERT_ID() 来确保主键匹配的示例,但是 当有多个依赖于前一个“父级”的插入时,它无法正常工作(可能的答案必须与正确的问题相关联)。

即该过程将是:

  1. 插入新测验

  2. 使用测验 ID 插入问题

  3. 使用问题 ID 插入该问题的所有可能答案

  4. 重复步骤 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


【解决方案1】:
$dbc->query("INSERT INTO Question (quiz_id, question_name) 
  VALUES
  (".$surveyID.",".${'q_'.$n}.")");

应改为:

$dbc->query("INSERT INTO Question (quiz_id, question_name) 
  VALUES
  (".$quizID.",".${'q_'.$n}.")");

就像前面的代码一样,你可以这样做:

$quizID = $dbc->insert_id;

事实上,$surveyID 在您的代码中的其他任何地方都找不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多