我的資料庫中有以下表格: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);
這段代碼沒有經過測驗,但我希望它能給你一個想法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388639.html
