插入始终不同的变量的语句

时间:2013-12-26 19:28:51

标签: php mysql

我有一个页面,在页面上放置随机测试问题。该数据库有200多个问题。这些问题随机抓取进行20个问题测试。提交后,我需要为每个问题插入一个记录,并提供问题编号,用户ID和答案。我以前工作得很好但是随着问题库的增长以及改变测试需求的增长,我花了太多时间来更改硬编码变量并在处理测试的脚本上插入语句并将结果插入到数据库中。

$fname=$_POST['EmployeeFirstM'];
$lname=$_POST['EmployeeLast'];
$ruser=$_POST['User'];
$1=$_POST['q1'];
$2=$_POST['q2'];
$3=$_POST['q3'];

变量最高可达200​​+。上一页的内容可能是20个问题的任意组合。我需要这样做:

$sql="INSERT INTO $tbl_name(empID, empf, empl, QuestionNumber,  AnswerGiven)VALUES('$ruser','$fname', '$lname','1', '$1')";
无论遇到什么问题,都会有20次。对于每个可能的问题,我是否需要在200多个插入语句中进行硬编码,并且只是跳过每个提交中不在混合中的插入语句?测试的先前版本记录到一个行项目,但我不得不继续向表中添加列以接受更多问题。我觉得这不高效。拜托,谢谢。

经过多次试验和错误后,这可用于将问题ID记录到数据库表中。我仍然无法弄清楚如何将相应的选定单选按钮输入到混音中以记录答案。

foreach( $_POST as $q_id ) {
if( is_array( $q_id ) ) {
    foreach( $q_id as $qid ){
   $sql="INSERT INTO $tbl_name(empID, empf, empl, QuestionNumber,  AnswerGiven)VALUES('$ruser','$fname', '$lname','$qid', '$q')";
$result=mysql_query($sql);
}
}
}

3 个答案:

答案 0 :(得分:1)

您当然不应该为数据库中的每条记录硬编码值。这种方式首先打败了数据库的原因之一,将数据与逻辑分开。

为什么你有200多个变量?当你用问题渲染页面时,我想你会从数据库中随机选择20个问题,对吧?而且每个问题都会有某种独特的ID,是吗?因此,将问题呈现给页面的结构可能类似于:

<input type="hidden" name="qid[]" value="<?php echo $id ?>" />
<?php echo $question ?>
<input type="text" name="answer[]" />

这将是某种循环,其中$id$question是从数据库中选择的20个问题的循环的每次迭代中值的变化。

然后,当表单与答案一起发布时,您可以在此处获得问题ID:

$_POST["qid"][]

和你的回答:

$_POST["answer"][]

作为数组。添加一些错误检查以确保两个数组都有20个值,您可以从0到19循环以将它们插入到数据库中:

for ($i = 0; $i < 20; $i++) {
    // $_POST["qid"][$i] is the ID of the question being answered
    // $_POST["answer"][$i] is the answer given
    // Sanitize the inputs and insert into the database accordingly
}

答案 1 :(得分:0)

将您的值放在一个数组中,然后循环遍历它,以便您可以将它们插入循环中。

$answerGiven[];// have all your answers here
$questionNumber[]; // have all your questions in here

foreach ($questionNumber as $key=>$value){
    $sql="INSERT INTO $tbl_name(empID, empf, empl, QuestionNumber,  AnswerGiven)VALUES('$ruser','$fname', '$lname','$questionNumber[$key]', '$answerGiven[$key]')";
    // execute
}

如果您正在寻找更有效的方法,请使用预准备语句......这也会阻止SQL注入

$sql="INSERT INTO $tbl_name(empID, empt, empl, QuestionNumber,  AnswerGiven)VALUES(?,?,?,?,?)";

if($stmt = $mysqli->prepare($sql)){
    foreach ($questionNumber as $key=>$value){
        $stmt->bind_param('sssis',$ruser, $fname, $lname, $questionNumber[$key], $answerGiven[$key]);
        $stmt->execute();
    }
    $stmt->close();
}else die("Failed to prepare query");

答案 2 :(得分:0)

在重复的输入元素中使用name="q[]"。然后,PHP将创建一个名为$_POST['q']的数组,您可以在循环中处理它们。

foreach ($_POST['q'] as $i => $q) {
    $sql="INSERT INTO $tbl_name(empID, empf, empl, QuestionNumber,  AnswerGiven)VALUES('$ruser','$fname', '$lname', $i, '$q')";
    // submit query
}