Download Counter Language Table of Contents
 Japanese [日本語]  
 English [英語]  
 Korean [韓国語]  
 Simplified Chinese [简体中文]  
 Traditional Chinese [繁體中文]  
 Español [スペイン語]  
 Français [フランス語]  
 Português [ポルトガル語]  
  Arabic العربية [アラビア語]  
 Deutsch [ドイツ語]  
 Italiano [イタリア語]  
 Russian [ロシア語]  
 Turkish [トルコ語]  
 Hindi [ヒンディー語]  
Vietnamese [ベトナム語]  
 Thai [タイ語]  
 Dutch [オランダ語]  
 Indonesian [インドネシア語]  
 Malay [マレー語]  
 Filipino [フィリピン語]  
 Swedish [スウェーデン語]  
 Norwegian [ノルウェー語]  
 Danish [デンマーク語]  
 Finnish [フィンランド語]  
 Polish [ポーランド語]  
 Czech [チェコ語]  
 Hungarian [ハンガリー語]  
 Greek [ギリシャ語]  
 Romanian [ルーマニア語]  

Tính Số Lượt Tải về
Chương Trình Xem Lịch Sử Tải về
= Tải về và Cài đặt Mã PHP =
Sample Download Counter

Giới Thiệu:

Đây là phần giới thiệu về một chương trình cho phép bạn biết số lượt tải xuống khi người dùng trang web tải xuống và sử dụng một chương trình. Có thể thiết lập bộ đếm lượt tải xuống trên trang và quản trị viên trang cũng có thể dễ dàng kiểm tra lịch sử tải xuống trên trình duyệt.

[Mẫu Đã Cài Đặt Trên Trang]
Tổng Lượt Tải Xuống: 1865 [Hôm nay: 23 Hôm qua: 76]
[Mẫu Mở Trong Trình Duyệt]

Lưu ý: Nếu một trang có liên kết tải về hiển thị thông báo yêu cầu lưu tệp và bị đóng mà không khởi chạy quá trình tải về, nó vẫn sẽ được tính là một lượt tải về. Điều này là do nó đếm số lần nhấp vào liên kết.

Hướng Dẫn Tải về:

Từ trang này, tải về tệp "zip" được nén của chương trình và cài đặt nó trên trang web của bạn. Tệp có tên "count.php", nhưng bạn có thể đổi tên nó.

Bạn có quyền sử dụng và sửa đổi mã nguồn, bao gồm cả việc thay đổi thiết kế trang.

Vui lòng sửa đổi mã nguồn để thêm các chức năng mới hoặc thay đổi thiết kế để tạo ra một trang dễ hiểu và sử dụng.

 Tải về Chương Trình PHP:
Hướng Dẫn Cài Đặt:

Giải nén tệp "count.php.zip" đã tải về, và một tệp có tên "count.php" sẽ được tạo ra. Vui lòng tạo một thư mục như là "download_history" và lưu nó ở đó.

Tệp "zip" chỉ chứa một tệp, "count.php," và "màn hình đăng nhập" cho người quản trị được tạo tự động.

Cài Đặt:

