Ngu ngơ học làm web (79) - Bài tập xử lý tập tin 2

Tiếp theo của: Ngu ngơ học làm web (78) - Bài tập xử lý tập tin 1 
------

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]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web