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]
[Пример открыт в браузере]

Примечание: если страница с ссылкой для скачивания отображает сообщение о сохранении файла и закрывается без инициирования скачивания, это все равно будет засчитано как загрузка. Это происходит потому, что программа учитывает количество кликов по ссылке.

Инструкции по скачиванию:

С этой страницы загрузите сжатый файл программы и установите его на своем сайте. Файл называется "count.php", но вы можете изменить его.

Вы вольны использовать и изменять код, включая изменение дизайна страницы.

Пожалуйста, измените код, добавьте новые функции или измените дизайн, чтобы создать страницу, которую легко понимать и использовать.

 Скачать программу PHP:
Инструкции по установке:

Распакуйте скачанный файл "count.php.zip", и будет создан файл с именем "count.php". Пожалуйста, создайте каталог, например, "download_history" и сохраните его там.

ZIP-файл содержит только один файл, "count.php", и "экран входа" для администратора создается автоматически.

Настройки пароля:

Это основной метод настройки. Эти основные части также перечислены в файле PHP.

  1. Настройки пароля:
    1. Для страницы администратора необходимо установить пароль.
    2. Пароль по умолчанию - "admin", но измените его на любую строку на свой выбор.
    3. Для увеличения безопасности установите надежный пароль.
  2. Настройка файлов для загрузки:
    1. Завершите настройки для "$targetFiles = array()"..
    2. Это часть, например, "'1' => 'Your URL/file name.zip',".
  3. Каталог для сохранения файлов журнала:
    1. а удаленном сервере требуется каталог с именем "log" для хранения файлов журнала, записывающих историю.
    2. Эта программа автоматически создает каталог с именем "log" при первой загрузке. Однако, если вы получите сообщение типа "Нет каталога", создайте его и загрузите отдельно.
  4. Отображение истории загрузки при первой загрузке:
    1. При первой загрузке в истории может отображаться "дата" и число "0".
    2. Это потому, что файлы журнала, такие как "count_1.log", содержащие дату загрузки, также генерируются в автоматически созданном каталоге "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="File name when downloading.zip">[Произвольная строка]</a>
    2. В этой программе тег <a> для скачивания записывается следующим образом:
    3. [Пример]Копировать
      <a href="/download_history/count.php?download=1" download="File name when downloading.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 [Today: 23 Yesterday: 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' => 'YourURL/FileName.zip',
        '2' => 'YourURL/FileName.pdf',
        '3' => 'YourURL/FileName.pdf',
        '4' => 'YourURL/FileName.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' => 'YourURL/FileName.zip',
        '2' => 'YourURL/FileName.pdf',
        '3' => 'YourURL/FileName.pdf',
        '4' => 'YourURL/FileName.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Код для чтения внешних файлов и место их размещения
    1. Включите файл, созданный с именем, например, "config.php", в следующем месте с помощью кода "include __DIR__ . '/config.php';".
    2. Закомментируйте или удалите следующий раздел и замените его кодом "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'YourURL/FileName.zip',
    //    '2' => 'YourURL/FileName.pdf',
    //    '3' => 'YourURL/FileName.pdf',
    //    '4' => 'YourURL/FileName.pdf',
    //);
  8. Скопируйте код для замены
    include __DIR__ . '/config.php';
《 PHP-код для создания счетчика загрузок 》
Сохраните файл с расширением ".php".

<?php
//***************************************************************************************************
// Программа на PHP для подсчета загрузок и просмотра истории загрузок
// [Немного полезной информации для каждого]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// Релиз: 29 января 2024 года
//
// Обзор:
// Эта программа представляет собой систему для отслеживания истории загрузок файлов с функциональностью аутентификации пользователей.
// Она включает функции, такие как санитаризация входных данных, создание файла журнала и отображение статистики загрузок.
// Вы можете свободно использовать ее, включая изменение кода и изменение дизайна страницы.
//
// Примечание:
// Перед загрузкой страницы, содержащей ссылки для скачивания, убедитесь, что вы сконфигурировали раздел "$targetFiles = array()" этого файла,
// и загрузите эту страницу перед страницей с ссылками для скачивания.
// Несоблюдение этого требования может привести к невозможности загрузки для пользователей при попытке скачивания, так как эта страница устанавливает и ссылается на файлы для скачивания.
//
// Конфигурация и заметки:
// ① Пароль установлен как "admin", но, пожалуйста, измените его на любую желаемую строку.
// ② Директория "log" для хранения файлов журнала автоматически генерируется при первой загрузке.
// Однако, если вы столкнетесь с сообщениями типа "директория не найдена", загрузите ее отдельно.
// ③ При первой загрузке отображение истории показывает "дата" и число "0".
// Это происходит потому, что файлы журнала вроде "count_1.log" с датой загрузки одновременно генерируются в автоматически созданной директории "log".
// Если это вызывает беспокойство, получите доступ к удаленному серверу, загрузите файлы вроде "count_1.log", удалите данные, а затем загрузите их обратно.
// ④ При отображении нескольких таблиц на странице в истории отображения, вы можете выбрать, сохранять ли массив, установленный в [$targetFiles = array], или отображать их в хронологическом порядке.
// ⑤ В истории отображения вы можете выбрать, включать ли домен в 1) отображении файла или 2) показе только имени файла.
//
// [Формат ссылки на странице с ссылками для скачивания]
// [Пример] <a href="/download_history/count.php?download=Registered Number" download="DownloadedFileName.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," то будет отображаться только "total" без "today" и "yesterday".
// ③ Измените путь так, чтобы он соответствовал вашей странице.
//***************************************************************************************************

// Конфигурация файлов для загрузки. Если есть несколько файлов, добавьте их как '2', '3', '4' и так далее. Также '0' допустим.
// Используйте "http:" или "https:" для протокола.
$targetFiles = array(
    '1' => 'YourURL/FileName.zip',
    '2' => 'YourURL/FileName.pdf',
    '3' => 'YourURL/FileName.pdf',
    '4' => 'YourURL/FileName.pdf',
);

// Установка кодировки символов для HTML-вывода
header("Content-Type: text/html; charset=utf-8");

// Кодировка символов на странице отображения истории загрузок
$encodingType = 'UTF-8';

// Определение информации об аутентификации пользователя и других параметров
$userid = 'admin';   // Идентификатор пользователя (замените 'admin' на любую строку)
$password = 'admin'; // Пароль (замените 'admin' на любую строку)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Используйте password_hash() для генерации хеш-значения
$dataLogDir = 'log/'; // Директория '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'];

    // Выход, если идентификатор файла не является числом или если идентификатор файла не существует
    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;">Неверный идентификатор пользователя или пароль.</div>';
        }
    }

  // Если аутентификация не удалась, отобразить экран входа
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <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)): ?>
                        <!-- Отображение сообщения об ошибке, если установлена переменная $loginError -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">Идентификатор пользователя:</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="en">
  <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: 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">【История загрузок】 【<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-код для "Счетчика загрузок/Программы просмотра истории загрузок". Надеемся, что вам это будет полезно.

Возможны ошибки в формулировках, так как это перевод с японской версии. Приносим извинения за неудобства, но если в коде есть ошибки в формулировках, пожалуйста, исправьте или откорректируйте их сами.

Мы благодарны за ваш отзыв об использовании этого кода. Обратите внимание, что я не могу отвечать на вопросы.

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

Last updated : 2024/04/23