Đây là phương pháp cài đặt chính. Những phần chính này cũng được liệt kê trong tệp PHP.

  1. Cài Đặt Mật Khẩu:
    1. Một mật khẩu phải được đặt cho trang quản trị viên.
    2. Mật khẩu mặc định là "admin", nhưng bạn hãy thay đổi nó thành bất kỳ chuỗi nào bạn muốn.
    3. Để tăng cường bảo mật, hãy đặt một mật khẩu mạnh.
  2. Cài Đặt Tệp để Tải Xuống:
    1. Hoàn tất cài đặt cho "$targetFiles = array()".
    2. Đây là phần như "'1' => 'Đường dẫn của bạn/tên tệp.zip',".
  3. Thư mục Lưu Tệp Log:
    1. Một thư mục có tên "log" cần thiết trên máy chủ từ xa để lưu trữ các tệp log ghi lại lịch sử.
    2. Chương trình này tự động tạo một thư mục có tên "log" khi bạn tải lên lần đầu tiên. Tuy nhiên, nếu bạn nhận được một thông báo như "Không có thư mục", vui lòng tạo và tải lên nó một cách riêng biệt.
  4. Hiển Thị Lần Tải Lên Lần Đầu:
    1. Khi tải lên lần đầu tiên, "ngày" và số "0" có thể được hiển thị trong lịch sử.
    2. Điều này là do các tệp log như "count_1.log" chứa ngày tải lên cũng được tạo ra trong thư mục "log" được tạo tự động.
    3. Nếu điều này làm phiền bạn, hãy tải một tệp như "count_1.log" từ máy chủ từ xa, xóa dữ liệu và tải lên nó.
    4. Tuy nhiên, trạng thái "ngày" và "0" cũng có thể là một lịch sử của khi bộ đếm bắt đầu. Nếu có tải về vào ngày đó, nó sẽ được đếm lên.
  5. Hiển Thị Trang Xem của Quản Trị Viên:
    1. Khi quản trị viên xem trang, bạn có thể chọn xem URL hay chỉ tên tệp.
    2. Nếu đặt nhiều bảng lịch sử trên cùng một trang, bạn có thể chọn giữ chúng theo thứ tự được đặt bởi "$targetFiles = array()" hoặc sắp xếp chúng theo thứ tự của ngày khi xuất hiện bản ghi mới.
  6. Thiết Kế Trang, CSS, v.v.:
    1. Hãy điều chỉnh thiết kế trang, CSS, v.v., phù hợp để trang dễ đọc.
    2. Một thời gian trước, CSS được viết dưới dạng một tệp bên ngoài, nhưng bây giờ nó được viết trực tiếp trong cùng một trang để bạn có thể tham khảo các thẻ khi thay đổi CSS.
  7. Thiết Lập Liên Kết Tải Xuống Trên Trang:
    1. Thông thường, thẻ <a> tải về được viết như sau:
      <a href="/download_history/sample.zip" download="File name when downloading.zip">[Chuỗi tùy ý]</a>
    2. Trong chương trình này, viết thẻ <a> tải về như sau:
    3. [Ví dụ]Sao chép
      <a href="/download_history/count.php?download=1" download="File name when downloading.zip" target="_blank">[Chuỗi tùy ý]</a>
    4. Phù hợp số trong "download=1" với số được đặt trong "$targetFiles = array()". Cài đặt này liên quan đến các tệp cần tải về.
    5. Hãy phù hợp đường dẫn với trang của bạn.
    6. Hãy tải lên trang với liên kết tải về sau khi đã tải lên tệp với "$targetFiles = array()" (trong ví dụ này, "count.php").
  8. Mã Hiển Thị Lịch Sử Trong Một Dòng:
    1. Tạo JavaScript sau đây và đặt nó trên trang bạn muốn hiển thị:
    2. [Ví dụ] Sao chép
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Phù hợp số trong "dsp_count=1" với số được đặt trong "$targetFiles = array()".
    4. Nếu bạn xóa "&day_dsp=on," chỉ "tổng số" sẽ được hiển thị mà không có hiển thị "hôm nay/hôm qua".
    5. Tổng Lượt Tải Xuống: 1865 [Hôm nay: 23 Hôm qua: 76]
      Tổng Lượt Tải Xuống: 1865
    6. Hãy phù hợp đường dẫn với trang của bạn.
Về Cài Đặt Mở Rộng

Khi hiển thị nhiều bảng, cấu hình mặc định của chương trình này là sắp xếp theo thời gian cập nhật cuối cùng. Nếu bạn muốn sắp xếp theo tổng số lượt tải về, hãy tạo một tệp mới như "total_downloads.php" và thay thế phần sau.

  1. Thay Đổi Trong Phần Bình Luận
    Thay thế các phần bình luận trong phần sau:
    // Chọn có thay thế mảng gốc bằng một mảng mới được sắp xếp theo thứ tự của các nhật ký mới khi hiển thị nhiều bảng trên một trang
  2. Sao chép phần bình luận cần thay thế
    // Nếu nhiều bảng được hiển thị trên trang, hãy chọn/đặt xem có thay thế mảng ban đầu hay không và sắp xếp theo thứ tự giảm dần của tổng số lượt tải xuống.
  3. Thay Đổi Trong Mã Và Bình Luận
    Thay thế mã và bình luận trong phần sau. Coi nó như một khối đơn.
    // Lấy đường dẫn tệp và ngày cập nhật cuối cùng của chúng (được sắp xếp giảm dần theo ngày)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Xuất lỗi này vào nhật ký và quyết định liệu có tiếp tục hay hủy bỏ quá trình xử lý
            echo "Lỗi: Tệp không tồn tại - $path<br>";
        }
    }
    
    // Sắp xếp giảm dần theo ngày cập nhật cuối cùng (ngày mới nhất đứng đầu)
    arsort($filePathsAndDates);
    
    // Xây dựng lại mảng các đường dẫn tệp đã được sắp xếp
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Sao chép mẫu của phần sẽ được đặt tên là "config.php"
    // Mảng lưu trữ tổng số lượt download
    $totalDownloads = array();
    
    // Lấy đường dẫn file và tổng số lượt download của nó
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // Tổng số lượt tải xuống cho mỗi hàng
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
            // Lưu tổng số lượt download vào một mảng
            $totalDownloads[$key] = $total;
        } else {
            // Xuất lỗi này ra nhật ký và quyết định tiếp tục hay hủy bỏ quá trình
            echo "Lỗi: Tệp không tồn tại - $path<br>";
        }
    }
    
    // Sắp xếp theo tổng số lượt tải xuống theo thứ tự giảm dần
    arsort($totalDownloads);
    
    // Xây dựng lại mảng đường dẫn file đã được sắp xếp
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Tạo và cài đặt tập tin
    1. Khi tạo nhiều trang, để tránh lỗi trong việc cài đặt các mục khi thêm nội dung một cách đồng đều, hãy tạo phần mã sau đây thành một tệp ngoại vi và tải nó vào phần đang triển khai hiện tại với một mã khác. Hãy tạo một tệp ngoại vi với tên như "config.php".
    // Cấu hình các tệp cần tải về. Nếu có nhiều tệp, thêm chúng như '2', '3', '4', v.v. Đồng thời, '0' cũng là hợp lệ.
    // Sử dụng "http:" hoặc "https:" cho giao thức.
    $targetFiles = array(
        '1' => 'YourURL/FileName.zip',
        '2' => 'YourURL/FileName.pdf',
        '3' => 'YourURL/FileName.pdf',
        '4' => 'YourURL/FileName.pdf',
    );
  6. Sao chép phần mẫu có tên "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Biến nó thành một tập tin bên ngoài và tải nó vào trang được sử dụng với ``include __DIR__ . '/config.php';''.
    // Cấu hình các tệp cần tải về. Nếu có nhiều tệp, thêm chúng như '2', '3', '4', v.v. Đồng thời, '0' cũng là hợp lệ.
    // Sử dụng "http:" hoặc "https:" cho giao thức.
    $targetFiles = array(
        '1' => 'YourURL/FileName.zip',
        '2' => 'YourURL/FileName.pdf',
        '3' => 'YourURL/FileName.pdf',
        '4' => 'YourURL/FileName.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Mã để đọc các tập tin bên ngoài và nơi đặt chúng
    1. Bao gồm tệp được tạo với tên như "config.php" tại vị trí sau với mã "include __DIR__ . '/config.php';".
    2. Chú thích hoặc xóa phần sau và thay thế nó bằng mã "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'YourURL/FileName.zip',
    //    '2' => 'YourURL/FileName.pdf',
    //    '3' => 'YourURL/FileName.pdf',
    //    '4' => 'YourURL/FileName.pdf',
    //);
  8. Sao chép mã để thay thế
    include __DIR__ . '/config.php';
* "font-family" trong chương trình nên được điều chỉnh để phù hợp với trang web của bạn nếu cần.
《 Mã PHP để Tạo Bộ Đếm Tải Xuống 》
Lưu tệp với phần mở rộng ".php".

<?php
//***************************************************************************************************
// Chương Trình PHP Đếm Lượt Tải Về và Trình Xem Lịch Sử Tải Về
// [Sổ Tay Hữu Ích Một Chút Cho Mọi Người]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// Phát hành: 29 tháng 1, 2024
//
// Tổng quan:
// Chương trình này là một hệ thống để theo dõi lịch sử tải về tệp, được trang bị chức năng xác thực người dùng.
// Nó bao gồm các tính năng như làm sạch dữ liệu đầu vào, tạo tệp nhật ký, và hiển thị thống kê tải về.
// Bạn có thể sử dụng nó miễn phí, bao gồm việc sửa đổi mã và thay đổi thiết kế trang.
//
// Lưu ý:
// Trước khi tải lên trang chứa liên kết tải về, hãy chắc chắn cấu hình phần "$targetFiles = array()" của tệp này,
// và tải lên trang này trước trang có liên kết tải về.
// Nếu không làm như vậy, người dùng có thể không thể tải về khi cố gắng, vì trang này đặt và tham chiếu các tệp cần tải về.
//
// Cấu hình và Ghi Chú:
// ① Mật khẩu được đặt là "admin," nhưng hãy thay đổi thành bất kỳ chuỗi mong muốn.
// ② Thư mục "log" để lưu trữ các tệp nhật ký được tạo tự động khi tải lên lần đầu tiên.
// Tuy nhiên, nếu bạn gặp thông báo như "thư mục không tìm thấy," hãy tải lên nó một cách riêng biệt.
// ③ Khi tải lên lần đầu tiên, màn hình hiển thị lịch sử sẽ hiển thị "ngày" và số "0."
// Điều này là do các tệp nhật ký như "count_1.log" với ngày tải lên được tạo đồng thời trong thư mục "log" được tạo tự động.
// Nếu điều này là một vấn đề, truy cập máy chủ từ xa, tải về các tệp như "count_1.log," xóa dữ liệu, sau đó tải lên.
// ④ Khi hiển thị nhiều bảng trên một trang trong màn hình lịch sử, bạn có thể chọn giữ nguyên mảng được đặt trong [$targetFiles = array] hoặc hiển thị chúng theo thứ tự thời gian.
// ⑤ Trong màn hình lịch sử, bạn có thể chọn có bao gồm tên miền trong 1) hiển thị tệp hoặc 2) chỉ hiển thị tên tệp.
//
// [Định dạng Liên kết Trên Trang có Liên Kết Tải Về]
// [Ví dụ] <a href="/download_history/count.php?download=Số Đăng Ký" download="TênTệpDaTải.zip" target="_blank">[Bất kỳ Chuỗi]</a>
// ① Điều chỉnh số trong "download=1" thành số được đặt trong "$targetFiles = array()".
// ② Điều chỉnh đường dẫn để phù hợp với trang của bạn.
//
// [Mã (JavaScript) để hiển thị lịch sử trên một dòng trên trang nơi có liên kết tải về]
// [Ví dụ] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Điều chỉnh số trong "dsp_count=1" thành số được đặt trong "$targetFiles = array()".
// ② Nếu bạn loại bỏ "&day_dsp=on," nó sẽ chỉ hiển thị "tổng" mà không có "hôm nay" và "hôm qua".
// ③ Điều chỉnh đường dẫn để phù hợp với trang của bạn.
//***************************************************************************************************

// Cấu hình các tệp cần tải về. Nếu có nhiều tệp, thêm chúng như '2', '3', '4', v.v. Đồng thời, '0' cũng là hợp lệ.
// Sử dụng "http:" hoặc "https:" cho giao thức.
$targetFiles = array(
    '1' => 'YourURL/FileName.zip',
    '2' => 'YourURL/FileName.pdf',
    '3' => 'YourURL/FileName.pdf',
    '4' => 'YourURL/FileName.pdf',
);

// Đặt mã ký tự cho đầu ra HTML
header("Content-Type: text/html; charset=utf-8");

// Mã ký tự trên trang hiển thị lịch sử tải về
$encodingType = 'UTF-8';

// Xác định thông tin xác thực người dùng và cấu hình khác
$userid = 'admin';   // ID người dùng (thay thế 'admin' bằng bất kỳ chuỗi nào)
$password = 'admin'; // Mật khẩu (thay thế 'admin' bằng bất kỳ chuỗi nào)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Sử dụng password_hash() để tạo giá trị băm
$dataLogDir = 'log/'; // Thư mục 'log' được tạo tự động bởi chương trình này. Nếu chưa tạo, hãy tải lên một thư mục có tên 'log' một cách riêng biệt

// Chọn có bao gồm tên miền khi hiển thị tên tệp hay không
$includeDomain = 1;  // 1: Hiển thị bao gồm tên miền, 0: Chỉ hiển thị tên tệp

// Chọn có thay thế mảng gốc bằng một mảng mới được sắp xếp theo thứ tự của các nhật ký mới khi hiển thị nhiều bảng trên một trang
$sortTables = 1;  // 1: Sắp xếp, 0: Không sắp xếp

$dir = 'log'; // Thư mục để lưu trữ tệp nhật ký và lịch sử tải về

// Lấy tên miền của trang web của bạn
$domain = $_SERVER['HTTP_HOST'];

// Quản lý phiên: Ngăn chặn chiếm phiên và sử dụng session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Đặt cờ HttpOnly và Secure
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Băm mật khẩu: Sử dụng password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Lưu giá trị băm mới vào cơ sở dữ liệu, v.v.
}

