------
Phần 79.
Bài tập xử lý tập tin 2
Đây là clip số 84:
Bổ sung hàm convertSize vào cuối tập tin functions.php
[functions.php]
// hàm chuyển đơn vị đo kích thước tập tin
function
convertSize($size, $totalDigit = 2, $distance = ' ') {
$units = array('B',
'KB', 'MB', 'GB', 'TB');
$length =
count($units);
for($i = 0; $i <
$length; $i++) {
if ($size >= 1024)
{
$size = $size/1024;
} else {
$unit = $units[$i];
break;
}
}
$result = round($size,
$totalDigit) . $distance . $unit;
return $result;
}
Viết mã cho trang index.php,
[index.php]
<!DOCTYPE html>
<html lang="en">
<head>
<meta
charset="UTF-8">
<title>File</title>
<link
rel="stylesheet" href="style.css">
</head>
<body>
<?php
require_once
'functions.php';
$data =
scandir('./files');
?>
<div
class="wrapper">
<div
class="heading">QUẢN LÝ TẬP TIN</div>
<form
action="multipleDelete.php" method="post">
<?php
$i = 0;
foreach ($data as
$key => $value) {
if ($value == '.'
|| $value == '..' || preg_match('/.txt$/imsU', $value) == false) continue;
$content =
file_get_contents('./files/'.$value);
$content =
explode('||', $content);
$title =
$content[0];
$description =
$content[1];
$id =
substr($value, 0, 5);
$size =
convertSize(filesize('./files/'.$value));
?>
<div
class="row <?php if ($i % 2 == 0) echo 'odd'; ?>">
<p
class="check">
<input type="checkbox"
name="checkbox[]" value="fileName">
</p>
<p
class="content"><?php echo $title; ?><span><?php
echo $description; ?></span></p>
<p
class="id"><?php echo $id; ?></p>
<p
class="size"><?php echo $size; ?></p>
<p
class="action">
<a
href="edit.php?id=<?php echo $id; ?>">Edit</a> |
<a
href="delete.php?id=<?php echo $id; ?>">Delete</a>
</p>
</div>
<?php
$i++;
}
?>
</form>
</div>
</body>
</html>
Đây là clip số 85:
Viết mã cho chức năng Edit một tập tin,
[edit.php]
<!DOCTYPE html>
<html lang="en">
<head>
<meta
charset="UTF-8">
<title>Document</title>
<link
rel="stylesheet" href="style.css">
<script
src="js/jquery.js"></script>
<script>
$(document).ready(function() {
$('#btnHuy').click(function()
{
window.location =
'index.php';
});
});
</script>
</head>
<body>
<?php
require_once
'functions.php';
$id = $_GET['id'];
$content =
file_get_contents('./files/' . $id . '.txt');
$content = explode('||',
$content);
$title = $content[0];
$description =
$content[1];
$flag = false;
$errorTitle = '';
$errorDescription = '';
if
(isset($_POST['title']) && isset($_POST['description'])) {
$title =
$_POST['title'];
$description =
$_POST['description'];
// kiểm tra dữ liệu
nhập vào
if (checkEmpty($title))
{
$errorTitle = '<p
class="error">Tiêu đề không được để trống</p>';
}
if (checkLength($title,
5, 100)) {
$errorTitle .= '<p
class="error">Tiêu đề dài từ 5 đến 100 kí tự</p>';
}
if
(checkEmpty($description)) {
$errorDescription =
'<p class="error">Mô tả không được để trống</p>';
}
if
(checkLength($description, 10, 500)) {
$errorDescription .=
'<p class="error">Mô tả dài từ 10 đến 500 kí tự</p>';
}
// nếu dữ liệu hợp lệ
if ($errorTitle == ''
&& $errorDescription == '') {
$data = $title . '||'
. $description;
$fileName =
'./files/' . $id . '.txt';
if
(file_put_contents($fileName, $data)) {
$title = '';
$description = '';
$flag = true;
}
}
}
?>
<div
class="wrapper">
<div
class="heading">ADD FILE</div>
<div
id="form">
<form
action="#" method="post">
<div
class="row">
<p
class="title">Tiêu đề</p>
<input type="text"
name="title" value="<?php echo $title; ?>">
<?php echo
$errorTitle; ?>
</div>
<div
class="row">
<p
class="title">Mô tả</p>
<textarea
name="description" rows="5"
cols="100"><?php echo $description; ?></textarea>
<?php echo
$errorDescription; ?>
</div>
<div
class="row">
<input
type="submit" value="Lưu">
<input
type="button" value="Hủy" id="btnHuy">
</div>
<?php
if ($flag ==
true) {
echo '<div
class="row">Ghi dữ liệu thành công!</div>';
}
?>
</form>
</div>
</div>
</body>
</html>
Lưu ý: ở trong edit.php, nếu thay đoạn mã <form
action="#" method="post"> thành <form
action="edit.php" method="post"> sẽ bị lỗi, nguyên nhân
là do giá trị id truyền trên URL bị mất khi action=“edit.php”.
Viết mã cho chức năng Delete,
[delete.php]
<!DOCTYPE html>
<html lang="en">
<head>
<meta
charset="UTF-8">
<title>Document</title>
<link rel="stylesheet"
href="style.css">
<script
src="js/jquery.js"></script>
<script>
$(document).ready(function() {
$('#btnHuy').click(function() {
window.location =
'index.php';
});
});
</script>
</head>
<body>
<?php
require_once
'functions.php';
$id = $_GET['id'];
$content =
file_get_contents('./files/' . $id . '.txt');
$content = explode('||',
$content);
$title = $content[0];
$description =
$content[1];
$flag = false;
if (isset($_POST['id']))
{
$id = $_POST['id'];
@unlink('./files/' .
$id . '.txt');
$flag = true;
}
?>
<div
class="wrapper">
<div
class="heading">DELETE FILE</div>
<?php if ($flag ==
false) { ?>
<div
id="form">
<form
action="#" method="post">
<div
class="row">
<p>Tập
tin:</p>
<span><?php echo realpath('./files/' . $id . '.txt');
?></span>
</div>
<div
class="row">
<p>Tiêu
đề:</p>
<span><?php echo $title; ?></span>
</div>
<div
class="row">
<p>Mô tả:</p>
<span><?php echo $description; ?></span>
</div>
<div
class="row">
<input
type="hidden" name="id" value="<?php echo $id;
?>">
<input
type="submit" value="Xóa">
<input
type="button" value="Hủy" id="btnHuy">
</div>
</form>
<?php }else {
echo '<p>Đã
xóa được tập tin. Bấm vào <a href="index.php">đây</a> để
về trang chủ. </p>';
} ?>
</div>
</div>
</body>
</html>
Để ý, trong delete.php có sử dụng một trường input ẩn để gửi
id của tập tin cần xóa về server: <input type="hidden"
name="id" value="<?php echo $id; ?>">
Để hệ thống không xuất cảnh báo khi hàm unlink bị thất bại,
thêm dấu @ phía trước của nó. Ví dụ:
@unlink('./files/' . $id . '.txt');
Xóa nhiều tập tin,
Thêm đoạn mã sau vào cuối tập tin index.php
…
?>
</form>
<div>
<a
href="add.php">Thêm tập tin</a>
<a id="multipleDelete" href="#">Xóa tập
tin</a>
</div>
</div>
</body>
…
Sử dụng jQuery để thực hiện submit một form, (khi bấm vào
một nút bất kì, nút này không thuộc kiểu submit và không nằm trong form):
$(document).ready(function() {
$('#multipleDelete').click(function() {
$('#mainForm').submit();
});
});
[multipleDelete.php]
<!DOCTYPE html>
<html lang="en">
<head>
<meta
charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<?php
$checkbox =
$_POST['checkbox'];
if (!empty($checkbox)) {
foreach ($checkbox as
$key => $value) {
@unlink('./files/' .
$value . '.txt');
}
}
?>
<div
class="wrapper">
<div
class="heading">DELETE FILE</div>
</div>
<div>
<p>Đã xóa được
tập tin. Bấm vào <a href="index.php">đây</a> để về trang
chủ. </p>
</div>
</div>
</body>
</html>
[index.php]
<!DOCTYPE html>
<html lang="en">
<head>
<meta
charset="UTF-8">
<title>File</title>
<link
rel="stylesheet" href="style.css">
<script
src="js/jquery.js"></script>
<script>
$(document).ready(function() {
$('#multipleDelete').click(function() {
$('#mainForm').submit();
});
});
</script>
</head>
<body>
<?php
require_once
'functions.php';
$data =
scandir('./files');
?>
<div
class="wrapper">
<div
class="heading">QUẢN LÝ TẬP TIN</div>
<form
action="multipleDelete.php" method="post" id="mainForm">
<?php
$i = 0;
foreach ($data as
$key => $value) {
if ($value == '.'
|| $value == '..' || preg_match('/.txt$/imsU', $value) == false) continue;
$content =
file_get_contents('./files/'.$value);
$content = explode('||', $content);
$title =
$content[0];
$description =
$content[1];
$id =
substr($value, 0, 5);
$size =
convertSize(filesize('./files/'.$value));
?>
<div
class="row <?php if ($i % 2 == 0) echo 'odd'; ?>">
<p
class="check">
<input
type="checkbox" name="checkbox[]" value="<?php echo
$id; ?>">
</p>
<p
class="content"><?php echo $title; ?><span><?php
echo $description; ?></span></p>
<p
class="id"><?php echo $id; ?></p>
<p
class="size"><?php echo $size; ?></p>
<p
class="action">
<a
href="edit.php?id=<?php echo $id; ?>">Edit</a> |
<a
href="delete.php?id=<?php echo $id; ?>">Delete</a>
</p>
</div>
<?php
$i++;
}
?>
</form>
<div>
<a
href="add.php">Thêm tập tin</a>
<a
id="multipleDelete" href="#">Xóa tập tin</a>
</div>
</div>
</body>
</html>
Sử dụng thuộc tính name=array[] của checkbox để lấy về một
mảng các giá trị, ví dụ:
<input type="checkbox" name="checkbox[]"
value="<?php echo $id; ?>">
-----------
Cập nhật [16/9/2020]
-----------