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 [ルーマニア語]  

下載計數器
下載歷史查看程式
= 下載並安裝 PHP 代碼 =
Sample Download Counter

一開始

這是一個程式的介紹,可以讓你知道網頁使用者下載並使用某個程式時的下載次數。 可以在頁面上設定下載計數器,網站管理員也可以輕鬆地在瀏覽器上查看下載記錄。

[頁面上安裝的示例]
下載總數:1865[今天:23 昨天:76
[在瀏覽器中打開的示例]
*在帶有下載鏈接的頁面上,即使在提示用戶保存文件的信息發出後,頁面在未執行下載的情況下被關閉,仍會被算作下載。這是因為點擊鏈接的次數會被計算在內。
下載

從此頁面下載該程式的壓縮“zip”文件並將其安裝到您的站點上。

您可以自由使用它,包括修改代碼和更改頁面設計。

嘗試重寫代碼、添加新功能或更改頁面設計,使其更易於理解和使用。

  PHP程式下載
關於安裝

當您解壓下載的“count.php.zip”文件時,將創建一個名稱為“count.php”的文件。請在您的網站上創建一個目錄,例如“download_history”並保存。

“zip”文件僅包含一個名稱為“count.php”的文件,並且自動生成管理員的“登入屏幕”。

關於設置

這是主要的設置方法。這些主要部分也列在 PHP 文件中。

  1. 關於密碼設置
    1. 必須為管理員頁面設置密碼
    2. 默認密碼是“admin”,但請將其更改為您選擇的任何字符串。
    3. 為了防止外部人員訪問需要密碼的頁面,請設定尽可能強的密碼。
  2. 設置要下載的文件
    1. 完成"$targetFiles = array()"的設置。
    2. 這是諸如“'1' => '您的 URL/文件名.zip',”之類的部分。
  3. 日誌文件保存目錄
    1. 需要在遠程伺服器上創建一個名稱為“log”的目錄以存儲記錄歷史的日誌文件
    2. 當您第一次上傳時,該程式會自動創建一個名稱為“log”的目錄。但是,如果您收到諸如“無目錄”之類的消息,請單獨創建並上傳。
  4. 關於第一次上傳時的歷史記錄顯示
    1. 當您第一次上傳時,歷史顯示中可能會顯示“日期”和數字“0”。
    2. 這是因為在自動生成的“log”目錄中也會生成包含上傳日期的“count_1.log”等日誌文件。
    3. 如果這讓您煩惱,請轉到遠程伺服器並下載“count_1.log”等文件,刪除數據並上傳。
    4. 然而,包含“日期”和“0”的狀態也是計數器啟動時的歷史記錄。 該日期的任何下載都將被計算在內。
  5. 關於管理員查看頁面的顯示
    1. 顯示管理員查看的頁面時,您可以選擇是顯示 URL 還是僅顯示文件名。
    2. 如果您在一頁上設置了多個歷史表,您可以選擇保持"$targetFiles = array()"(設置的順序) 或按新日誌發生的日期排序。
  6. 頁面設計、CSS等
    1. 請酌情調整頁面設計、CSS等,使頁面易於閱讀。
    2. 曾經,CSS 被編寫為外部文件,但現在它被編寫在同一頁面上,以便您在更改 CSS 時可以引用標籤。
  7. 如何在頁面上設置下載鏈接
    1.  通常、下載的 <a> 標籤是這樣寫的。
      <a href="/download_history/sample.zip" download="下載時的檔案名.zip">[任意字符串]</a>
    2. 在此程序中,按如下方式編寫下載 <a> 標記。
    3. [示例]複製
      <a href="/download_history/count.php?download=1" download="下載時的檔案名.zip" target="_blank">[任意字符串]</a>
    4. 將“download=1”中的數字與"$targetFiles = array()"中設置的數字相匹配。此設置指的是要下載的文件。
    5. 請將路徑與您的頁面相匹配。
    6. 帶下載鏈接的頁面必須在"$targetFiles = array()"(本例中為 "count.php")文件上傳後上傳。
  8. 用於在帶有下載鏈接等的頁面上一行顯示歷史記錄的代碼
    1. 創建以下 JavaScript 並將其放置在要顯示的頁面上。
    2. [示例]複製
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. “dsp_count=1”中的數字必須與"$targetFiles = array()"中設置的數字匹配。
    4. 如果刪除“&day_dsp=on”,則只顯示“總數”,不顯示“今天/昨天”。
    5. 下載總數:1865[今天:23 昨天:76
      下載總數:1865
    6. 請將路徑與您的頁面相匹配。
有關擴展設置

當顯示多個表格時,該程序的默認設置是按最新更新時間排序。如果想按總下載次數排序,創建一個新文件,如 "total_downloads.php",並替換以下部分。

  1. 更改註
    替換以下部分的註釋:
    // 當頁面上顯示多個表格時,選擇/設置是否替換原始數組並按新日誌的順序排序
  2. 復制替換註釋
    // 如果在頁面上顯示多個表格,請選擇是否要取代原始陣列並依照下載總數較多的順序排序。
  3. 代碼和註釋更改
    替換以下部分的代碼和註釋。請將其視為一個代碼塊。
    // 獲取文件路徑及其上次修改日期(按最新日期降序排列)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
         if (file_exists($path)) {
             $filePathsAndDates[$key] = filemtime($path);
         } else {
             // 將此錯誤輸出到日誌,並決定是否繼續或中止進程
             echo "錯誤:文件不存在 - $path<br>";
         }
    }
    
    // 按最後更新日期降序排序(最新日期在前)
    arsort($filePathsAndDates);
    
    // 重建按文件路徑排序的數組
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
         $sortedFilePaths[$key] = $filePath[$key];
    }
  4. 複製替換代碼和註釋
    // 儲存下載總數的數組
    $totalDownloads = array();
    
    // 取得檔案路徑及其下載總數
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // 對每行的下載次數求和
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
            // 將下載總數儲存在陣列中
            $totalDownloads[$key] = $total;
        } else {
            // 將此錯誤輸出到日誌並決定是繼續還是中止進程
            echo "錯誤:文件不存在 - $path<br>";
        }
    }
    
    // 重建檔案路徑排序數組
    arsort($totalDownloads);
    
    // 重建檔案路徑排序數組
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. 檔案建立和設置
    1. 在建立多個頁面時,為了防止在添加內容的同時統一設定項目時出現錯誤,請將以下代碼部分創建為外部文件,並用不同的代碼加載到當前已實施的部分。請使用像 "config.php" 這樣的名稱創建外部文件。
    // 設置文件下載的相關設定。如果有多個,請添加'2'、'3'、'4'等。"'0'"也是有效的
    // 從 "http:" 或 "https:" 寫入
    $targetFiles = array(
         '1' => '您的URL/檔案名稱.zip',
         '2' => '您的URL/檔案名稱.pdf',
         '3' => '您的URL/檔案名稱.pdf',
         '4' => '您的URL/檔案名稱.pdf',
    );
  6. 複製名稱為 "config.php" 的部分的示例
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // 使這部分成為外部檔案並使用``include __DIR__ .'/config.php';''將其載入到頁面中。
    // 設置文件下載的相關設定。如果有多個,請添加'2'、'3'、'4'等。"'0'"也是有效的
    // 從 "http:" 或 "https:" 寫入
    $targetFiles = array(
         '1' => '您的URL/檔案名稱.zip',
         '2' => '您的URL/檔案名稱.pdf',
         '3' => '您的URL/檔案名稱.pdf',
         '4' => '您的URL/檔案名稱.pdf',
    );
    ?>
    </body>
    </html>
    
  7. 載入外部文件及其位置的程式碼
    1. 使用程式碼 "include __DIR__ . '/config.php';" 在下列位置載入以 "config.php" 等名稱建立的檔案。
    2. 請註解或刪除以下部分,並用程式碼 "include __DIR__ . '/config.php';" 取代它。
    //$targetFiles = array(
    //     '1' => '您的URL/檔案名稱.zip',
    //     '2' => '您的URL/檔案名稱.pdf',
    //     '3' => '您的URL/檔案名稱.pdf',
    //     '4' => '您的URL/檔案名稱.pdf',
    //);
  8. 複製替換的程式碼
    include __DIR__ . '/config.php';