// Tạo thư mục nếu nó chưa tồn tại
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Hiển thị nếu việc tạo thư mục thất bại
        echo 'Vui lòng tạo thư mục "' . $dataLogDir . '" và tải lên nó một cách riêng biệt.';
    }
}

// Kiểm tra xem thư mục nhật ký có thể ghi được không
if (!is_writable($dataLogDir)) {
    die('Thư mục "' . $dataLogDir . '" không tồn tại hoặc không có quyền ghi. Vui lòng tạo thư mục và đặt quyền một cách đúng (ví dụ, 755).');
}

// Lấy ngày cơ bản và ngày hôm qua
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Hàm để lấy ngày của tuần từ một ngày
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy');
    return $weekDays[$dayOfWeek];
}

// Đặt đường dẫn tệp cho mỗi tệp mục tiêu và tạo tệp nhật ký nếu nó chưa tồn tại
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Tạo tệp nhật ký nếu nó chưa tồn tại
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Lấy đường dẫn tệp và ngày cập nhật cuối cùng của chúng (được sắp xếp giảm dần theo ngày)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Xuất lỗi này vào nhật ký và quyết định liệu có tiếp tục hay hủy bỏ quá trình xử lý
        echo "Lỗi: Tệp không tồn tại - $path<br>";
    }
}

