拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 使用PHP处理多对多数据库关系并选择/插入多个复选框值MYSQL

使用PHP处理多对多数据库关系并选择/插入多个复选框值MYSQL

白鹭 - 2022-02-10 1960 0 0

我的数据库中有以下表格:tbl_studentstbl_courses
我想到了一个音乐学校的项目,学生可以报名一门或多门课程,例如,当我注册一个学生时,可以选择不止一门课程,比如吉他和钢琴,这取决于他的选择(现在我我自己注册学生,所以这只是假设)。
我发现我必须处理多对多的关系,因为一个学生可以有很多课程,并且在一门课程中会有很多学生参与其中。
我所做的下一步是创建一个中间表,我将其称为tbl_students_courses,其中包含两个表的主键。
我的表看起来像这样:

tbl_students

 --------- --------- --------------- --------- 
|  st_id  | st_name |    st_email   | st_code |
 --------- --------- --------------- --------- 
|    1    |John Doe | doe@gmail.com |  55555  |
 --------- --------- --------------- --------- 

tbl_courses

 --------- ----------- -------------------------- 
|  cr_id  |  cr_name  |         cr_desc          |
 --------- ----------- -------------------------- 
|    1    |   Guitar  | Guitar course description|
 --------- ----------- -------------------------- 
|    2    |   Bass    | Bass course description  |
 --------- ----------- -------------------------- 
|    3    |   Violin  | Violin course description|
 --------- ----------- -------------------------- 
|    4    |   Drums   | Drums course description |
 --------- ----------- -------------------------- 
|    5    |   Piano   | Piano course description |
 --------- ----------- -------------------------- 

tbl_students_courses

 --------- --------- --------- 
|  st_id  |  cr_id  |date_insc|
 --------- --------- --------- 
|  -----  |  -----  |  -----  |
 --------- --------- --------- 

现在我的问题是,我不知道如何将表与我的 php 代码相关联。我假设如果我在为学生注册时选择 2 门课程,它应该在中间表上创建 2 个记录,其中只有cr_id彼此不同。
另一个问题是通过 php 的复选框获取课程ID,所以当我选择,例如,钢琴和吉他复选框时,它应该回传两个课程的 ID,运行查询并插入记录。
注意:对于我的 php 代码,foreach 回圈显然只是获取字符串而不是我想要的课程的 ID。

这是我的 HTML:

<div class="form-group">
                   <label class="col-form-label">Select the courses</label>
                   <div class="form-check">
                       <div class="form-check form-check-inline">
                           <input class="form-check-input" name="course[]" type="checkbox" value="Guitar">
                           <label class="form-check-label" >Guitar</label>
                       </div>
                       <div class="form-check form-check-inline">
                           <input class="form-check-input" name="course[]" type="checkbox" value="Bass">
                           <label class="form-check-label" >Bass</label>
                       </div>
                       <div class="form-check form-check-inline">
                           <input class="form-check-input" name="course[]" type="checkbox" value="Violin">
                           <label class="form-check-label" >Violin</label>
                       </div>
                       <div class="form-check form-check-inline">
                           <input class="form-check-input" name="course[]" type="checkbox" value="Drums">
                           <label class="form-check-label" >Drums</label>
                       </div>
                       <div class="form-check form-check-inline">
                           <input class="form-check-input" name="course[]" type="checkbox" value="Piano">
                           <label class="form-check-label" >Piano</label>
                       </div>
                   </div>

这是我的PHP:

 <?php

            if (isset($_POST['submit'])) {
                include_once '../includes/functions.php';
                $studentName     = addslashes($_POST['sname']);
                $studentEmail    = addslashes($_POST['semail']);
                $studentCode     = intval($_POST['scode']);   
                $studentcourse    = $_POST['course'];   
                $query  = "INSERT INTO tbl_students (st_name, st_id, st_code) "
                . "VALUES ('$studentName', '$studentEmail', '$studentCode')";
                $link   = connection_db(); 
                $result = mysqli_query($link, $query);
        
                if($result){
                    $sql = "SELECT LAST_INSERT_ID()";
                    $result = mysqli_query($link, $sql);
                    $last = mysqli_fetch_assoc($result);

                    foreach($studentcourse as $value){
                        $data = date('Y-m-d H:i:s');
                        $lastID =($last["LAST_INSERT_ID()"]);
                        $sql = "INSERT INTO tbl_students_courses (st_id, cr_id, date_insc) VALUES ($lastID, '$value', '$data')";
                        $result = mysqli_query($link, $sql);
                    }
                    echo "<script>alert('Data saved successfully');</script>";
                    print "<script>top.location = 'index.php?id=2';</script>";
                } else {
                    echo "<script>alert('ERROR! Could not save data');</script>";
                }   
            }
        ?>

任何改进问题的帮助或建议都非常感谢。

uj5u.com热心网友回复:

如果您将 ID 作为值放入复选框中,您的代码实际上会起作用

所以宁愿使用

 <input class="form-check-input" name="course[]" type="checkbox" value="Piano">

输入这个

 <input class="form-check-input" name="course[]" type="checkbox" value="5">

ofc 手动放置 ID 不会那么好,因此您必须从数据库中读取所有课程并根据您的资料生成复选框。

所以你可以创建函式来像这样从数据库中获取所有课程

function getAllCourses(mysqli $link){
    $sql ="SELECT cr_id,cr_name,cr_desc FROM tbl_courses";
    $result = mysqli_query($link, $sql);
    $courses = [];
    while($row = mysqli_fetch_assoc($result)){
        $courses[]=$row;
    }
    return $courses;
}

然后在你生成 HTML 代码之前的地方,你可以得到所有的

$courses = getAllCourses($link);

之后你可以像这样生成你的 HTML 代码

<div class="form-group">
    <label class="col-form-label">Select the courses</label>
    <div class="form-check">
        <?php
        foreach ($courses as $course): ?>
            <div class="form-check form-check-inline">
                <input class="form-check-input" name="course[]" type="checkbox" value="<?= $course['cr_id'] ?>">
                <label class="form-check-label"><?= $course['cr_name'] ?></label>
            </div>
        <?php
        endforeach; ?>
    </div>

此外,您的学生代码似乎是您学生的真实识别符号,因此您不需要在数据库中具有自动递增的 ID。您还可以将学生代码行定义为学生表中的主键。

这样你就不需要得到最后的插入 ID,因为你已经有了你的学生。

我还看到您的 SQL 代码不安全,您只需将 POST 值放入 SQL 查询中,这样就可以进行 SQL 注入,您需要在此处使用 Prepare 陈述句。使用占位符准备 SQL 陈述句并使用值执行它们的地方。

$query  = "INSERT INTO tbl_students (st_name, st_email st_code) "
                . "VALUES (?,?,?)";
$statement = mysqli_repapre($link, $query);
mysqli_stmt_bind_param($statement,"sis",$studentName,$studentEmail,$studentCode);
mysqli_stmt_execute($statement); 

这段代码没有经过测验,但我希望它能给你一个想法。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *