【问题标题】:Submit multiple checkbox together with textbox input value using PHP and MySQL?使用PHP和MySQL提交多个复选框以及文本框输入值?
【发布时间】:2015-04-17 17:19:50
【问题描述】:

我正在为学生进行在线测试/测验,并使用 PHP 和 MySQL。目前我有一个表单,我可以在其中将问题和答案添加到数据库中。

但是,我无法通过选择多个复选框将正确答案提交到数据库中。我想将所有正确答案存储在名为 correct_answer(id, question_id, answer_id) 的表中,并从名为 answers(id,answer_id, answer) 的表中插入所有选定的 id。

如何仅插入选中的复选框值并以某种方式跳过未选中的复选框?

我的 HTML 部分:

<form id="add_question_form" method="post">
  <label>Question: *</label>
  <input id="question" type="text" name="question" class="form_default" placeholder="Type your question here" required>
  <div class="inputs">
    <label>Answer #1: *</label>
    <input type="text" id="answer" name="dynamic[]" class="form_default" placeholder="answer" required/>
    <input type="checkbox" name="selected_item[]" id="checkbox" value="<?php echo $answer_id;?>">
    <label>correct</label>
    <br>
    <label>Answer #2: *</label>
    <input type="text" id="answer" name="dynamic[]" class="form_default" placeholder="answer" required/>
    <input type="checkbox" name="selected_item[]" id="checkbox" value="<?php echo $answer_id;?>" />
    <label>correct</label>
    <br>
  </div>
  <input id="submit" type="submit" name="add_question" value="Submit" class="button">
</form>

PHP 代码:

if (isset($_POST['add_question'])) { // Checks if the form has been submitted
	if (isset($_POST['selected_item']) && !empty($_POST['selected_item'])) {
		$counter++; // each time adds 1 after user posts the question

$optionArray = $_POST['dynamic']; // submits multiple answers to the database

  for ($j = 0; $j < count($optionArray); $j++) {
						
	$answer = mysql_real_escape_string($_POST['dynamic'][$j]); // returns multiple answers
					
	$check_answer = "SELECT id, answer FROM answers WHERE answer = '$answer'";
	$check_answer = mysql_query($check_answer); //checks if answer is exist in the database
					
	while ($row = mysql_fetch_assoc($check_answer)) { // fetch a result rows as an associative array
		$answer_id = $row['id']; // answer id from database
	}
					
	if (mysql_num_rows($check_answer) > 0) { 
		$q = "INSERT INTO correct_answer (question_id, answer_id) VALUES ('$counter','$answer_id')";
		$q = mysql_query($q); 
	}
  }
}
}

例如:

  1. 我正在添加问题和三个答案“a”、“b”和“c”。选择“a”和“c”作为正确答案。

  2. 所有答案都已成功添加到 MySQL“答案”表中:

1 - 一个

2-b

3-c

  1. 但是,它不是将 id ="1" 和 "3" 添加到 "correct_answer" 表中(因为 "a" 和 "c" 有这些 id 编号),而是添加前两个答案的 id "1" 和 "2 “..因此,它错误地匹配正确答案并将“a”和“b”设置为正确答案。

谁能帮帮我?我想插入多个正确答案,但前提是它们被选中..

提前致谢,任何帮助将不胜感激!

【问题讨论】:

    标签: php mysql arrays checkbox submit


    【解决方案1】:

    如果复选框被选中,您可以使用IF statement

    for ($j = 0; $j < count($_POST['selected_item']); $j++) {
    
      if(!empty($_POST['selected_item'][$j])){ /* CHECK IF CHECKBOX IS SELECTED */  
    
        answer = mysql_real_escape_string($_POST['dynamic'][$j]); // returns multiple answers
        $check_answer = "SELECT id, answer FROM answers WHERE answer = '$answer'";
        $check_answer = mysql_query($check_answer); //checks if answer is exist in the database
    
        while ($row = mysql_fetch_assoc($check_answer)) { // fetch a result rows as an associative array
          $answer_id = $row['id']; // answer id from database
        }
    
        if (mysql_num_rows($check_answer) > 0) { 
          $q = "INSERT INTO correct_answer (question_id, answer_id) VALUES ('$counter','$answer_id')";
          $q = mysql_query($q); 
        }
      } /* END OF IF $answer is not empty */
    
    } /* END OF FOR LOOP */
    

    建议:

    在您的表单中使用counter 并在提交之前将其放入数组中。示例:

    $counter = 0;
    
     <input type="text" id="answer" name="dynamic[<?php $counter; ?>]" class="form_default" placeholder="answer" value="<?= isset($_POST['dynamic'][0]) ? $_POST['dynamic'][0] : '' ?>" required/>
        <input type="checkbox" name="selected_item[<?php echo $counter; ?>]" id="chechbox" value="<?php echo $answer_id;?>">
    

    然后递增它(假设您也在循环中运行表单)

    $counter = $counter + 1;
    

    它不会在循环中运行并且表单已修复:

    您可以手动将数组编号放入文本框和复选框中。

    提交后:

    并且在提交时,使用 PHP 的 count() 函数计算提交的复选框。

    $counter = count($_POST["selected_item"]);
    

    然后使用$counter 运行您的循环(参考我的第一个给出的示例代码)。

    注意:

    • 复选框及其对应的文本框必须具有相同的数组编号,否则答案将与复选框不匹配。

    一个更简单的例子:

    Answer # 1
    <input type="checkbox" name="selected_item[0]"><input type="text" name="dynamic[0]"> <!-- Notice that they are both in 0 array -->
    
    Answer # 2
    <input type="checkbox" name="selected_item[1]"><input type="text" name="dynamic[1]"> <!-- Next question array should be incremented from the previous answer -->
    

    提交后,计算selected_item,然后循环它以检查选中的复选框。

    for($x=0; $x<=count($_POST['selected_item']); $x++){
      if(!empty($_POST['selected_item'][$x])){
        /**** PLACE HERE YOUR INSERT QUERY ****/
      }
    }
    

    【讨论】:

    • 你的代码是有意义的,我真的很确定它会工作!当我添加 if(!empty($_POST['selected_item'][$j])) { 它根本不读取这部分代码,这意味着未选中复选框,但实际上我勾选了正确答案并按下提交按钮。你知道有没有其他方法可以检查或跳过未选中的空框?谢谢!
    • @AleksandrLevcenko - 如果您可以在表单的数组中添加计数器,它就可以工作。就像我的第二个代码示例一样。好吧,像这样......再次......&lt;input type="checkbox" name="selected_item[$yourcounter]" id="checkbox" value="$yourvalue"&gt;我会更新我的答案。
    • 现在它可以工作了,但它会添加所有答案,即使其中一些我没有打勾为正确答案。我怎样才能只将选中的文本框输入值发布到数据库?
    • @AleksandrLevcenko 你使用我的建议了吗?通过分配$counter 变量或手动分配数组编号,复选框应具有与相应文本框相同的数组编号。而insert query 只会在勾选复选框时运行。
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2012-11-11
    • 2013-06-06
    • 2017-09-14
    • 2021-07-14
    相关资源
    最近更新 更多