// Sắp xếp giảm dần theo ngày cập nhật cuối cùng (ngày mới nhất đứng đầu)
arsort($filePathsAndDates);

// Xây dựng lại mảng các đường dẫn tệp đã được sắp xếp
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Chọn có sử dụng các đường dẫn đã được sắp xếp để sắp xếp hay không dựa trên điều kiện
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Trả về mã JavaScript cho máy khách (hiển thị động số lần tải về)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Đặt tiêu đề là một tệp JavaScript
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"Tham số phải là số bán rộng\")";
        exit();
    }

    $dspCountNo = $_GET['dsp_count'];
    if (!file_exists($filePath[$dspCountNo])) {
        createLogFile($filePath[$dspCountNo]);
    }

    $line = file($filePath[$dspCountNo]);
    $total = 0;
    $todayCount = 0;
    $yesterdayCount = 0;

    foreach ($line as $val) {
        $valArray = explode(',', $val);
        $total += trim($valArray[1]);
        if (strpos($valArray[0], $baseDay) !== false) {
            $todayCount = trim($valArray[1]);
        }
        if (strpos($valArray[0], $yesterday) !== false) {
            $yesterdayCount = trim($valArray[1]);
        }
    }

    // Nếu tùy chọn hiển thị ngày BẬT, hiển thị bao gồm cả ngày
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Tổng Lượt Tải Xuống: <strong>{$total}</strong>[<span class="count_today">Hôm nay : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Hôm qua : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Nếu tùy chọn hiển thị ngày TẮT, chỉ hiển thị tổng số lượt tải về
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Tổng Lượt Tải Xuống: {$total}</p>')
EOF;
    }

    // Nếu mã hóa ký tự không phải là UTF-8, chuyển đổi
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Xử lý khi có yêu cầu tải về tệp
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Thoát nếu ID tệp không phải là một số hoặc nếu ID tệp không tồn tại
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Tham số số không đúng');
    }

    // Mở tệp và khóa nó
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Không thể mở tệp');
    }

    flock($fp, LOCK_EX);

    // Đọc tệp nhật ký và lưu vào một mảng
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Cắt giảm tệp và thêm một dòng ngày mới ở đầu
    ftruncate($fp, 0);
    rewind($fp);

    // Thêm một dòng ngày mới ở đầu nếu nó chưa tồn tại
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Xử lý từng dòng trong tệp
    foreach ($line as $val) {
        // Tăng số lượng tải về cho ngày hiện tại
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Xả bộ đệm và giải phóng khóa
    fflush($fp);
    flock($fp, LOCK_UN);

    // Đóng tệp
    fclose($fp);

    // Xóa bộ đệm đầu ra
    ob_end_clean();

    // Thực hiện tải về tệp
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Bắt đầu phiên, hủy bỏ phiên nếu có yêu cầu đăng xuất
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

    if (!isset($_SESSION['auth'])) {
        $_SESSION['auth'] = FALSE;
    }
    
    // Sử dụng hàm băm mật khẩu để tạo giá trị băm
    // Xử lý đăng nhập
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // So sánh giá trị băm để xác thực
        if ($_POST['userid'] === $userid && password_verify($_POST['password'], $hashedPassword)) {
            $oldSid = session_id();
            session_regenerate_id(TRUE);

            if (version_compare(PHP_VERSION, '5.1.0', '<')) {
                $path = session_save_path() != '' ? session_save_path() : '/tmp';
                $oldSessionFile = $path . '/sess_' . $oldSid;

                if (file_exists($oldSessionFile)) {
                    unlink($oldSessionFile);
                }
            }

            $_SESSION['auth'] = TRUE;
        } else {
            // Xử lý khi xác thực thất bại
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">Sai tên người dùng hoặc mật khẩu.</div>';
        }
    }

    // Nếu xác thực không thành công, hiển thị màn hình đăng nhập
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="vi">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>Màn hình đăng nhập Lịch sử tải về</title>
            <!-- Kiểu màn hình đăng nhập (có thể điều chỉnh theo cần thiết)-->
            <style>
                body {
                    font-family: Arial, sans-serif;
                    background-color: #f4f4f4;
                    margin: 0px;
                    padding: 0px;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    height: 100vh;
                }
                form {
                    background-color: #fff;
                    padding: 20px;
                    border-radius: 8px;
                    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
                }
                label {
                    display: block;
                    margin-bottom: 8px;
                }
                input {
                    font-size: 18px; 
                    width: 100%;
                    padding: 8px;
                    margin-bottom: 16px;
                    box-sizing: border-box;
                }
                button {
                    font-size: 16px;
                    background-color: #4caf50;
                    color: #fff;
                    padding: 10px;
                    border: none;
                    border-radius: 4px;
                    cursor: pointer;
                }
                .logintitle {
                    text-align: center;
                    font-size: 18px;
                    font-weight: bold;
                }
                .logininfo {
                    text-align: center;
                }
                .passwordshow {
                    font-size: 14px;
                    font-weight: bold;
                    color: darkgray;
                    text-align: center;
                }
                .center-container {
                    display: inline-block;
                    margin: 0 5px 0 0;
                }
            </style>
        </head>
        <body>
            <div id="login_form">
                <form action="<?php echo $fileName; ?>?mode=download" method="post">
                    <p class="logintitle">【Xem Lịch sử Tải về】</p>
                    <?php if (isset($loginError)): ?>
                        <!-- Hiển thị thông báo lỗi nếu biến $loginError được đặt -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">ID Người dùng:</label>
                    <input type="text" id="userid" name="userid" required>
                    <label for="password">Mật khẩu:</label>
                    <input type="password" id="password" name="password" required>
                    <?php
                        // Giả sử $showPassword là biến PHP xác định xem mật khẩu có hiển thị ban đầu không
                        echo '<label class="passwordshow" for="showPassword">[Hiển thị Mật khẩu]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                    ?>
                    <button type="submit" name="login_submit">Đăng nhập</button>
                </form>   
            </div>

<!-- Kiểm soát sự hiển thị của mật khẩu -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // Nếu được chọn, mật khẩu sẽ được hiển thị
      passwordInput.type = 'text';
    } else {
      // Bỏ chọn để ẩn mật khẩu
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // Nếu đã đăng nhập, hiển thị trang lịch sử tải về
  ?>
  <!DOCTYPE html>
  <html lang="vi">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Lịch sử Tải về</title>
    <!-- Kiểu xem lịch sử tải về (có thể điều chỉnh theo cần thiết) -->
    <style>
                 body {
                     font-family: 'Hiragino Kaku Gothic ProN', 'Hiragino Kaku Gothic ProN W3', Meiryo, Osaka, 'MS PGothic', arial, helvetica, sans-serif;
                 }
                 .log_title {
                     font-size: 16px;
                     font-weight: bold;
                     color: brown;
                     margin: 0px 0px 15px 10px;
                 }
                 .get_url {
                     font-size: 13px;
                     font-weight: bold;
                     padding: 8px 0;
                     color: brown;
                     background-color: lightgoldenrodyellow;
                 }
                 .log_table{
                     float:left;
                     width: 300px;
                     border: #CCC 1px solid;
                     border-radius: 5px;
                     margin: 0px 0px 5px 10px;
                     padding: 0px 5px 5px 5px;
                     word-break: break-all;
                 }
                 table {
                     width: 100%;
                     border-collapse: collapse;
                 }
                 td,
                 th {
                     padding: 5px 10px;
                     border: 1px solid #999;
                     text-align: right;
                     font-size: 90%;
                 }
                 th {
                     background: lavenderblush;
                     text-align: center;
                     font-weight: normal;
                 }
                 .tableheader {
                     background: lavender;
                     text-align: center;
                     font-weight: bold;
                     white-space: nowrap;
                 }
                 .total{
                     float:left;
                     margin: -25px 0px 0px 10px;
                 }
                 .counter_inpage{
                     margin: 15px 0px 8px 0px;
                 }
                 .bold{
                     font-weight: bold;
                 }
             </style>
  </head>
  <body>
    <div class="log_title">【Lịch sử Tải về】 【<a href="?logout=true">Đăng xuất</a>】</div> 
    <?php foreach($filePath as $key => $val){ ?>                      
      <div class="log_table">         
        <div class="get_url"><?php echo $includeDomain ? $targetFiles[$key] : basename($targetFiles[$key]); ?></div>
        <table align="center">
          <tr>
            <th class="tableheader">Ngày</th>
            <th class="tableheader">Tải về</th>
          </tr>
          <?php	  
            $totalDownload = 0;

            // Chỉ đọc nếu tệp tồn tại
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Kiểm tra xem $lineArray[1] có giá trị số không
                $numericValue = filter_var($lineArray[1], FILTER_VALIDATE_FLOAT);
                if ($numericValue !== false) {
                  $totalDownload += $numericValue;
                  ?>
                  <tr>
                    <th nowrap><?php echo $lineArray[0] . ' (' . getDayOfWeek($lineArray[0]) . ')'; ?></th>
                    <td class="bold" nowrap><?php echo $lineArray[1]; ?></td>
                  </tr>
                  <?php
                }
              }
            }
          ?>
          <tr>
            <th colspan="2" class="bold">Tổng số lượt tải về: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// Hàm để làm sạch tất cả các phần tử trong một mảng