《 建立下載計數器的 PHP 程式碼 》
儲存檔案時的副檔名應為“.php”。

<?php
//***************************************************************************************************
// 下載計數器/下載歷史查看 PHP 程式
// “眾人知識小便利書”
// “みんなの知識 ちょっと便利帳”
// https://www.benricho.org/Tips/download_history/
// 發布日期:2024年1月22日
//
// 概述(overview):
// 該程式是用於追蹤文件下載歷史的系統,還包括使用者身份驗證功能。
// 內建功能包括清理輸入數據、建立日誌文件和查看下載統計信息。
// 您可以自由使用它,包括修改代碼和更改頁面設計。
//
// 請注意 (Please note):
// 在上傳帶有下載鏈接的頁面之前,請設置此文件中的 "$targetFiles = array()" 部分,
// 請在帶有下載鏈接的頁面之前上傳此頁面。
// 否則,用戶在嘗試下載時可能無法下載。
// 這是因為要下載的文件是在此頁面上設置和引用的。
//
// 設置等 (Settings etc):
// ① 密碼為 "admin",但請更改為您選擇的任何字符串。
// ② 在首次上傳時,將自動生成用於存儲日誌文件的名為 "log" 的目錄。
// 但是,如果收到諸如 "無目錄" 的消息,請分開上傳。
// ③ 在首次上傳時,將在歷史顯示中顯示 "日期" 和數字 "0"。
// 這是因為在自動生成的 "log" 目錄中同時生成了包含上傳日期的日誌文件,例如 "count_1.log"。
// 如果您擔心此事,請訪問遠程伺服器,下載諸如 "count_1.log" 的文件,刪除數據,然後上傳。
// ④ 在歷史顯示的頁面上顯示多個表格時,您可以通過設置 [$targetFiles = array] 來選擇是 ① 保持設置的數組 還是 ② 按時間順序顯示它們。
// ⑤ 在歷史顯示中,您可以選擇是 1) 在文件的顯示中包括域,還是 2) 僅顯示文件名。
//
// [如何在設置了下載鏈接的頁面上編寫鏈接]
// [示例] <a href="/download_history/count.php?download=1" download="下載時的文件名.zip" target="_blank">[任意字符串]</a>
// ① 將 "download=1" 的數量與 "$targetFiles = array(" 中設置的數字匹配。
// ② 請匹配路徑到您自己的頁面。
//
// [在設置了下載鏈接的頁面上以一行顯示歷史的代碼(JavaScript)]
// [示例] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① 將 "dsp_count=1" 的數量與 "$targetFiles = array()" 中設置的數字匹配。
// ② 如果刪除 "&day_dsp=on",則只會顯示 "總下載計數",而不顯示 "今天" 和 "昨天" 的計數。
// ③ 請匹配路徑到您自己的頁面。
//***************************************************************************************************

// 設置文件下載的相關設定。如果有多個,請添加'2'、'3'、'4'等。"'0'"也是有效的
// 從 "http:" 或 "https:" 寫入
$targetFiles = array(
     '1' => '您的URL/檔案名稱.zip',
     '2' => '您的URL/檔案名稱.pdf',
     '3' => '您的URL/檔案名稱.pdf',
     '4' => '您的URL/檔案名稱.pdf',
);

// 設定HTML輸出的字符編碼
header("Content-Type: text/html; charset=utf-8");

// 顯示計數歷史頁面的字符編碼
$encodingType = 'UTF-8';

// 定義用戶憑據和其他設置
$userid = 'admin'; // 使用者ID(管理部分)使用任意字符串
$password = 'admin'; // 更改密碼(管理部分)為任意字符串
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // 使用密碼雜湊函數生成雜湊值
$dataLogDir = 'log/'; // 該程序會自動在此處生成日誌目錄。如果未生成,請上傳一個名為"log"的單獨目錄

// 選擇/設置在顯示文件名時是否包括域
$includeDomain = 1; // 1:顯示包括域名,0:僅顯示文件名

// 當頁面上顯示多個表格時,選擇/設置是否替換原始數組並按新日誌的順序排序
$sortTables = 1; // 1:排序,0:不排序

$dir = 'log'; // 存儲日誌文件和下載歷史的目錄

// 獲取您網站的域名
$domain = $_SERVER['HTTP_HOST'];

// 會話管理:防劫持會話和使用session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // 設置HttpOnly和Secure標誌
session_start();
if (!isset($_SESSION['auth'])) {
     $_SESSION['auth'] = FALSE;
}

// 密碼雜湊:使用password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
     $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
     // 將新的雜湊值保存到數據庫等
}

// 如果目錄不存在,創建該目錄
if (!is_dir($dir)) {
     if (mkdir($dir, 0755, true)) {
     } else {
         // 如果創建目錄失敗,顯示錯誤
         echo '“' . $dataLogDir . ' ” 請建立目錄並單獨上傳。';
     }
}

// 檢查日誌目錄是否可寫
if (!is_writable($dataLogDir)) {
     die('目錄"' . $dataLogDir . '"不存在或沒有寫權限。請創建目錄並適當設置權限(例如,755)。');
}

// 獲取基本日期和昨天的日期
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// 從日期獲取星期幾的函數
function getDayOfWeek($date)
{
     $dayOfWeek = date('w', strtotime($date));
     $weekDays = array('日', '一', '二', '三', '四', '五', '六');
     return $weekDays[$dayOfWeek];
}

// 為每個目標文件設置文件路徑並在不存在時創建日誌文件
foreach ($targetFiles as $key => $val) {
     $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

     // 如果不存在,創建日誌文件
     if (!file_exists($filePath[$key])) {
         createLogFile($filePath[$key]);
     }
}

// 獲取文件路徑及其上次修改日期(按最新日期降序排列)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
     if (file_exists($path)) {
         $filePathsAndDates[$key] = filemtime($path);
     } else {
         // 將此錯誤輸出到日誌,並決定是否繼續或中止進程
         echo "錯誤:文件不存在 - $path<br>";
     }
}

// 按最後更新日期降序排序(最新日期在前)
arsort($filePathsAndDates);

// 重建按文件路徑排序的數組
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
     $sortedFilePaths[$key] = $filePath[$key];
}

// 根據需要是否排序的條件分支
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// 返回JavaScript代碼給客戶端(動態顯示下載次數)
if (isset($_GET['dsp_count'])) {
     header("Content-type: application/x-javascript");

     // 將標頭設置為JavaScript文件
     if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
         echo "document.write(\"參數應為半角數字\")";
         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]);
         }
     }

     // 如果啟用日期顯示選項,則顯示日期
     if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
         $countDsp = <<<EOF
document.write('<div class="counter_inpage">下載總數:<strong>{$total}</strong>[<span class="count_today">今天 : <strong>{$todayCount }</strong></span>  <span class="count_yesterday">昨天 : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
     } else {
         // 如果日期顯示選項關閉,只顯示總下載次數
         $countDsp = <<<EOF
document.write('<p class="counter_inpage">下載總數: {$total}</p>')
EOF;
     }

     // 如果字符編碼不是UTF-8,進行轉換
     if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
     echo $countDsp;

     exit();
}

// 處理文件下載請求
if (isset($_GET['download'])) {
     $fileId = $_GET['download'];

     // 如果文件ID不是數字或文件ID不存在,則終止
     if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
         exit('參數值不正確');
     }

    // 開啟文件並鎖定
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('無法開啟文件');
    }

    flock($fp, LOCK_EX);

    // 讀取日誌文件並存儲在數組中
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // 截斷文件並在開頭添加新的日期行
    ftruncate($fp, 0);
    rewind($fp);

    // 如果開頭沒有新的日期行,則添加
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // 處理文件中的每一行
    foreach ($line as $val) {
        // 增加當前日期的下載計數
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // 刷新緩衝區並釋放鎖定
    fflush($fp);
    flock($fp, LOCK_UN);

    // 關閉文件
    fclose($fp);

    // 清除輸出緩衝區
    ob_end_clean();

    // 執行文件下載
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
     // 啟動會話,如果請求登出,則銷毀會話
     session_start();
     if (isset($_GET['logout'])) {
         $_SESSION = array();
         session_destroy();
     }

     $loginError = '';

     if (!isset($_SESSION['auth'])) {
         $_SESSION['auth'] = FALSE;
     }

     // 使用密碼雜湊函數生成雜湊值
     // 登入時的處理
     if (isset($_POST['userid']) && isset($_POST['password'])) {
         // 通過比較雜湊值進行身份驗證
         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 {
             // 身份驗證失敗時的處理
             $_SESSION['auth'] = FALSE;
             $loginError = '<div style="text-align: center; color: crimson;">用戶ID或密碼不正確。</div>';
         }
     }

     // 如果身分驗證不成功,顯示登入畫面
     if ($_SESSION['auth'] !== TRUE) {
         ?>
        <!DOCTYPE html>
        <html lang="zh-cmn-Hant">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>下載歷史登入畫面</title>
             <!-- 登入畫面樣式(根據需要更改) -->
             <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">[查看下載歷史]</p>
                     <?php if (isset($loginError)): ?>
                         <!-- Display an error message if the $loginError variable is set -->                     
                         <p style="color: crimson;"><?php echo $loginError; ?></p>
                     <?php endif; ?>
                     <label for="userid">用戶ID:</label>
                     <input type="text" id="userid" name="userid" required>
                     <label for="password">密碼:</label>
                     <input type="password" id="password" name="password" required>
                     <?php
                         // 假設$showPassword是一個PHP變數,決定是否顯示密碼
                         echo '<label class="passwordshow" for="showPassword">[顯示密碼]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                     ?>
                     <button type="submit" name="login_submit">登入</button>
                 </form>
             </div>
                 <!-- 控制密碼顯示/隱藏的腳本 -->
                   <script>
                     function togglePasswordVisibility() {
                       var passwordInput = document.getElementById('password');
                       var showPasswordCheckbox = document.getElementById('showPassword');

                       if (showPasswordCheckbox.checked) {
                         // 如果選中,顯示密碼
                         passwordInput.type = 'text';
                       } else {
                         // 如果取消選中,隱藏密碼
                         passwordInput.type = 'password';
                       }
                     }
                   </script>
         </body>
         </html><?php
         exit();
     } else {
         // 如果已登入,顯示下載歷史頁面
         ?>
        <!DOCTYPE html>
        <html lang="zh-cmn-Hant">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>下載歷史</title>
             <!-- 下載歷史查看區域樣式(根據需要更改) -->
             <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: 270px;
                     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">[下載歷史] [<a href="?logout=true">登出</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">日期</th>
                             <th class="tableheader">下載次數</th>
                         </tr>
                         <?php
     $totalDownload = 0;

     // 只有文件存在時加載
     if (file_exists($val)) {
         $line = file($val);
         foreach ($line as $lineVal) {
             $lineArray = explode(',', $lineVal);

             // 檢查$lineArray[1]的值是否為數字
             $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">下載總數:<?php echo $totalDownload;?></th>
                         </tr>
                     </table>
                 </div>
             <?php
                }
              }
            }
          ?>
         </body>
         </html><?php
// 用於清理數組中的所有元素的函數
function sanitize($arr)
{
     // 如果是數組,遞歸應用清理
     if (is_array($arr)) {
         return array_map('sanitize', $arr);
     }
     // 從字符串中刪除NULL字符
     return str_replace("\0", "", $arr);
}

// 如果文件不存在,創建新的日誌文件
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);

        // 設定檔案權限
        chmod($filePath, 0666);
    } else {
    }
}
儲存檔案時的副檔名應為“.php”。
“下載計數器/下載歷史查看程式”的PHP代碼介紹到此結束。我們希望您覺得它有用。

由於是日文版本的翻譯,因此措詞可能存在差異。 對於造成您的不便,我們深表歉意,但如果程式碼中的措詞有錯誤,請自行更正或調整。

請向我們提供有關使用此代碼的反饋。 請注意,我們無法回答您的問題。

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

Last updated : 2024/04/23