我的数据库中有以下表格: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>";
}
}
?>
任何改进问题的帮助或建议都非常感谢。
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 评论