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';
* 如果需要,程序中的“font-family”请根据您的网站进行设置。
《 创* 如果需要,程序中的“font-family”请根据您的网站进行设置。* 如果需要,程序中的“font-family”请根据您的网站进行设置。* 如果需要,程序中的“font-family”请根据您的网站进行设置。
保存文件时的扩展名应为“.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-Hans">
        <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-Hans">
        <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/06/29