【问题标题】:Select multiple items from one dropdown and insert into multiple rows of database从一个下拉列表中选择多个项目并插入到多行数据库中
【发布时间】:2019-07-31 13:45:36
【问题描述】:

当数据来自表单上的多选(复选框)字段时,我想将多个单独的课程分配给每个学生课程组合一行的学生。也就是说,数据作为多个课程的单个结果返回,我想将其拆分。

短版:老师从一个下拉列表中选择多个课程,但我想将数据保存在多行中。

这是我的代码。

<?php

$con = mysqli_connect('localhost','root');

mysqli_select_db($con,'sss_qr');


    $q="select * from  course_tb ";
$result=mysqli_query($con,$q);

?>

<!DOCTYPE html>
<html>
 <head>
  <title>Webslesson Tutorial | Bootstrap Multi Select Dropdown with Checkboxes using Jquery in PHP</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script>  
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.13/js/bootstrap-multiselect.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.13/css/bootstrap-multiselect.css" />
 </head>
 <body>
  <br /><br />
  <div class="container" style="width:600px;">
   <h2 align="center">Bootstrap Multi Select Dropdown with Checkboxes using Jquery in PHP</h2>
   <br /><br />
   <form method="post" id="framework_form">
    <div class="form-group">
     <label>Select which Framework you have knowledge</label>
     <select id="framework" name="framework[]" multiple class="form-control" >
      <?php
        if($result)
        {
            while($row=mysqli_fetch_array($result))
            {
                $course=$row["course_name"];
                $code=$row["course_code"];
                echo "<option value='$code'>$course</option>";          
            }
        }
        ?>
     </select>
    </div>
    <div class="form-group">
     <input type="submit" class="btn btn-info" name="submit" value="Submit" />
    </div>
   </form>
   <br />
  </div>
 </body>
</html>
<script>
$(document).ready(function(){
 $('#framework').multiselect({
  nonSelectedText: 'Select Framework',
  enableFiltering: true,
  enableCaseInsensitiveFiltering: true,
  buttonWidth:'400px'
 });

 $('#framework_form').on('submit', function(event){
  event.preventDefault();
  var form_data = $(this).serialize();
  $.ajax({
   url:"insert.php",
   method:"POST",
   data:form_data,
   success:function(data)
   {
    $('#framework option:selected').each(function(){
     $(this).prop('selected', false);
    });
    $('#framework').multiselect('refresh');
    alert(data);
   }
  });
 });


});
</script>

和insert.php文件

<?php 
$connect = mysqli_connect("localhost", "root", "", "sss_qr");
if(isset($_POST["framework"]))
{   
    $framework = '';
 foreach($_POST["framework"] as $row)
 {
  $framework .= $row . ', ';
 }
 $framework = substr($framework, 0, -2);
 $query = "INSERT INTO allocoursestudent(course_code) VALUES('".$framework."')";
 if(mysqli_query($connect, $query))
 {
  echo 'Data Inserted';
 }
}
?>

【问题讨论】:

  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 程序接口是 PHP 4 时代的产物,当时引入了 mysqli API,理想情况下不应在新代码中使用。
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 向查询中添加任何数据。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 我试图通过首先清理语法并删除不需要的信息来使问题更清楚。我保留了您的代码,但我确实觉得您可以将其简化很多,以使其成为一个最小的示例并使用面向对象的样式。多选是谈论这种类型的表单字段时使用的正确术语。我也强烈建议您遵循 cmets 中的安全建议。

标签: php jquery mysql


【解决方案1】:

所以我用这段代码解决了这个问题。

<?php 
$con = mysqli_connect("localhost", "root", "", "sss_qr");
$course=$_POST['course'];
if($course)
{
    foreach($course as $c)
    {
        $q="INSERT INTO allocoursestudent(course_code) VALUES('".$c."')";
        mysqli_query($con,$q);
    }
}
?>

【讨论】:

    【解决方案2】:

    首先,您需要创建一个将学生和课程配对的新表。 其次,您需要在表单中显示学生(下拉菜单)。

    之后,您可以执行以下操作:

    
    <?php 
    $connect     = mysqli_connect("localhost", "root", "", "sss_qr");
    
    if(isset($_POST["course_code"])){
    
    
        $course_code = mysqli_real_escape_string($con, $_POST["course_code"]);
        $student_id  = mysqli_real_escape_string($con, $_POST["student_id"]);
    
        $query = "INSERT INTO new_table_name(course_code, student_id) VALUES";
    
        for($i=0; $i<count($course_code); $i++){
            $query .= " ('".$course_code[$i] ."', '".$student_id[$i]."'),";
        }
    
        $query  = substr($query, 0, -1);
    
        if(mysqli_query($connect, $query)){
            echo 'Data Inserted #'.$i;
        }
    
    }
    ?>
    
    

    【讨论】:

    • 这会创建多个查询,但只运行其中一个。这是一种有缺陷的方法。它还完全忽略了易于修复的 SQL 注入问题。你能修改这段代码来解决这些问题吗?
    • 这是一种改进,但这里有两点需要考虑。 A) 不要使用mysqli_real_escape_string,它不仅混乱而且容易出错,而是使用占位符值,例如(?,?),然后是bind_param。 B) 不要对列表使用字符串连接,而是添加到数组和 join','。无需修剪。 C)更好的是,准备一次语句并使用不同的绑定多次运行它。准备好的语句使语句重用变得超级快速和容易。
    猜你喜欢
    • 2015-10-25
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多