【发布时间】:2022-01-22 22:48:15
【问题描述】:
我的数据库中有以下表格:tbl_students 和 tbl_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>";
}
}
?>
非常感谢任何有助于改进问题的帮助或建议。
【问题讨论】:
-
首先在 check_buttons 中给出课程的 ID,这样您就可以通过课程 ID 在 PHP 中选中复选框。将这些与学生证结合起来,您就完成了。并开始使用准备好的语句,因为您现在对 SQL 注入持开放态度。
-
您好,这是我问题的一部分。我如何根据数据库上的 id 将 id 赋予复选框...并且不用担心 sql 注入,它只是以后项目的原型。
-
好吧,我想您在显示页面时从数据库中选择了课程。选择他们的 id 并将它们放在 name 属性中。您应该立即开始使用准备好的语句。恕我直言,编写代码(甚至是原型)以及后来不得不更改所有内容都是没有意义的。
-
如果表单是硬编码的,你也可以在name属性中硬编码id。
-
我会查看准备好的语句。我在这里有疑问的是:如果我在注册学生时选择了 2 门课程,它是否应该在中间表上创建 2 条不同的记录,两者仅在课程 ID 上有所不同?