Để thêm thông tin vào csdl, ta cũng thực hiện giống như trong truy vấn nhận dữ liệu, tuy nhiên hàm mysql_query() sẽ không trả về các tập mẩu tin như câu truy vấn select mà trả về một trong 2 giá trị true/false tương ứng với việc thi hành thành công câu truy vấn hay không. Trong các truy vấn cập nhật dữ liệu, cần lưu ý việc vi phạm ràng buộc dữ liệu.
Một số vấn đề cần lưu ý khi thêm dữ liệu:
- Kiểm tra dữ liệu cần thêm vào có thỏa mãn hay không. Ví dụ, không được phép trùng khoá chính. Do vậy, thông thường việc thêm dữ liệu sẽ kết hợp cùng với các query select để kiểm tra.
- Xác nhận thông tin của người dùng: Thông thường vần đề cập nhật dữ liệu là của người quản trị, do vậy ta cần kiểm tra xác thực của thông tin người đăng nhập. Do vậy ta phải viết các đọan mã để xác nhận đúng người có quyền thi hành câu truy vấn này. Để minh họa cho phần này, ta xây dựng các trang cho phép thêm vào mặt hàng mới. Trong bảng mathang, field hinhanh chỉ là tên của file hình cho mặt hàng. Nội dung file hình thực sự ta lưu ở thư mục Images. Do vậy, với việc thêm vào bảng mặt hàng, ngoài việc thêm dữ liệu văn bản vào CSDL, ta còn phải copy file hình tương ứng vào thư mục Images. Do đó form nhập liệu từ máy khách để gửi đi phải có thuộc tính: method = POST và thuộc tính enctype="multipart/form-data”. Hơn nữa phải đảm bảo là ta được quyền upload hình lên thư mục đã định.
Để thêm một mặt hàng, ta sử dụng 2 trang chính: Một trang tạo ra form nhập liệu, một trang thi hành các thao tác với dữ liệu: Kiểm tra và báo lỗi hay thêm vào CSDL.
Các bước cần làm:
- Tạo một form để nhập dữ liệu. Form này sẽ gửi thông tin tới trang thi hành query thêm dữ liệu (trang insertmathang.php).
- Trang chứa câu truy vấn insert: Làm nhiệm vụ kiểm tra dữ liệu hợp lệ hay chưa. Nếu hợp lệ, thi hành đoạn mã thêm vào csdl (trang do_insertmathang.php).
Sau đây là nội dung của từng trang.
Trang insertmathang.php <? include ("Includes/check_login.inc"); function GetLoaihang() { include("Includes/conn.inc"); $sql = "select * from loaihang"; $result = mysql_query($sql, $conn); $s = "";
if (mysql_num_rows($result)>0) {
while($row = mysql_fetch_array($result)) {
$s .= "<option value='" .$row["msloai"] ."'>"; $s .= $row["tenloai"] ."</option>"; } } return $s; } ?> <body> <? include ("Includes/link_logout.inc"); ?>
Nh?p vào các thông tin
<form name=form1 action="do_insertmathang.php" method=post enctype="multipart/form- data">
<table border=1 cellspacing=0 align=center>
<tr><td>Ten mat hang *</td><td> <input type=text name=tenmh></td></tr> <tr><td>Mo ta *</td><td> <textarea name=mota cols=26 rows=6>
</textarea></td></tr> <tr><td>Loai hang *</td> <td> <select name=lh> <? echo GetLoaihang() ; ?> </select></td></tr>
<tr><td>Hinh </td><td> <input type=file name=hinhanh></td></tr> <tr><td>Gia* </td><td> <input type=text name=gia></td></tr> <tr><td colspan=2 align=center>
<input type=submit value="Nhap"> <input type=Reset value="Xoa"></td></tr> </table>
</form>
Trang insertmathang.php chứa form để nhập dữ liệu. Ta có thể kết hợp với mã javascript để kiểm tra một số thông tin trước khi gửi đi. Ví dụ, các field phải có dữ liệu. Field hình phải chọn các file hình, giá phải là một số dương, …Trang này có hàm GetLoaihang() để đưa thông tin loại hàng vào combobox cho người sử dụng chọn. Nội dung của form khi submit sẽ được chuyển tới trang có các đoạn mã kết nối tới csdl là do_insertmathang.php.
Khi xây dựng trang do_insertmathang.php, ta cần chú ý
- msmh có kiểu dữ liệu là autonumber, do vậy ta không phải chèn vào mà được mysql lấy tự động.
- tenmh: Không có 2 mặt hàng trùng tên, do vậy trước khi chèn vào, ta phải dùng truy vấn select để kiểm tra có mặt hàng với tên này chưa. Nếu chưa ta sẽ thêm vào bảng. Nếu đã có, ta quay lại trang nhập liệu để người sử dụng nhập lại dữ liệu.
- Ta cũng có thể kiểm tra thêm các thông tin khác bằng mã php như: file gửi lên phải là file hình, giá phải là một số, …Tuy nhiên ta có thể kết hợp mã javascript trong trang insertmathang.php để kiểm tra dữ liệu trước khi form được submit để tăng tốc độ xử lý.
- Bảng mathang có field hinhanh là tên của file hình được lưu trong bảng. Nội dung file hình được lưu trong thư mục Images với cùng tên trong bảng. Ta cũng có thể lưu file hình với tên mới tương ứng với msmh để đảm bảo không trùng tên file hình dẫn đến các hình của sản phẩm trước bị mất nếu trùng tên file hình với sản phẩm sau. Có thể thay phần tên của file hình chính là msmh (phần mở rộng giữ nguyên) thì sẽ đảm bảo được vấn đề trùng tên.
Mã trang do_insertmathang.php được viết như sau: <?
include("Includes/check_login.inc"); include("Includes/link_logout.inc"); include("Includes/conn.inc"); /*
Hàm kiểm tra xem mặt hàng ta cần chèn vào đã có trong bảng mathang chưa. Hàm trả về 1 nếu tên mặt hàng đã có trong bảng mathang, ngược lại trả về 0).
*/
function TenMH_Exist($tenMH, $conn) {
$sql = "select maMH from mathang where tenMH='". $tenMH ."'"; $rows = mysql_query($sql, $conn);
if (mysql_num_rows($rows) >0) return 1; return 0; } if (isset($_POST["tenmh"])==false) Header("Location: insertmathang.php"); $tenmh = $_POST["tenmh"]; $mota = $_POST["mota"]; $lh = $_POST["lh"]; $hinhanh_name = $_FILES["hinhanh"]["name"]; $gia = $_POST["gia"]; /*
Nếu mặt hàng đã có, thông báo lỗi và một liên kết cho người nhập liệu quay trở về trang form nhập hàng.
*/
if (TenMH_Exist($tenmh, $conn)) {
echo "<hr>Lỗi. Đã có mặt hàng:" .$tenmh .”<br>”;
echo"<A href='#' onclick='javascript:window.history.go(-1);'> Nhap lai </A>"; exit; // Dừng chương trình nếu có lỗi
}
//Tạo câu truy vấn insert.
$sql = "Insert into mathang(tenmh, mota, msloai, hinhanh, gia)";
$sql.=" Values('" .$tenmh ."','" .$mota ."'," . $lh .",'" .$hinhanh_name ."'," .$gia .")"; // Thi hanh truy van.
mysql_query($sql, $conn); //Kiểm tra xem có file hình không. if ($hinhanh_name !="")
{
// Trường hợp có file: Thiết lập đường dẫn cho file đích. $pathfile = "Images/" . $hinhanh_name;
//Chép hình vào thư mục Images với tên cũ là $hinhanh_name.
move_uploaded_file($_FILE["hinhanh"]["tmp_name"], $pathfile)
}
echo "<br><A href='insertmathang.php'> Them </a> "; ?>
Cần kiểm tra thêm file hình ảnh đưa lên server có lỗi hay không như trong phần upload file. 16.2 Sửa Dữ Liệu
Việc sửa cũng như thêm dữ liệu. Ta xác định dòng dữ liệu cần sửa để thiết lập các câu truy vấn thích hợp. Ta sử dụng ví dụ về sửa dữ liệu trong bảng mặt hàng.
Để sửa một mặt hàng, ta bắt đầu vào trang Updatemathang1.php. Trang này hiển thị thông tin của các mặt hàng. Có thể đây là thông tin kết quả tìm kiếm theo một tiêu chuẩn cho trước. Mỗi mặt hàng có một liên kết kèm theo một biến là mã mặt hàng được gửi tới trang updatemathang2.php. Trang này làm nhiệm vụ nhận mặt hàng (qua mã mặt hàng) và hiển thị thông tin của mặt hàng cần sửa ra một form. Form sau khi sửa sẽ được submit tới trang Do_updatemathang.php. Trang này làm nhiệm vụ nhận các thông tin mặt hàng vừa sửa, sau đó kết nối CSDL, tạo câu truy vấn thích hợp và thi hành.Nội dung 3 trang này như sau:
Updatemathang1.php <?
include("Includes/check_login.inc"); include("Includes/link_logout.inc");
include("includes/conn.inc"); ?>
<Body>
// Hiển thị tất cả các mặt hàng $sql = "select * from mathang"; $result = mysql_query($sql, $conn); //Nếu kết quả truy vấn có dữ liệu. if (mysql_num_rows($result) >0) {
$S = "<table border=1 cellspacing=0>";
$S .="<tr> <td> Ten MH</td><td> Mo ta </td>"; $S .= "<td> Hinh </td><td> Gia </td></tr>"; while ($row = mysql_fetch_array($result)) {
/*
Tạo link để gửi dữ liệu (mamh-mã mặt hàng) cần cập nhật tới trang updatemathang2.php
*/
$S .="<tr><td><A href='updatemathang2.php?msmh=". $row[“msmh”] ."'>"; $S .= "<font face=tahoma>" .$row[1] ."</A></td>";
$S .= "<td><font face=tahoma> " . nl2br($row["mota"]) ."</td>"; $S .= "<td><Img src='Images/" . $row["hinhanh"] ."' “;
$S .= “width=40 height=65 ></td>"; $S .= "<td>" . $row["gia"] ."</td></tr>"; } $S .= "</table>"; echo $S; } mysql_close($conn); ?>
Hiển thị của trang updatemathang1.php có thể như sau
Ở đây CD Write là một liên kết. Khi người sử dụng click vào, liên kết sẽ gửi mã mặt hàng của mặt hàng CD Write tới trang updatemathang2.php để thi hành.
<?
include("Includes/check_login.inc"); include("Includes/link_logout.inc"); include("includes/conn.inc");
/*
Hàm dùng để in ra hộp combo box cho phép chọn loại hàng. Hàm có một tham số $ml (mã loại) để duy trì chọn mặt hàng này mặc định. Đây là loại hàng cũ của mặt hàng */
function GetLoaihang($ml) {
include("Includes/conn.inc"); $sql = "select * from loaihang"; $result = mysql_query($sql, $conn); $s = ""; if (mysql_num_rows($result)>0) { while($row = mysql_fetch_array($result)) { if ( $row["msloai"] == $ml)
$s .= "<option value ='" .$row["msloai"] ."' selected>"; else
$s .= "<option value = '" .$row["msloai"] ."'>"; $s .= $row["tenloai"] ."</option>";
} }
return $s; }
//Lấy thông tin của mặt hàng cần sửa để hiển thị ra form $msmh = $_GET[“msmh”];
$sql = "select * from mathang where msmh=" .$msmh; $result = mysql_query($sql, $conn);
$row = mysql_fetch_array($result); ?>
Hãy nhập vào các thông tin để sửa.
<form action=doupdatemathang.php method=GET> <table border=1 cellspacing=0>
<tr> <td> Ma MH </td>
<td> <? echo $mamh; ?> </td>
<input type=hidden name=msmh value='<?= $msmh ?>'></tr> <tr> <td> Ten MH </td>
<td> <input type=text name=tenmh value='<?= $row["tenmh"] ?>'> </td></tr>
<tr> <td> Mo ta </td>
<td> <textarea name=mota cols=20 row=6>
<?=$row["mota"] ?></textarea> </td></tr> <tr> <td>Loai </td>
<td> <select name=ml>
<? echo GetLoaihang($row["msloai"]);?> </select> </td></tr>
<tr> <td> Hinh </td>
<td> <Img src='Images/<?= $row["hinhanh"] ?>'> </td></tr> <tr> <td> Gia </td>
<td> <input type=text name=gia value='<?= $row["gia"] ?>'> </td></tr> <tr> <td colspan=2 align=center><input type=submit value="Sua">
<input type=Reset value="Xoa"></td></tr> </table>
<?
mysql_close($conn); ?>
Hiển thị mặt hàng CD RWrite trong file updatemathang2.php
Nhập dữ liệu cần sửa, click nút Sua thông tin đã sử của form sẽ được đưa tới trang doupdatemathang.php. Trang này sẽ nhận các thông tin: mã mặt hàng, tên mặt hàng, mô tả, loại hàng, giá sau đó thiết lập thành các câu truy vấn update thích hợp, kết nối tới CSDL và thực thi câu truy vấn này.
Mã của trang doupdatemathang.php <? include("Includes/check_login.inc"); include("Includes/link_logout.inc"); include("Includes/conn.inc"); $ml = $_GET[“ml”]; $tenmh = $_GET[“tenmh”]; $mota = $_GET[“mota”]; $gia = $_GET[“gia”]; // Thiết lập câu truy vấn
$sql = "update mathang set tenmh='" .$tenmh ."',"; $sql .= " mota = '" .$mota . "',";
$sql .= " msloai=" . $ml .", ";
$sql .= " gia=" . $gia ." where msmh='". $msmh ."'"; if (mysql_query($sql, $conn)) echo "Da cap nhat.";
else "Loi du lieu."; ?>
<hr>
<a href="Updatemathang1.php"> Tiep tuc </a>
Để hoàn chỉnh trang này, trước khi thi hành, ta cần kiểm tra các thông tin có hợp lệ hay không giống như khi thêm vào một mặt hàng. Ở đây ta không cho sửa mã mặt hàng và hình ảnh. Nếu muốn sửa cả hình ảnh của mặt hàng, ta phải làm thêm 2 thao tác:
- Xoá hình của mặt hàng cần sửa trong Images - Thêm hình mới của mặt hàng vào Images. 16.3 Xoá Dữ Liệu
Với việc xoá, ta cũng làm như update nhưng câu sql là “delete from mathang where msmh= “ .$msmh. Thông thường, các chức năng thêm, sửa, xóa cần được kết hợp chặt chẽ với các chức năng tìm kiếm (truy vấn select) thông tin để thuận lợi hơn cho người sử dụng. Ví dụ, người sử dụng sẽ tìm các truy dữ liệu xem lại trước khi sửa hay xóa chúng.