function sanitize($arr)
{
  // Nếu đó là một mảng, áp dụng vệ sinh đệ quy
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // Loại bỏ các ký tự NULL từ trong chuỗi
  return str_replace("\0", "", $arr);
}

// Tạo một tệp nhật ký mới nếu nó không tồn tại
function createLogFile($filePath)
{
  $baseDay = date("Y/m/d");
  $fp = fopen($filePath, "a+b");

  if ($fp) {
    flock($fp, LOCK_EX);
    ftruncate($fp, 0);
    rewind($fp);
    fwrite($fp, "$baseDay,0");
    fflush($fp);
    flock($fp, LOCK_UN);
    fclose($fp);

    // Đặt quyền tệp
    chmod($filePath, 0666);
  } else {
  }
}
Lưu tệp với phần mở rộng ".php".
Đây là kết luận của sự giới thiệu về mã PHP cho "Chương trình Đếm Xuống/Chương trình Xem Lịch Sử Tải Xuống." Chúng tôi hy vọng bạn sẽ thấy nó hữu ích.

Có thể có lỗi trong từ ngữ vì nó là bản dịch từ phiên bản tiếng Nhật. Chúng tôi xin lỗi vì sự bất tiện này, nhưng nếu có lỗi trong từ ngữ trong mã, hãy tự chỉnh sửa hoặc điều chỉnh.

Ý kiến của bạn khi sử dụng mã này được đánh giá cao. Vui lòng lưu ý rằng tôi không thể trả lời câu hỏi.

おすすめサイト・関連サイト…

Last updated : 2024/06/29