Read more »
Tuyệt vời! Chúng ta sẽ cùng tìm hiểu về các chủ đề này để xây dựng một ứng dụng web quản lý bảng điểm sinh viên nhé.
Học Web Form
Web form là cách người dùng tương tác với ứng dụng web, cho phép họ nhập dữ liệu và gửi lên máy chủ. Bạn sẽ học cách tạo các trường nhập liệu (text boxes, radio buttons, checkboxes, dropdowns), nút gửi (submit button) bằng HTML.
Khi người dùng gửi form, dữ liệu sẽ được chuyển đến một tập tin PHP để xử lý.
Database phpMyAdmin
phpMyAdmin là một công cụ quản lý cơ sở dữ liệu MySQL/MariaDB trên nền web. Nó giúp bạn dễ dàng:
* Tạo và quản lý cơ sở dữ liệu: Tạo mới, xóa, đổi tên cơ sở dữ liệu.
* Tạo và quản lý bảng: Thiết kế cấu trúc bảng (tên cột, kiểu dữ liệu, khóa chính, khóa ngoại).
* Thao tác với dữ liệu: Chèn, sửa, xóa, truy vấn dữ liệu trực tiếp trong bảng.
* Thực hiện các lệnh SQL: Chạy các truy vấn SQL phức tạp.
Để xây dựng ứng dụng bảng điểm, bạn sẽ tạo một cơ sở dữ liệu (ví dụ: quanlydiemsv) và các bảng như sinhvien (mã SV, tên SV, ngày sinh, lớp), monhoc (mã MH, tên MH, số tín chỉ), và diem (mã SV, mã MH, điểm số).
Code PHP
PHP là ngôn ngữ lập trình kịch bản phía máy chủ, được sử dụng rộng rãi để phát triển web động. Với PHP, bạn sẽ học cách:
* Kết nối đến cơ sở dữ liệu: Sử dụng mysqli hoặc PDO để thiết lập kết nối với MySQL.
* Thực hiện các truy vấn SQL: Gửi các lệnh INSERT, SELECT, UPDATE, DELETE đến cơ sở dữ liệu.
* Xử lý dữ liệu từ form: Nhận và xác thực dữ liệu người dùng gửi từ web form.
* Hiển thị dữ liệu: Lấy dữ liệu từ cơ sở dữ liệu và hiển thị lên trang web HTML.
* Xử lý lỗi: Bắt và xử lý các lỗi xảy ra trong quá trình thực thi.
SQL Transaction
SQL Transaction (Giao dịch SQL) là một chuỗi các thao tác SQL được thực thi như một đơn vị công việc duy nhất và không thể chia cắt. Điều này có nghĩa là, hoặc tất cả các thao tác trong giao dịch đều thành công (COMMIT), hoặc nếu có bất kỳ thao tác nào thất bại, tất cả các thao tác đã thực hiện sẽ bị hủy bỏ (ROLLBACK) để đưa cơ sở dữ liệu về trạng thái ban đầu trước khi giao dịch bắt đầu.
Ví dụ: Khi bạn thêm một sinh viên mới và đồng thời cập nhật điểm cho sinh viên đó trong một hệ thống phức tạp. Nếu việc thêm sinh viên thành công nhưng việc cập nhật điểm lại thất bại, bạn muốn cả hai thao tác đều không được ghi vào cơ sở dữ liệu. Transaction đảm bảo tính toàn vẹn dữ liệu trong những trường hợp như vậy.
Ví dụ ứng dụng web Bảng điểm sinh viên
Đây là cấu trúc và luồng hoạt động cơ bản của một ứng dụng web quản lý bảng điểm sinh viên:
1. Cơ sở dữ liệu (quanlydiemsv)
* sinhvien table:
* ma_sv (PRIMARY KEY)
* ten_sv
* ngay_sinh
* lop
* monhoc table:
* ma_mh (PRIMARY KEY)
* ten_mh
* so_tin_chi
* diem table:
* ma_sv (FOREIGN KEY references sinhvien)
* ma_mh (FOREIGN KEY references monhoc)
* diem_so
* PRIMARY KEY (ma_sv, ma_mh)
2. Các chức năng chính và code PHP tương ứng
* Trang chủ (index.php): Có thể hiển thị danh sách sinh viên hoặc các tùy chọn điều hướng.
* Thêm sinh viên (them_sinhvien.php):
* Web Form: HTML form với các trường nhập liệu cho mã SV, tên SV, ngày sinh, lớp.
* Code PHP:
* Khi form được gửi, PHP sẽ nhận dữ liệu.
* Kiểm tra và xác thực dữ liệu (ví dụ: mã SV không trùng, tên không rỗng).
* Sử dụng lệnh INSERT INTO sinhvien (...) VALUES (...) để lưu vào database.
* Thông báo thành công hoặc lỗi.
* Danh sách sinh viên (danhsach_sinhvien.php):
* Code PHP:
* Sử dụng lệnh SELECT * FROM sinhvien để lấy tất cả sinh viên từ database.
* Hiển thị dữ liệu trong một bảng HTML.
* Có thể thêm các liên kết để sửa hoặc xóa sinh viên.
* Thêm/Cập nhật điểm (them_diem.php hoặc capnhat_diem.php):
* Web Form: HTML form để chọn sinh viên, chọn môn học và nhập điểm.
* Code PHP:
* Khi form được gửi, PHP nhận mã SV, mã MH, điểm.
* Kiểm tra xem sinh viên và môn học có tồn tại không.
* Sử dụng lệnh INSERT INTO diem (...) VALUES (...) hoặc UPDATE diem SET diem_so = ... WHERE ma_sv = ... AND ma_mh = ....
* Trong trường hợp cập nhật nhiều điểm hoặc các thao tác phức tạp, bạn có thể áp dụng SQL Transaction để đảm bảo tính toàn vẹn.
* Xem bảng điểm (xem_bangdiem.php):
* Web Form: Có thể có trường nhập liệu để tìm kiếm theo mã SV hoặc tên SV.
* Code PHP:
* Khi nhận mã SV, PHP sẽ thực hiện truy vấn phức tạp hơn:
SELECT sv.ten_sv, mh.ten_mh, d.diem_so
FROM diem d
JOIN sinhvien sv ON d.ma_sv = sv.ma_sv
JOIN monhoc mh ON d.ma_mh = mh.ma_mh
WHERE sv.ma_sv = 'Mã_Sinh_Viên_Cần_Tìm'
* Hiển thị kết quả trong một bảng HTML.
Để bắt đầu, bạn sẽ cần cài đặt một môi trường phát triển web như XAMPP hoặc WAMP trên máy tính của mình. Chúng sẽ cung cấp Apache (máy chủ web), MySQL (cơ sở dữ liệu) và PHP.
Phat trien nhanh ung dung web bang diem sinh vien bang Source code Crud
Tuyệt vời! Phát triển nhanh ứng dụng web bảng điểm sinh viên bằng CRUD (Create, Read, Update, Delete) là một cách hiệu quả để bạn nắm vững các kiến thức đã học. Chúng ta sẽ cùng xây dựng một ứng dụng đơn giản với các chức năng cơ bản này.
Cấu trúc dự án và Cơ sở dữ liệu
Đầu tiên, bạn cần chuẩn bị môi trường XAMPP/WAMP và tạo cơ sở dữ liệu.
1. Cơ sở dữ liệu (quanlydiemsv)
Trong phpMyAdmin, tạo một cơ sở dữ liệu mới tên là quanlydiemsv.
Tiếp theo, tạo bảng sinhvien:
CREATE TABLE `sinhvien` (
`ma_sv` VARCHAR(10) PRIMARY KEY,
`ten_sv` VARCHAR(100) NOT NULL,
`ngay_sinh` DATE,
`lop` VARCHAR(20)
);
2. Cấu trúc thư mục dự án
Trong thư mục htdocs của XAMPP (hoặc www của WAMP), tạo một thư mục mới, ví dụ: bangdiem_crud.
Bên trong thư mục này, chúng ta sẽ có các file:
bangdiem_crud/
├── config.php // Kết nối CSDL
├── index.php // Trang chủ, hiển thị danh sách sinh viên
├── them_sinhvien.php // Thêm sinh viên mới
├── sua_sinhvien.php // Sửa thông tin sinh viên
└── xoa_sinhvien.php // Xóa sinh viên
Source Code CRUD
1. config.php - Kết nối cơ sở dữ liệu
File này sẽ chứa thông tin kết nối đến database.
<?php
// Thông tin kết nối CSDL
$servername = "localhost"; // Tên máy chủ (thường là localhost)
$username = "root"; // Tên người dùng CSDL (mặc định của XAMPP/WAMP là root)
$password = ""; // Mật khẩu CSDL (mặc định của XAMPP/WAMP là rỗng)
$dbname = "quanlydiemsv"; // Tên cơ sở dữ liệu bạn đã tạo
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối CSDL thất bại: " . $conn->connect_error);
}
// Thiết lập mã hóa ký tự UTF-8
$conn->set_charset("utf8");
?>
2. index.php - Đọc (Read) danh sách sinh viên
Trang này sẽ hiển thị danh sách sinh viên hiện có và các liên kết để thêm, sửa, xóa.
<?php
include 'config.php'; // Nạp file cấu hình CSDL
// Truy vấn để lấy tất cả sinh viên
$sql = "SELECT * FROM sinhvien";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quản Lý Bảng Điểm Sinh Viên</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.actions a { margin-right: 5px; text-decoration: none; padding: 3px 6px; border: 1px solid #ccc; border-radius: 3px; }
.actions a.edit { background-color: #4CAF50; color: white; }
.actions a.delete { background-color: #f44336; color: white; }
.button-add { display: inline-block; padding: 10px 15px; background-color: #008CBA; color: white; text-decoration: none; border-radius: 5px; }
</style>
</head>
<body>
<h1>Danh Sách Sinh Viên</h1>
<a href="them_sinhvien.php" class="button-add">Thêm Sinh Viên Mới</a>
<?php
if ($result->num_rows > 0) {
echo "<table>";
echo "<thead><tr><th>Mã SV</th><th>Tên Sinh Viên</th><th>Ngày Sinh</th><th>Lớp</th><th>Hành Động</th></tr></thead>";
echo "<tbody>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["ma_sv"] . "</td>";
echo "<td>" . $row["ten_sv"] . "</td>";
echo "<td>" . $row["ngay_sinh"] . "</td>";
echo "<td>" . $row["lop"] . "</td>";
echo "<td class='actions'>";
echo "<a href='sua_sinhvien.php?ma_sv=" . $row["ma_sv"] . "' class='edit'>Sửa</a>";
echo "<a href='xoa_sinhvien.php?ma_sv=" . $row["ma_sv"] . "' class='delete' onclick='return confirm(\"Bạn có chắc chắn muốn xóa sinh viên này?\")'>Xóa</a>";
echo "</td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
} else {
echo "<p>Không có sinh viên nào trong CSDL.</p>";
}
$conn->close(); // Đóng kết nối CSDL
?>
</body>
</html>
3. them_sinhvien.php - Thêm (Create) sinh viên
File này chứa form để người dùng nhập thông tin sinh viên mới và xử lý việc thêm vào database.
<?php
include 'config.php'; // Nạp file cấu hình CSDL
$message = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Lấy dữ liệu từ form
$ma_sv = $_POST['ma_sv'];
$ten_sv = $_POST['ten_sv'];
$ngay_sinh = $_POST['ngay_sinh'];
$lop = $_POST['lop'];
// Chuẩn bị câu lệnh SQL INSERT
$sql = "INSERT INTO sinhvien (ma_sv, ten_sv, ngay_sinh, lop) VALUES (?, ?, ?, ?)";
// Sử dụng Prepared Statements để tránh SQL Injection
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssss", $ma_sv, $ten_sv, $ngay_sinh, $lop); // "ssss" nghĩa là 4 tham số đều là string
if ($stmt->execute()) {
$message = "<span style='color: green;'>Thêm sinh viên thành công!</span>";
} else {
$message = "<span style='color: red;'>Lỗi: " . $stmt->error . "</span>";
}
$stmt->close();
$conn->close();
}
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Thêm Sinh Viên Mới</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { background-color: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 500px; margin: auto; }
label { display: block; margin-bottom: 8px; font-weight: bold; }
input[type="text"], input[type="date"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; }
input[type="submit"] { background-color: #008CBA; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
input[type="submit"]:hover { background-color: #007bb5; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
.message { margin-top: 15px; text-align: center; }
</style>
</head>
<body>
<h1>Thêm Sinh Viên Mới</h1>
<form action="them_sinhvien.php" method="post">
<label for="ma_sv">Mã Sinh Viên:</label>
<input type="text" id="ma_sv" name="ma_sv" required>
<label for="ten_sv">Tên Sinh Viên:</label>
<input type="text" id="ten_sv" name="ten_sv" required>
<label for="ngay_sinh">Ngày Sinh:</label>
<input type="date" id="ngay_sinh" name="ngay_sinh">
<label for="lop">Lớp:</label>
<input type="text" id="lop" name="lop">
<input type="submit" value="Thêm Sinh Viên">
</form>
<div class="message"><?php echo $message; ?></div>
<a href="index.php" class="back-link">Quay lại danh sách</a>
</body>
</html>
4. sua_sinhvien.php - Sửa (Update) thông tin sinh viên
File này hiển thị form với thông tin sinh viên hiện tại và cho phép người dùng sửa đổi.
<?php
include 'config.php'; // Nạp file cấu hình CSDL
$message = "";
$ma_sv = "";
$ten_sv = "";
$ngay_sinh = "";
$lop = "";
// Kiểm tra nếu có tham số ma_sv trên URL (khi click Sửa từ index.php)
if (isset($_GET['ma_sv']) && !empty($_GET['ma_sv'])) {
$ma_sv_edit = $_GET['ma_sv'];
// Lấy thông tin sinh viên cần sửa từ CSDL
$sql_select = "SELECT * FROM sinhvien WHERE ma_sv = ?";
$stmt_select = $conn->prepare($sql_select);
$stmt_select->bind_param("s", $ma_sv_edit);
$stmt_select->execute();
$result_select = $stmt_select->get_result();
if ($result_select->num_rows > 0) {
$row = $result_select->fetch_assoc();
$ma_sv = $row['ma_sv'];
$ten_sv = $row['ten_sv'];
$ngay_sinh = $row['ngay_sinh'];
$lop = $row['lop'];
} else {
$message = "<span style='color: red;'>Không tìm thấy sinh viên!</span>";
}
$stmt_select->close();
}
// Xử lý khi form được gửi (cập nhật dữ liệu)
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$ma_sv_update = $_POST['ma_sv']; // Mã SV ban đầu (không thay đổi)
$ten_sv_new = $_POST['ten_sv'];
$ngay_sinh_new = $_POST['ngay_sinh'];
$lop_new = $_POST['lop'];
// Chuẩn bị câu lệnh SQL UPDATE
$sql_update = "UPDATE sinhvien SET ten_sv = ?, ngay_sinh = ?, lop = ? WHERE ma_sv = ?";
$stmt_update = $conn->prepare($sql_update);
$stmt_update->bind_param("ssss", $ten_sv_new, $ngay_sinh_new, $lop_new, $ma_sv_update);
if ($stmt_update->execute()) {
$message = "<span style='color: green;'>Cập nhật sinh viên thành công!</span>";
// Cập nhật lại các biến để hiển thị thông tin mới trên form
$ten_sv = $ten_sv_new;
$ngay_sinh = $ngay_sinh_new;
$lop = $lop_new;
} else {
$message = "<span style='color: red;'>Lỗi: " . $stmt_update->error . "</span>";
}
$stmt_update->close();
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sửa Thông Tin Sinh Viên</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { background-color: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 500px; margin: auto; }
label { display: block; margin-bottom: 8px; font-weight: bold; }
input[type="text"], input[type="date"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; }
input[type="submit"] { background-color: #4CAF50; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
input[type="submit"]:hover { background-color: #45a049; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
.message { margin-top: 15px; text-align: center; }
</style>
</head>
<body>
<h1>Sửa Thông Tin Sinh Viên</h1>
<form action="sua_sinhvien.php" method="post">
<input type="hidden" name="ma_sv" value="<?php echo htmlspecialchars($ma_sv); ?>">
<label for="ma_sv_display">Mã Sinh Viên:</label>
<input type="text" id="ma_sv_display" value="<?php echo htmlspecialchars($ma_sv); ?>" disabled> <label for="ten_sv">Tên Sinh Viên:</label>
<input type="text" id="ten_sv" name="ten_sv" value="<?php echo htmlspecialchars($ten_sv); ?>" required>
<label for="ngay_sinh">Ngày Sinh:</label>
<input type="date" id="ngay_sinh" name="ngay_sinh" value="<?php echo htmlspecialchars($ngay_sinh); ?>">
<label for="lop">Lớp:</label>
<input type="text" id="lop" name="lop" value="<?php echo htmlspecialchars($lop); ?>">
<input type="submit" value="Cập Nhật Sinh Viên">
</form>
<div class="message"><?php echo $message; ?></div>
<a href="index.php" class="back-link">Quay lại danh sách</a>
</body>
</html>
5. xoa_sinhvien.php - Xóa (Delete) sinh viên
File này sẽ nhận ma_sv từ URL và thực hiện xóa sinh viên đó khỏi database.
<?php
include 'config.php'; // Nạp file cấu hình CSDL
if (isset($_GET['ma_sv']) && !empty($_GET['ma_sv'])) {
$ma_sv = $_GET['ma_sv'];
// Chuẩn bị câu lệnh SQL DELETE
$sql = "DELETE FROM sinhvien WHERE ma_sv = ?";
// Sử dụng Prepared Statements để tránh SQL Injection
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $ma_sv);
if ($stmt->execute()) {
echo "<script>alert('Xóa sinh viên thành công!'); window.location.href='index.php';</script>";
} else {
echo "<script>alert('Lỗi khi xóa sinh viên: " . $stmt->error . "'); window.location.href='index.php';</script>";
}
$stmt->close();
$conn->close();
} else {
// Nếu không có ma_sv được truyền, chuyển hướng về trang chủ
header("Location: index.php");
exit();
}
?>
Cách chạy ứng dụng
* Cài đặt XAMPP/WAMP: Đảm bảo bạn đã cài đặt và khởi động Apache và MySQL.
* Tạo Database: Mở phpMyAdmin (thường là http://localhost/phpmyadmin/), tạo database quanlydiemsv và bảng sinhvien như đã hướng dẫn.
* Lưu các File: Lưu tất cả các file PHP trên vào thư mục bangdiem_crud trong htdocs (XAMPP) hoặc www (WAMP).
* Truy cập ứng dụng: Mở trình duyệt và truy cập http://localhost/bangdiem_crud/index.php.
Bạn sẽ thấy một trang hiển thị danh sách sinh viên (ban đầu rỗng). Từ đó, bạn có thể thử các chức năng Thêm, Sửa, Xóa sinh viên.
Lưu ý:
* Đây là một ứng dụng CRUD cơ bản. Trong thực tế, bạn sẽ cần thêm xác thực dữ liệu phía máy chủ chặt chẽ hơn, phân trang, tìm kiếm, và xử lý CSS/JavaScript để giao diện đẹp hơn.
* Để phát triển thành ứng dụng bảng điểm đầy đủ, bạn sẽ cần tạo thêm các bảng như monhoc và diem, rồi xây dựng các chức năng CRUD cho chúng và chức năng xem bảng điểm tổng hợp.
Chúc mừng bạn đã có ứng dụng CRUD đầu tiên! Bạn có muốn tìm hiểu thêm về cách thêm chức năng cho môn học và điểm số không?
Tuyệt vời! Vậy chúng ta sẽ mở rộng ứng dụng bảng điểm sinh viên bằng cách thêm các chức năng quản lý môn học và điểm số. Điều này sẽ giúp ứng dụng của bạn trở nên hoàn chỉnh hơn.
Mở rộng Cơ sở dữ liệu
Đầu tiên, chúng ta cần thêm hai bảng mới vào cơ sở dữ liệu quanlydiemsv của bạn trong phpMyAdmin.
1. Bảng monhoc
Bảng này sẽ lưu trữ thông tin về các môn học.
CREATE TABLE `monhoc` (
`ma_mh` VARCHAR(10) PRIMARY KEY,
`ten_mh` VARCHAR(100) NOT NULL,
`so_tin_chi` INT
);
2. Bảng diem
Bảng này sẽ lưu trữ điểm số của sinh viên cho từng môn học. Nó sẽ có các khóa ngoại (FOREIGN KEY) liên kết với bảng sinhvien và monhoc.
CREATE TABLE `diem` (
`ma_sv` VARCHAR(10) NOT NULL,
`ma_mh` VARCHAR(10) NOT NULL,
`diem_so` DECIMAL(4,2), -- Ví dụ: 8.50, 9.75
PRIMARY KEY (`ma_sv`, `ma_mh`), -- Khóa chính kết hợp
FOREIGN KEY (`ma_sv`) REFERENCES `sinhvien`(`ma_sv`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`ma_mh`) REFERENCES `monhoc`(`ma_mh`) ON DELETE CASCADE ON UPDATE CASCADE
);
Giải thích các khóa ngoại:
* ON DELETE CASCADE: Khi một sinh viên hoặc môn học bị xóa, tất cả các bản ghi điểm liên quan đến sinh viên/môn học đó cũng sẽ tự động bị xóa.
* ON UPDATE CASCADE: Khi mã sinh viên hoặc mã môn học thay đổi, các khóa ngoại tương ứng trong bảng diem cũng sẽ tự động được cập nhật.
Cập nhật cấu trúc thư mục dự án
Chúng ta sẽ thêm các file mới để quản lý môn học và điểm số:
bangdiem_crud/
├── config.php
├── index.php // (Không đổi)
├── them_sinhvien.php
├── sua_sinhvien.php
├── xoa_sinhvien.php
├── monhoc/
│ ├── index.php // Danh sách môn học
│ ├── them_monhoc.php // Thêm môn học mới
│ ├── sua_monhoc.php // Sửa thông tin môn học
│ └── xoa_monhoc.php // Xóa môn học
└── diem/
├── index.php // Danh sách điểm, xem điểm theo SV
├── them_diem.php // Nhập điểm cho SV
└── sua_diem.php // Sửa điểm cho SV
Source Code CRUD cho Môn học
1. Tạo thư mục monhoc
Tạo thư mục con monhoc bên trong bangdiem_crud.
2. monhoc/index.php - Danh sách môn học
<?php
include '../config.php'; // Nạp file cấu hình CSDL
// Truy vấn để lấy tất cả môn học
$sql = "SELECT * FROM monhoc";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quản Lý Môn Học</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.actions a { margin-right: 5px; text-decoration: none; padding: 3px 6px; border: 1px solid #ccc; border-radius: 3px; }
.actions a.edit { background-color: #4CAF50; color: white; }
.actions a.delete { background-color: #f44336; color: white; }
.button-add { display: inline-block; padding: 10px 15px; background-color: #008CBA; color: white; text-decoration: none; border-radius: 5px; }
.nav-links a { margin-right: 15px; text-decoration: none; color: #008CBA; font-weight: bold; }
</style>
</head>
<body>
<h1>Danh Sách Môn Học</h1>
<div class="nav-links">
<a href="../index.php">Quản lý Sinh Viên</a>
<a href="index.php">Quản lý Môn Học</a>
<a href="../diem/index.php">Quản lý Điểm</a>
</div>
<hr>
<a href="them_monhoc.php" class="button-add">Thêm Môn Học Mới</a>
<?php
if ($result->num_rows > 0) {
echo "<table>";
echo "<thead><tr><th>Mã MH</th><th>Tên Môn Học</th><th>Số Tín Chỉ</th><th>Hành Động</th></tr></thead>";
echo "<tbody>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["ma_mh"] . "</td>";
echo "<td>" . $row["ten_mh"] . "</td>";
echo "<td>" . $row["so_tin_chi"] . "</td>";
echo "<td class='actions'>";
echo "<a href='sua_monhoc.php?ma_mh=" . $row["ma_mh"] . "' class='edit'>Sửa</a>";
echo "<a href='xoa_monhoc.php?ma_mh=" . $row["ma_mh"] . "' class='delete' onclick='return confirm(\"Bạn có chắc chắn muốn xóa môn học này?\")'>Xóa</a>";
echo "</td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
} else {
echo "<p>Không có môn học nào trong CSDL.</p>";
}
$conn->close();
?>
</body>
</html>
3. monhoc/them_monhoc.php - Thêm môn học
<?php
include '../config.php';
$message = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$ma_mh = $_POST['ma_mh'];
$ten_mh = $_POST['ten_mh'];
$so_tin_chi = $_POST['so_tin_chi'];
$sql = "INSERT INTO monhoc (ma_mh, ten_mh, so_tin_chi) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $ma_mh, $ten_mh, $so_tin_chi); // "ssi" = 2 strings, 1 integer
if ($stmt->execute()) {
$message = "<span style='color: green;'>Thêm môn học thành công!</span>";
} else {
$message = "<span style='color: red;'>Lỗi: " . $stmt->error . "</span>";
}
$stmt->close();
$conn->close();
}
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Thêm Môn Học Mới</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { background-color: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 500px; margin: auto; }
label { display: block; margin-bottom: 8px; font-weight: bold; }
input[type="text"], input[type="number"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; }
input[type="submit"] { background-color: #008CBA; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
input[type="submit"]:hover { background-color: #007bb5; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
.message { margin-top: 15px; text-align: center; }
</style>
</head>
<body>
<h1>Thêm Môn Học Mới</h1>
<form action="them_monhoc.php" method="post">
<label for="ma_mh">Mã Môn Học:</label>
<input type="text" id="ma_mh" name="ma_mh" required>
<label for="ten_mh">Tên Môn Học:</label>
<input type="text" id="ten_mh" name="ten_mh" required>
<label for="so_tin_chi">Số Tín Chỉ:</label>
<input type="number" id="so_tin_chi" name="so_tin_chi" min="1" required>
<input type="submit" value="Thêm Môn Học">
</form>
<div class="message"><?php echo $message; ?></div>
<a href="index.php" class="back-link">Quay lại danh sách môn học</a>
</body>
</html>
4. monhoc/sua_monhoc.php - Sửa môn học
<?php
include '../config.php';
$message = "";
$ma_mh = "";
$ten_mh = "";
$so_tin_chi = "";
if (isset($_GET['ma_mh']) && !empty($_GET['ma_mh'])) {
$ma_mh_edit = $_GET['ma_mh'];
$sql_select = "SELECT * FROM monhoc WHERE ma_mh = ?";
$stmt_select = $conn->prepare($sql_select);
$stmt_select->bind_param("s", $ma_mh_edit);
$stmt_select->execute();
$result_select = $stmt_select->get_result();
if ($result_select->num_rows > 0) {
$row = $result_select->fetch_assoc();
$ma_mh = $row['ma_mh'];
$ten_mh = $row['ten_mh'];
$so_tin_chi = $row['so_tin_chi'];
} else {
$message = "<span style='color: red;'>Không tìm thấy môn học!</span>";
}
$stmt_select->close();
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$ma_mh_update = $_POST['ma_mh'];
$ten_mh_new = $_POST['ten_mh'];
$so_tin_chi_new = $_POST['so_tin_chi'];
$sql_update = "UPDATE monhoc SET ten_mh = ?, so_tin_chi = ? WHERE ma_mh = ?";
$stmt_update = $conn->prepare($sql_update);
$stmt_update->bind_param("sis", $ten_mh_new, $so_tin_chi_new, $ma_mh_update);
if ($stmt_update->execute()) {
$message = "<span style='color: green;'>Cập nhật môn học thành công!</span>";
$ten_mh = $ten_mh_new;
$so_tin_chi = $so_tin_chi_new;
} else {
$message = "<span style='color: red;'>Lỗi: " . $stmt_update->error . "</span>";
}
$stmt_update->close();
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sửa Thông Tin Môn Học</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { background-color: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 500px; margin: auto; }
label { display: block; margin-bottom: 8px; font-weight: bold; }
input[type="text"], input[type="number"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; }
input[type="submit"] { background-color: #4CAF50; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
input[type="submit"]:hover { background-color: #45a049; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
.message { margin-top: 15px; text-align: center; }
</style>
</head>
<body>
<h1>Sửa Thông Tin Môn Học</h1>
<form action="sua_monhoc.php" method="post">
<input type="hidden" name="ma_mh" value="<?php echo htmlspecialchars($ma_mh); ?>">
<label for="ma_mh_display">Mã Môn Học:</label>
<input type="text" id="ma_mh_display" value="<?php echo htmlspecialchars($ma_mh); ?>" disabled>
<label for="ten_mh">Tên Môn Học:</label>
<input type="text" id="ten_mh" name="ten_mh" value="<?php echo htmlspecialchars($ten_mh); ?>" required>
<label for="so_tin_chi">Số Tín Chỉ:</label>
<input type="number" id="so_tin_chi" name="so_tin_chi" value="<?php echo htmlspecialchars($so_tin_chi); ?>" min="1" required>
<input type="submit" value="Cập Nhật Môn Học">
</form>
<div class="message"><?php echo $message; ?></div>
<a href="index.php" class="back-link">Quay lại danh sách môn học</a>
</body>
</html>
5. monhoc/xoa_monhoc.php - Xóa môn học
<?php
include '../config.php';
if (isset($_GET['ma_mh']) && !empty($_GET['ma_mh'])) {
$ma_mh = $_GET['ma_mh'];
$sql = "DELETE FROM monhoc WHERE ma_mh = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $ma_mh);
if ($stmt->execute()) {
echo "<script>alert('Xóa môn học thành công!'); window.location.href='index.php';</script>";
} else {
echo "<script>alert('Lỗi khi xóa môn học: " . $stmt->error . "'); window.location.href='index.php';</script>";
}
$stmt->close();
$conn->close();
} else {
header("Location: index.php");
exit();
}
?>
Source Code CRUD cho Điểm số
1. Tạo thư mục diem
Tạo thư mục con diem bên trong bangdiem_crud.
2. diem/index.php - Xem và quản lý điểm
Trang này sẽ cho phép bạn xem điểm của tất cả sinh viên hoặc tìm kiếm theo sinh viên.
<?php
include '../config.php';
$sql = "SELECT d.ma_sv, sv.ten_sv, mh.ten_mh, d.diem_so, d.ma_mh
FROM diem d
JOIN sinhvien sv ON d.ma_sv = sv.ma_sv
JOIN monhoc mh ON d.ma_mh = mh.ma_mh";
$search_ma_sv = '';
if ($_SERVER["REQUEST_METHOD"] == "GET" && isset($_GET['search_ma_sv']) && !empty($_GET['search_ma_sv'])) {
$search_ma_sv = $_GET['search_ma_sv'];
$sql .= " WHERE d.ma_sv LIKE ? OR sv.ten_sv LIKE ?";
$stmt = $conn->prepare($sql);
$search_param = "%" . $search_ma_sv . "%";
$stmt->bind_param("ss", $search_param, $search_param);
$stmt->execute();
$result = $stmt->get_result();
} else {
$result = $conn->query($sql);
}
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quản Lý Điểm Sinh Viên</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.actions a { margin-right: 5px; text-decoration: none; padding: 3px 6px; border: 1px solid #ccc; border-radius: 3px; }
.actions a.edit { background-color: #4CAF50; color: white; }
.button-add { display: inline-block; padding: 10px 15px; background-color: #008CBA; color: white; text-decoration: none; border-radius: 5px; }
.nav-links a { margin-right: 15px; text-decoration: none; color: #008CBA; font-weight: bold; }
.search-form { margin-bottom: 20px; }
.search-form input[type="text"] { padding: 8px; border: 1px solid #ddd; border-radius: 4px; }
.search-form input[type="submit"] { padding: 8px 12px; background-color: #5cb85c; color: white; border: none; border-radius: 4px; cursor: pointer; }
</style>
</head>
<body>
<h1>Quản Lý Điểm Sinh Viên</h1>
<div class="nav-links">
<a href="../index.php">Quản lý Sinh Viên</a>
<a href="../monhoc/index.php">Quản lý Môn Học</a>
<a href="index.php">Quản lý Điểm</a>
</div>
<hr>
<a href="them_diem.php" class="button-add">Nhập Điểm Mới</a>
<div class="search-form">
<form action="index.php" method="get">
<input type="text" name="search_ma_sv" placeholder="Tìm kiếm theo Mã SV hoặc Tên SV" value="<?php echo htmlspecialchars($search_ma_sv); ?>">
<input type="submit" value="Tìm Kiếm">
</form>
</div>
<?php
if ($result->num_rows > 0) {
echo "<table>";
echo "<thead><tr><th>Mã SV</th><th>Tên Sinh Viên</th><th>Tên Môn Học</th><th>Điểm Số</th><th>Hành Động</th></tr></thead>";
echo "<tbody>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["ma_sv"] . "</td>";
echo "<td>" . $row["ten_sv"] . "</td>";
echo "<td>" . $row["ten_mh"] . "</td>";
echo "<td>" . $row["diem_so"] . "</td>";
echo "<td class='actions'>";
// Sửa điểm: cần cả ma_sv và ma_mh để xác định bản ghi duy nhất
echo "<a href='sua_diem.php?ma_sv=" . $row["ma_sv"] . "&ma_mh=" . $row["ma_mh"] . "' class='edit'>Sửa Điểm</a>";
echo "</td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
} else {
echo "<p>Không có điểm nào trong CSDL hoặc không tìm thấy kết quả.</p>";
}
if (isset($stmt)) $stmt->close(); // Đóng prepared statement nếu có
$conn->close();
?>
</body>
</html>
3. diem/them_diem.php - Nhập điểm mới
File này sẽ cho phép bạn chọn sinh viên, môn học và nhập điểm.
<?php
include '../config.php';
$message = "";
// Lấy danh sách sinh viên và môn học để hiển thị trong dropdown
$sinhvien_list = $conn->query("SELECT ma_sv, ten_sv FROM sinhvien ORDER BY ten_sv");
$monhoc_list = $conn->query("SELECT ma_mh, ten_mh FROM monhoc ORDER BY ten_mh");
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$ma_sv = $_POST['ma_sv'];
$ma_mh = $_POST['ma_mh'];
$diem_so = $_POST['diem_so'];
// Kiểm tra xem cặp ma_sv và ma_mh đã tồn tại chưa
$check_sql = "SELECT COUNT(*) FROM diem WHERE ma_sv = ? AND ma_mh = ?";
$check_stmt = $conn->prepare($check_sql);
$check_stmt->bind_param("ss", $ma_sv, $ma_mh);
$check_stmt->execute();
$check_result = $check_stmt->get_result();
$row = $check_result->fetch_row();
if ($row[0] > 0) {
$message = "<span style='color: red;'>Điểm cho sinh viên này và môn học này đã tồn tại. Vui lòng sửa nếu muốn cập nhật.</span>";
} else {
$sql = "INSERT INTO diem (ma_sv, ma_mh, diem_so) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssd", $ma_sv, $ma_mh, $diem_so); // "ssd" = 2 strings, 1 decimal/double
if ($stmt->execute()) {
$message = "<span style='color: green;'>Thêm điểm thành công!</span>";
} else {
$message = "<span style='color: red;'>Lỗi: " . $stmt->error . "</span>";
}
$stmt->close();
}
$check_stmt->close();
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nhập Điểm Mới</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { background-color: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 500px; margin: auto; }
label { display: block; margin-bottom: 8px; font-weight: bold; }
select, input[type="number"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; }
input[type="submit"] { background-color: #008CBA; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
input[type="submit"]:hover { background-color: #007bb5; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
.message { margin-top: 15px; text-align: center; }
</style>
</head>
<body>
<h1>Nhập Điểm Mới</h1>
<form action="them_diem.php" method="post">
<label for="ma_sv">Sinh Viên:</label>
<select id="ma_sv" name="ma_sv" required>
<option value="">-- Chọn Sinh Viên --</option>
<?php
if ($sinhvien_list->num_rows > 0) {
while($sv = $sinhvien_list->fetch_assoc()) {
echo "<option value='" . htmlspecialchars($sv['ma_sv']) . "'>" . htmlspecialchars($sv['ten_sv']) . " (" . htmlspecialchars($sv['ma_sv']) . ")</option>";
}
}
?>
</select>
<label for="ma_mh">Môn Học:</label>
<select id="ma_mh" name="ma_mh" required>
<option value="">-- Chọn Môn Học --</option>
<?php
if ($monhoc_list->num_rows > 0) {
while($mh = $monhoc_list->fetch_assoc()) {
echo "<option value='" . htmlspecialchars($mh['ma_mh']) . "'>" . htmlspecialchars($mh['ten_mh']) . " (" . htmlspecialchars($mh['ma_mh']) . ")</option>";
}
}
?>
</select>
<label for="diem_so">Điểm Số:</label>
<input type="number" id="diem_so" name="diem_so" step="0.01" min="0" max="10" required>
<input type="submit" value="Thêm Điểm">
</form>
<div class="message"><?php echo $message; ?></div>
<a href="index.php" class="back-link">Quay lại danh sách điểm</a>
</body>
</html>
4. diem/sua_diem.php - Sửa điểm
File này sẽ cho phép bạn sửa điểm của một sinh viên cho một môn học cụ thể.
<?php
include '../config.php';
$message = "";
$ma_sv_current = "";
$ma_mh_current = "";
$diem_so_current = "";
$ten_sv_display = "";
$ten_mh_display = "";
// Lấy thông tin điểm cần sửa từ URL
if (isset($_GET['ma_sv']) && isset($_GET['ma_mh']) && !empty($_GET['ma_sv']) && !empty($_GET['ma_mh'])) {
$ma_sv_current = $_GET['ma_sv'];
$ma_mh_current = $_GET['ma_mh'];
$sql_select = "SELECT d.diem_so, sv.ten_sv, mh.ten_mh
FROM diem d
JOIN sinhvien sv ON d.ma_sv = sv.ma_sv
JOIN monhoc mh ON d.ma_mh = mh.ma_mh
WHERE d.ma_sv = ? AND d.ma_mh = ?";
$stmt_select = $conn->prepare($sql_select);
$stmt_select->bind_param("ss", $ma_sv_current, $ma_mh_current);
$stmt_select->execute();
$result_select = $stmt_select->get_result();
if ($result_select->num_rows > 0) {
$row = $result_select->fetch_assoc();
$diem_so_current = $row['diem_so'];
$ten_sv_display = $row['ten_sv'] . " (" . $ma_sv_current . ")";
$ten_mh_display = $row['ten_mh'] . " (" . $ma_mh_current . ")";
} else {
$message = "<span style='color: red;'>Không tìm thấy điểm cần sửa!</span>";
}
$stmt_select->close();
}
// Xử lý khi form được gửi (cập nhật điểm)
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$ma_sv_update = $_POST['ma_sv'];
$ma_mh_update = $_POST['ma_mh'];
$diem_so_new = $_POST['diem_so'];
$sql_update = "UPDATE diem SET diem_so = ? WHERE ma_sv = ? AND ma_mh = ?";
$stmt_update = $conn->prepare($sql_update);
$stmt_update->bind_param("dss", $diem_so_new, $ma_sv_update, $ma_mh_update); // "dss" = 1 decimal/double, 2 strings
if ($stmt_update->execute()) {
$message = "<span style='color: green;'>Cập nhật điểm thành công!</span>";
$diem_so_current = $diem_so_new; // Cập nhật lại giá trị hiển thị trên form
} else {
$message = "<span style='color: red;'>Lỗi: " . $stmt_update->error . "</span>";
}
$stmt_update->close();
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sửa Điểm Sinh Viên</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { background-color: #f9f9f9; padding: 20px; border-radius: 8px; max-width: 500px; margin: auto; }
label { display: block; margin-bottom: 8px; font-weight: bold; }
input[type="text"][disabled], input[type="number"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; background-color: #e9e9e9; }
input[type="submit"] { background-color: #4CAF50; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
input[type="submit"]:hover { background-color: #45a049; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
.message { margin-top: 15px; text-align: center; }
</style>
</head>
<body>
<h1>Sửa Điểm Sinh Viên</h1>
<form action="sua_diem.php" method="post">
<input type="hidden" name="ma_sv" value="<?php echo htmlspecialchars($ma_sv_current); ?>">
<input type="hidden" name="ma_mh" value="<?php echo htmlspecialchars($ma_mh_current); ?>">
<label for="sv_display">Sinh Viên:</label>
<input type="text" id="sv_display" value="<?php echo htmlspecialchars($ten_sv_display); ?>" disabled>
<label for="mh_display">Môn Học:</label>
<input type="text" id="mh_display" value="<?php echo htmlspecialchars($ten_mh_display); ?>" disabled>
<label for="diem_so">Điểm Số:</label>
<input type="number" id="diem_so" name="diem_so" step="0.01" min="0" max="10" value="<?php echo htmlspecialchars($diem_so_current); ?>" required>
<input type="submit" value="Cập Nhật Điểm">
</form>
<div class="message"><?php echo $message; ?></div>
<a href="index.php" class="back-link">Quay lại danh sách điểm</a>
</body>
</html>
Cập nhật index.php chính (Tùy chọn)
Bạn có thể cập nhật index.php gốc để có các liên kết điều hướng đến các trang quản lý khác:
<?php
include 'config.php';
// Truy vấn để lấy tất cả sinh viên
$sql = "SELECT * FROM sinhvien";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quản Lý Bảng Điểm Sinh Viên</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.actions a { margin-right: 5px; text-decoration: none; padding: 3px 6px; border: 1px solid #ccc; border-radius: 3px; }
.actions a.edit { background-color: #4CAF50; color: white; }
.actions a.delete { background-color: #f44336; color: white; }
.button-add { display: inline-block; padding: 10px 15px; background-color: #008CBA; color: white; text-decoration: none; border-radius: 5px; }
.nav-links { margin-bottom: 20px; }
.nav-links a { margin-right: 15px; text-decoration: none; color: #008CBA; font-weight: bold; }
</style>
</head>
<body>
<h1>Quản Lý Sinh Viên</h1>
<div class="nav-links">
<a href="index.php">Quản lý Sinh Viên</a>
<a href="monhoc/index.php">Quản lý Môn Học</a>
<a href="diem/index.php">Quản lý Điểm</a>
</div>
<hr>
<a href="them_sinhvien.php" class="button-add">Thêm Sinh Viên Mới</a>
<?php
if ($result->num_rows > 0) {
echo "<table>";
echo "<thead><tr><th>Mã SV</th><th>Tên Sinh Viên</th><th>Ngày Sinh</th><th>Lớp</th><th>Hành Động</th></tr></thead>";
echo "<tbody>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["ma_sv"] . "</td>";
echo "<td>" . $row["ten_sv"] . "</td>";
echo "<td>" . $row["ngay_sinh"] . "</td>";
echo "<td>" . $row["lop"] . "</td>";
echo "<td class='actions'>";
echo "<a href='sua_sinhvien.php?ma_sv=" . $row["ma_sv"] . "' class='edit'>Sửa</a>";
echo "<a href='xoa_sinhvien.php?ma_sv=" . $row["ma_sv"] . "' class='delete' onclick='return confirm(\"Bạn có chắc chắn muốn xóa sinh viên này?\")'>Xóa</a>";
echo "</td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
} else {
echo "<p>Không có sinh viên nào trong CSDL.</p>";
}
$conn->close();
?>
</body>
</html>
Các bước triển khai
* Cập nhật CSDL: Chạy các lệnh CREATE TABLE cho monhoc và diem trong phpMyAdmin.
* Tạo thư mục: Tạo các thư mục monhoc và diem bên trong bangdiem_crud.
* Lưu các File: Copy/paste các đoạn code trên vào các file PHP tương ứng trong cấu trúc thư mục đã định.
* Truy cập ứng dụng: Mở trình duyệt và truy cập http://localhost/bangdiem_crud/index.php.
Bây giờ, bạn đã có một ứng dụng quản lý bảng điểm sinh viên tương đối đầy đủ với các chức năng CRUD cho cả sinh viên, môn học và điểm số!
Bạn có muốn tìm hiểu thêm về cách hiển thị bảng điểm tổng hợp của một sinh viên (tức là tất cả các môn học và điểm số của một sinh viên cụ thể) không?
Bảng điểm tổng hợp của một sinh viên
Tuyệt vời! Hiển thị bảng điểm tổng hợp của một sinh viên là một chức năng quan trọng. Chúng ta sẽ thêm một trang mới cho phép người dùng chọn một sinh viên và xem tất cả các môn học cùng điểm số mà sinh viên đó đã đạt được.
1. Cập nhật diem/index.php (tùy chọn)
Để tiện lợi, bạn có thể thêm một cột "Xem bảng điểm" trong bảng điểm tổng quan của diem/index.php (hoặc ngay trên index.php của sinh viên).
* Cách 1: Từ diem/index.php: Thêm một liên kết để xem chi tiết bảng điểm của sinh viên trong cột hành động hoặc một cột mới.
// ... trong vòng lặp while để hiển thị dữ liệu
echo "<td class='actions'>";
echo "<a href='sua_diem.php?ma_sv=" . $row["ma_sv"] . "&ma_mh=" . $row["ma_mh"] . "' class='edit'>Sửa Điểm</a>";
// Thêm nút xem bảng điểm riêng của SV
echo "<a href='xem_bang_diem_sv.php?ma_sv=" . $row["ma_sv"] . "' class='view'>Xem BD</a>"; // Thêm dòng này
echo "</td>";
echo "</tr>";
// ...
Bạn cũng cần thêm CSS cho class view:
.actions a.view { background-color: #337ab7; color: white; }
* Cách 2: Từ index.php (quản lý sinh viên): Thêm một nút "Xem bảng điểm" ngay bên cạnh mỗi sinh viên. Đây là cách phổ biến và hợp lý hơn.
// Cập nhật file `index.php` (ở thư mục gốc)
// ... trong vòng lặp while ($row = $result->fetch_assoc())
echo "<td class='actions'>";
echo "<a href='sua_sinhvien.php?ma_sv=" . $row["ma_sv"] . "' class='edit'>Sửa</a>";
echo "<a href='xoa_sinhvien.php?ma_sv=" . $row["ma_sv"] . "' class='delete' onclick='return confirm(\"Bạn có chắc chắn muốn xóa sinh viên này?\")'>Xóa</a>";
// Thêm liên kết xem bảng điểm riêng
echo "<a href='diem/xem_bang_diem_sv.php?ma_sv=" . $row["ma_sv"] . "' class='view'>Xem Bảng Điểm</a>"; // Thêm dòng này
echo "</td>";
echo "</tr>";
// ...
Thêm CSS cho class view vào file index.php (ở thư mục gốc):
.actions a.view { background-color: #337ab7; color: white; }
2. Tạo file diem/xem_bang_diem_sv.php
Tạo một file mới tên là xem_bang_diem_sv.php bên trong thư mục diem/. File này sẽ nhận ma_sv từ URL, truy vấn tất cả điểm của sinh viên đó và hiển thị.
<?php
include '../config.php'; // Nạp file cấu hình CSDL
$ma_sv_xem = '';
$ten_sv_xem = '';
$message = '';
$has_data = false; // Biến cờ để kiểm tra có dữ liệu để hiển thị hay không
if (isset($_GET['ma_sv']) && !empty($_GET['ma_sv'])) {
$ma_sv_xem = $_GET['ma_sv'];
// Lấy thông tin sinh viên
$sql_sv = "SELECT ten_sv, lop FROM sinhvien WHERE ma_sv = ?";
$stmt_sv = $conn->prepare($sql_sv);
$stmt_sv->bind_param("s", $ma_sv_xem);
$stmt_sv->execute();
$result_sv = $stmt_sv->get_result();
if ($result_sv->num_rows > 0) {
$sv_info = $result_sv->fetch_assoc();
$ten_sv_xem = $sv_info['ten_sv'];
$lop_sv_xem = $sv_info['lop'];
// Truy vấn tất cả điểm của sinh viên này
$sql_diem = "SELECT mh.ten_mh, mh.so_tin_chi, d.diem_so
FROM diem d
JOIN monhoc mh ON d.ma_mh = mh.ma_mh
WHERE d.ma_sv = ?";
$stmt_diem = $conn->prepare($sql_diem);
$stmt_diem->bind_param("s", $ma_sv_xem);
$stmt_diem->execute();
$result_diem = $stmt_diem->get_result();
if ($result_diem->num_rows > 0) {
$has_data = true;
} else {
$message = "<p>Sinh viên này chưa có điểm cho môn học nào.</p>";
}
$stmt_diem->close();
} else {
$message = "<p>Không tìm thấy sinh viên với mã: " . htmlspecialchars($ma_sv_xem) . "</p>";
}
$stmt_sv->close();
} else {
$message = "<p>Vui lòng chọn một sinh viên để xem bảng điểm.</p>";
}
$conn->close();
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bảng Điểm Của Sinh Viên</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.info { margin-bottom: 20px; border: 1px solid #ddd; padding: 10px; background-color: #f9f9f9; border-radius: 5px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.back-link { display: block; margin-top: 20px; text-align: center; text-decoration: none; color: #008CBA; }
</style>
</head>
<body>
<h1>Bảng Điểm Của Sinh Viên</h1>
<?php if (!empty($ma_sv_xem) && !empty($ten_sv_xem)): ?>
<div class="info">
<p><strong>Mã Sinh Viên:</strong> <?php echo htmlspecialchars($ma_sv_xem); ?></p>
<p><strong>Tên Sinh Viên:</strong> <?php echo htmlspecialchars($ten_sv_xem); ?></p>
<p><strong>Lớp:</strong> <?php echo htmlspecialchars($lop_sv_xem); ?></p>
</div>
<?php if ($has_data): ?>
<table>
<thead>
<tr>
<th>Tên Môn Học</th>
<th>Số Tín Chỉ</th>
<th>Điểm Số</th>
</tr>
</thead>
<tbody>
<?php
// Để hiển thị lại kết quả, bạn cần thực hiện lại truy vấn nếu muốn
// Hoặc lưu kết quả vào một mảng trước đó và lặp qua mảng đó
// Ở đây, tôi sẽ thực hiện lại truy vấn đơn giản cho ví dụ
$stmt_diem_re_execute = $conn->prepare($sql_diem);
$stmt_diem_re_execute->bind_param("s", $ma_sv_xem);
$stmt_diem_re_execute->execute();
$result_diem_re_execute = $stmt_diem_re_execute->get_result();
$total_diem_nhan_tin_chi = 0;
$total_tin_chi = 0;
while($row_diem = $result_diem_re_execute->fetch_assoc()) {
echo "<tr>";
echo "<td>" . htmlspecialchars($row_diem["ten_mh"]) . "</td>";
echo "<td>" . htmlspecialchars($row_diem["so_tin_chi"]) . "</td>";
echo "<td>" . htmlspecialchars($row_diem["diem_so"]) . "</td>";
echo "</tr>";
$total_diem_nhan_tin_chi += ($row_diem["diem_so"] * $row_diem["so_tin_chi"]);
$total_tin_chi += $row_diem["so_tin_chi"];
}
$stmt_diem_re_execute->close();
if ($total_tin_chi > 0) {
$diem_trung_binh = $total_diem_nhan_tin_chi / $total_tin_chi;
echo "<tr><td colspan='2' style='text-align: right; font-weight: bold;'>Điểm Trung Bình:</td><td style='font-weight: bold;'>" . number_format($diem_trung_binh, 2) . "</td></tr>";
} else {
echo "<tr><td colspan='3' style='text-align: center;'>Không có điểm nào để tính trung bình.</td></tr>";
}
?>
</tbody>
</table>
<?php else: ?>
<?php echo $message; ?>
<?php endif; ?>
<?php else: ?>
<?php echo $message; ?>
<?php endif; ?>
<a href="index.php" class="back-link">Quay lại danh sách điểm</a> |
<a href="../index.php" class="back-link">Quay lại quản lý sinh viên</a>
</body>
</html>
Giải thích code mới
* Nhận ma_sv từ URL: Sử dụng $_GET['ma_sv'] để lấy mã sinh viên được truyền từ trang trước.
* Lấy thông tin sinh viên: Truy vấn bảng sinhvien để lấy tên sinh viên và lớp, hiển thị ở đầu trang.
* Lấy điểm của sinh viên:
* Sử dụng lệnh SELECT với JOIN giữa bảng diem và monhoc để lấy tên môn học, số tín chỉ và điểm số.
* Sử dụng WHERE d.ma_sv = ? để lọc theo mã sinh viên cụ thể.
* Sử dụng Prepared Statements để an toàn.
* Hiển thị bảng điểm: Dữ liệu được hiển thị trong một bảng HTML.
* Tính điểm trung bình (tùy chọn): Tôi đã thêm logic để tính điểm trung bình chung của sinh viên dựa trên điểm số và số tín chỉ của từng môn học.
* $total_diem_nhan_tin_chi: Tổng của (điểm số * số tín chỉ) của tất cả các môn.
* $total_tin_chi: Tổng số tín chỉ của tất cả các môn.
* Điểm trung bình = total_diem_nhan_tin_chi / total_tin_chi.
* Kiểm tra và thông báo: Xử lý các trường hợp không tìm thấy sinh viên hoặc sinh viên chưa có điểm.
Cách chạy chức năng này
* Cập nhật các file:
* Cập nhật file index.php (ở thư mục gốc) hoặc diem/index.php (tùy theo bạn chọn cách tích hợp liên kết) với đoạn code đã hướng dẫn ở bước 1.
* Tạo file diem/xem_bang_diem_sv.php và dán toàn bộ code trên vào.
* Truy cập:
* Truy cập http://localhost/bangdiem_crud/index.php.
* Thêm một vài sinh viên và môn học.
* Thêm điểm cho các sinh viên và môn học đó trong http://localhost/bangdiem_crud/diem/them_diem.php.
* Trên trang danh sách sinh viên (index.php), bạn sẽ thấy nút "Xem Bảng Điểm" bên cạnh mỗi sinh viên. Nhấp vào đó để xem bảng điểm chi tiết của sinh viên đó.
Chức năng này giúp người dùng dễ dàng xem được tổng quan kết quả học tập của từng sinh viên.
Bạn có câu hỏi nào về phần này không, hoặc muốn tìm hiểu thêm về các chức năng khác như xuất bảng điểm ra Excel chẳng hạn?
0 Reviews