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

Licznik pobierania
Program przeglądania historii pobierania
= Pobierz i zainstaluj kod PHP =
Przykładowy licznik pobierania

Wstęp:

To wprowadzenie dotyczy programu, który pozwala znać liczbę pobrań, gdy użytkownik strony internetowej pobiera i używa programu. Można ustawić licznik pobierania na stronie, a administratorzy witryny mogą również łatwo sprawdzić historię pobierania w przeglądarce.

[Przykład instalacji strony internetowej]
Liczba pobrań: 1865[Dziś: 23 Wczoraj: 76
[Przykładowe otwarcie w przeglądarce]
Uwaga: Jeśli strona z linkiem do pobrania wyświetla komunikat zachęcający do zapisania pliku i zostaje zamknięta bez zainicjowania pobierania, licznik nadal zaliczy to jako pobranie. Wynika to z tego, że liczy się liczba kliknięć linku.
Instrukcje pobierania:

Z tej strony pobierz skompresowany plik „zip” programu i zainstaluj go na swojej stronie. Plik nazywa się „count.php”, ale możesz go zmienić.

Masz wolność korzystania i modyfikowania kodu, w tym zmiany projektu strony.

Proszę zmodyfikować kod, aby dodać nowe funkcje lub zmienić projekt, tworząc stronę łatwą do zrozumienia i użycia.

 Pobieranie programu PHP:

Instrukcje instalacji:

Rozpakuj pobrany plik „count.php.zip”, a zostanie utworzony plik o nazwie „count.php”. Proszę utwórz katalog, np. „download_history”, i zapisz go tam.

Plik „zip” zawiera tylko jeden plik, „count.php”, a „ekran logowania” dla administratora jest generowany automatycznie.

Ustawienia:

To jest główna metoda ustawiania. Te główne części są również wymienione w pliku PHP.

  1. Ustawienia hasła:
    1. Należy ustawić hasło dla strony administratora.
    2. Domyślne hasło to „admin”, ale zmień je na dowolny ciąg znaków.
    3. Aby zwiększyć bezpieczeństwo, ustaw silne hasło.
  2. Ustawianie plików do pobrania:
    1. Uzupełnij ustawienia dla „$targetFiles = array()”.
    2. Jest to część takiego rodzaju jak „'1' => 'Twoje URL/nazwa pliku.zip'”.
  3. Katalog do zapisywania plików dziennika:
    1. W zdalnym serwerze wymagany jest katalog o nazwie „log”, w którym przechowywane są pliki dziennika rejestrowania historii.
    2. Ten program automatycznie tworzy katalog o nazwie „log” podczas pierwszego przesyłania. Jeśli jednak otrzymasz komunikat typu „Brak katalogu”, proszę utwórz go i prześlij osobno.
  4. 初Wyświetlanie historii pierwszego przesłania:
    1. Podczas pierwszego przesyłania może być wyświetlana „data” i liczba „0” w historii.
    2. Wynika to z tego, że generowane są również pliki dziennika, takie jak „count_1.log”, zawierające datę przesyłania, w automatycznie generowanym katalogu „log”.
    3. Jeśli to cię martwi, pobierz plik tak jak „count_1.log” z serwera zdalnego, usuń dane i prześlij ponownie.
    4. Jednak stan „data” i „0” może również być historią rozpoczęcia licznika. Jeśli tego dnia nastąpi pobranie, zostanie ono zliczone.
  5. Wyświetlanie strony przeglądania administratora:
    1. Kiedy administratorzy przeglądają stronę, możesz wybrać, czy wyświetlić adres URL, czy tylko nazwę pliku.
    2. Jeśli na jednej stronie umieszczono wiele tabel historii, możesz wybrać, czy zachować je w kolejności ustawionej przez „$targetFiles = array()”, czy też posortować je według daty, kiedy pojawiły się nowe dzienniki.
  6. Projekt strony, CSS, itp.:
    1. Proszę dostosować projekt strony, CSS, itp., odpowiednio, aby strona była łatwa do czytania.
    2. Kiedyś CSS był pisany jako plik zewnętrzny, ale teraz jest pisany na tej samej stronie, aby można było się odnieść do tagów podczas zmiany CSS.
  7. Ustawienie linku do pobierania na stronie:
    1.  Zwykle tag <a> do pobrania jest pisany w następujący sposó
      <a href="/download_history/sample.zip" download="Nazwa pliku do pobrania.zip">[Dowolny ciąg]</a>
    2. W tym programie tag <a> do pobrania jest pisany w następujący sposób:
    3. [Przykład]Copy
      <a href="/download_history/count.php?download=1" download="Nazwa pliku do pobrania.zip" target="_blank">[Dowolny ciąg]</a>
    4. Zgodnie z numerem w „download=1” dopasuj numer ustawiony w „$targetFiles = array()”. Ta ustawienie odnosi się do plików do pobrania.
    5. Proszę dopasować ścieżkę do swojej strony.
    6. Proszę przesłać stronę z linkiem do pobrania po przesłaniu pliku za pomocą „$targetFiles = array()” (w tym przykładzie „count.php”).
  8. Kod do wyświetlania historii w jednej linii:
    1. Utwórz następujący kod JavaScript i umieść go na stronie, na której chcesz go wyświetlić:
    2. [Przykład]Copy
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Dopasuj numer w „dsp_count=1” do numeru ustawionego w „$targetFiles = array()”.
    4. Jeśli usuniesz „&day_dsp=on”, zostanie wyświetlona tylko „łączna liczba” bez wyświetlania „dziś/wczoraj”.
    5. Liczba pobrań: 1865[Dziś: 23 Wczoraj: 76
      Liczba pobrań: 1865
    6. Proszę dopasować ścieżkę do swojej strony.
O Ustawieniach Rozszerzeń

Podczas wyświetlania wielu tabel domyślnie program sortuje według najnowszej aktualizacji. Jeśli chcesz posortować według całkowitej liczby pobrań, utwórz nowy plik o nazwie "total_downloads.php" i zamień następującą część.

  1. Zmiana w komentarzach
    Zamień komentarze w następującej sekcji:
    // Wybierz, czy zamienić oryginalną tablicę na nową posortowaną w kolejności nowych dzienników podczas wyświetlania wielu tabel na stronie
  2. Skopiuj komentarz do zamiany
    // Jeśli wyświetlane są wielie tabel na stronie, wybierz, czy zastąpić oryginalną tablicę i posortować według całkowitej liczby pobrań.
  3. Zmiany w kodzie i komentarzach
    Zamień kod i komentarze w następującej sekcji. Proszę traktować to jako jeden blok.
    // Pobierz ścieżki plików i ich ostatnie daty aktualizacji (posortowane malejąco według daty)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Wyświetl ten błąd w dzienniku i zdecyduj, czy kontynuować lub przerwać przetwarzanie
            echo "Błąd: Plik nie istnieje - $path<br>";
        }
    }
    
    // Sortuj malejąco według ostatniej daty aktualizacji (najnowsza data jako pierwsza)
    arsort($filePathsAndDates);
    
    // Przebuduj tablicę posortowanych ścieżek plików
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Skopiuj kod i komentarze do zamiany
    // Tablica przechowująca całkowitą liczbę pobrań
    $totalDownloads = array();
    
    // Pobierz ścieżkę pliku i jego całkowitą liczbę pobrań
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
           // Zsumuj liczbę pobrań dla każdego wiersza
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
            // Przechowuj całkowitą liczbę pobrań w tablicy
            $totalDownloads[$key] = $total;
        } else {
            // Wyświetl ten błąd w dzienniku i zdecyduj, czy kontynuować czy przerwać proces
            echo "Błąd: Plik nie istnieje - $path";
        }
    }
    
    // Posortuj malejąco według całkowitej liczby pobrań
    arsort($totalDownloads);
    
    // Przebuduj posortowaną tablicę ścieżek plików
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Utworzenie pliku i konfiguracja
    1. Podczas tworzenia wielu stron, aby uniknąć błędów w ustawianiu elementów podczas jednolitego dodawania zawartości, utwórz następującą część kodu jako zewnętrzny plik i załaduj go do obecnie wdrażanej części za pomocą innego kodu. Utwórz zewnętrzny plik o nazwie "config.php"
    // Konfiguracja plików do pobrania. Jeśli istnieje wiele plików, dodaj je jako '2', '3', '4', itd. Również '0' jest poprawny.
    // Użyj „http:” lub „https:” dla protokołu.
    $targetFiles = array(
    '1' => 'TwojeURL/NazwaPliku.zip',
    '2' => 'TwojeURL/NazwaPliku.pdf',
    '3' => 'TwojeURL/NazwaPliku.pdf',
    '4' => 'TwojeURL/NazwaPliku.pdf',
    );
  6. Skopiuj przykład części, która ma być nazwana "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Część kodu, którą należy uczynić zewnętrznym plikiem i załadować go na stronę za pomocą "include __DIR__ . '/config.php';"
    // Konfiguracja plików do pobrania. Jeśli istnieje wiele plików, dodaj je jako '2', '3', '4', itd. Również '0' jest poprawny.
    // Użyj „http:” lub „https:” dla protokołu.
    $targetFiles = array(
    '1' => 'TwojeURL/NazwaPliku.zip',
    '2' => 'TwojeURL/NazwaPliku.pdf',
    '3' => 'TwojeURL/NazwaPliku.pdf',
    '4' => 'TwojeURL/NazwaPliku.pdf',
    ); ?> </body> </html>
  7. Kod do ładowania plików zewnętrznych i miejsce ich umieszczenia
    1. Dołącz plik utworzony pod nazwą "config.php" w nastę pującym miejscu za pomocą kodu "include __DIR__ . '/config.php';".
    2. Zakomentuj lub usuń następującą sekcję i zastąp ją kodem "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    // '1' => 'TwojeURL/NazwaPliku.zip',
    // '2' => 'TwojeURL/NazwaPliku.pdf',
    // '3' => 'TwojeURL/NazwaPliku.pdf',
    // '4' => 'TwojeURL/NazwaPliku.pdf',
    //);
  8. Skopiuj kod do zamiany
    include __DIR__ . '/config.php';
* "font-family" w programie należy dostosować do własnej strony, jeśli to konieczne.
《 PHP Code to Create Download Counter 》
Zapisz plik z rozszerzeniem ".php".

<?php
//***************************************************************************************************
// Licznik pobierania i przeglądarka historii pobierania PHP
// [Książka Wszystkich Wiedzy Trochę Przydatna]
//        Minna no Chishiki Chotto Benricho
//        みんなの知識 ちょっと便利帳
// https://www.benricho.org/Tips/download_history/
// Wydano: 26 lutego 2024 roku
//
// Przegląd:
// Ten program to system do śledzenia historii pobierania plików, wyposażony w funkcje uwierzytelniania użytkownika.
// Obejmuje funkcje takie jak sanitacja danych wejściowych, tworzenie plików dziennika oraz wyświetlanie statystyk pobierania.
// Masz prawo go używać, w tym modyfikować kod i zmieniać projekt strony.
//
// Uwaga:
// Przed przesłaniem strony zawierającej linki do pobrania upewnij się, że skonfigurowałeś sekcję "$targetFiles = array()" w tym pliku,
// oraz przeslij tę stronę przed stroną zawierającą linki do pobrania.
// Nieprzestrzeganie tego zalecenia może skutkować nieudanym pobieraniem przez użytkowników, ponieważ ta strona ustawia i odnosi się do plików do pobrania.
//
// Konfiguracja i uwagi:
// ① Hasło jest ustawione na „admin”, ale proszę zmień je na dowolny ciąg znaków.
// ② Katalog „log” do przechowywania plików dziennika jest automatycznie tworzony podczas pierwszego przesyłania.
// Jednak jeśli napotkasz komunikaty typu „nie znaleziono katalogu”, przesyłaj go osobno.
// ③ Przy pierwszym przesłaniu wyświetlany jest „data” i liczba „0”.
// Wynika to z faktu, że pliki dziennika takie jak „count_1.log” zawierające datę przesyłania są jednocześnie generowane w automatycznie tworzonym katalogu „log”.
// Jeśli to stanowi problem, uzyskaj dostęp do serwera zdalnego, pobierz pliki takie jak „count_1.log”, usuń dane, a następnie przesyłaj ponownie.
// ④ Przy wyświetlaniu wielu tabel na stronie w historii wyświetlania możesz wybrać, czy zachować tablicę ustawioną w [$targetFiles = array] czy wyświetlać je w kolejności chronologicznej.
// ⑤ W wyświetlaniu historii możesz wybrać, czy zawierać domenę w 1) wyświetlaniu pliku czy też 2) pokazywać tylko nazwę pliku.
//
// [Format linku na stronie z linkami do pobrania]
// [Przykład] <a href="/download_history/count.php?download=Zarejestrowany numer" download="PobranaNazwaPliku.zip" target="_blank">[Dowolny ciąg]</a>
// ① Dostosuj numer w „download=1” do numeru ustawionego w "$targetFiles = array()".
// ② Dostosuj ścieżkę, aby pasowała do twojej strony.
//
// [Kod (JavaScript) do wyświetlania historii w jednej linii na stronie, na której umieszczono link do pobrania]
// [Przykład] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Dostosuj numer w „dsp_count=1” do numeru ustawionego w "$targetFiles = array()".
// ② Jeśli usuwasz „&day_dsp=on,” będzie wyświetlany tylko „łączny” bez „dzisiaj” i „wczoraj”.
// ③ Dostosuj ścieżkę, aby pasowała do twojej strony.
//***************************************************************************************************

// Konfiguracja plików do pobrania. Jeśli istnieje wiele plików, dodaj je jako '2', '3', '4', itd. Również '0' jest poprawny.
// Użyj „http:” lub „https:” dla protokołu.
$targetFiles = array(
    '1' => 'YourURL/FileName.zip',
    '2' => 'YourURL/FileName.pdf',
    '3' => 'YourURL/FileName.pdf',
    '4' => 'YourURL/FileName.pdf',
);

// Ustawienie kodowania znaków dla wyjścia HTML
header("Content-Type: text/html; charset=utf-8");

// Kodowanie znaków na stronie wyświetlającej historię pobierania
$encodingType = 'UTF-8';

// Zdefiniuj informacje uwierzytelniające użytkownika i inne ustawienia
$userid = 'admin';   // ID użytkownika (zamień 'admin' na dowolny ciąg)
$password = 'admin'; // Hasło (zamień 'admin' na dowolny ciąg)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Użyj password_hash() do wygenerowania wartości skrótu
$dataLogDir = 'log/'; // Katalog „log” jest automatycznie generowany przez ten program. Jeśli nie został utworzony, przeslij katalog o nazwie „log” osobno

// Wybierz, czy włączyć domenę podczas wyświetlania nazwy pliku, czy nie
$includeDomain = 1;  // 1: Wyświetlając, włączając nazwę domeny, 0: Wyświetlanie tylko nazwy pliku

// Wybierz, czy zamienić oryginalną tablicę na nową posortowaną w kolejności nowych dzienników podczas wyświetlania wielu tabel na stronie
$sortTables = 1;  // 1: Sortuj, 0: Nie sortuj

$dir = 'log'; // Katalog do przechowywania plików dziennika i historii pobierania

// Pobierz domenę swojej strony
$domain = $_SERVER['HTTP_HOST'];

// Zarządzanie sesją: Zapobiegaj przechwytywaniu sesji i używaj session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Ustaw flagi HttpOnly i Secure
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Haszowanie hasła: Użyj password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Zapisz nową wartość skrótu w bazie danych itp.
}

// Utwórz katalog, jeśli nie istnieje
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Wyświetl błąd, jeśli tworzenie katalogu nie powiedzie się
        echo 'Utwórz katalog „' . $dataLogDir . '” i przeslij go osobno.';
    }
}

// Sprawdź, czy katalog dziennika jest zapisywalny
if (!is_writable($dataLogDir)) {
    die('Katalog „' . $dataLogDir . '” nie istnieje lub nie ma uprawnień do zapisu. Utwórz katalog i ustaw uprawnienia prawidłowo (np. 755).');
}

// Pobierz datę bazową i datę wczorajszą
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Funkcja do pobierania dnia tygodnia z daty
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Nie', 'Pon', 'Wt', 'Śr', 'Czw', 'Pt', 'Sob');
    return $weekDays[$dayOfWeek];
}

// Ustaw ścieżkę pliku dla każdego docelowego pliku i utwórz plik dziennika, jeśli nie istnieje
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Utwórz plik dziennika, jeśli nie istnieje
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Pobierz ścieżki plików i ich ostatnie daty aktualizacji (posortowane malejąco według daty)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Wyświetl ten błąd w dzienniku i zdecyduj, czy kontynuować lub przerwać przetwarzanie
        echo "Błąd: Plik nie istnieje - $path<br>";
    }
}

// Sortuj malejąco według ostatniej daty aktualizacji (najnowsza data jako pierwsza)
arsort($filePathsAndDates);

// Przebuduj tablicę posortowanych ścieżek plików
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Warunkowo wybierz, czy użyć posortowanych ścieżek do sortowania
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Zwróć kod JavaScript do klienta (dynamiczne wyświetlanie liczby pobrań)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Ustaw nagłówek jako plik JavaScript
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"Parametr musi być liczbą połówkową\")";
        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]);
        }
    }

    // Jeśli opcja wyświetlania daty jest WŁĄCZONA, wyświetlając łącznie z datą
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Liczba pobrań: <strong>{$total}</strong>[<span class="count_today">Dzisiaj : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Wczoraj : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Jeśli opcja wyświetlania daty jest WYŁĄCZONA, wyświetl tylko łączną liczbę pobrań
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Liczba pobrań: {$total}</p>')
EOF;
    }

    // Jeśli kodowanie znaków nie jest UTF-8, przekonwertuj
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Przetwarzanie, gdy żądane jest pobieranie pliku
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Wyjdź, jeśli identyfikator pliku nie jest liczbą lub jeśli identyfikator pliku nie istnieje
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Nieprawidłowy parametr liczbowy');
    }

    // Otwórz plik i zablokuj go
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Nie udało się otworzyć pliku');
    }

    flock($fp, LOCK_EX);

    // Odczytaj plik dziennika i zapisz go w tablicy
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Ociąć plik i dodać nową linię daty na początku
    ftruncate($fp, 0);
    rewind($fp);

    // Dodaj nową linię daty na początku, jeśli nie istnieje
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Przetwórz każdą linię w pliku
    foreach ($line as $val) {
        // Zwiększ liczbę pobrań dla bieżącej daty
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Wypchnij bufor i zwolnij blokadę
    fflush($fp);
    flock($fp, LOCK_UN);

    // Zamknij plik
    fclose($fp);

    // Wyczyść bufor wyjściowy
    ob_end_clean();

    // Wykonaj pobieranie pliku
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Rozpocznij sesję, zniszcz sesję, jeśli żądane jest wylogowanie
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // Użyj funkcji haszowania hasła do wygenerowania wartości skrótu
    // Przetwarzanie logowania
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Porównaj wartości skrótu w celu uwierzytelnienia
        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 {
            // Przetwarzanie w przypadku niepowodzenia uwierzytelnienia
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">Nieprawidłowy identyfikator użytkownika lub hasło.</div>';
        }
    }

    // Jeśli uwierzytelnienie nie powiodło się, wyświetl ekran logowania
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>Ekran logowania historii pobierania</title>
            <!-- Style ekranu logowania (modyfikowalne w razie potrzeby) -->
            <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">【Wyświetl historię pobierania】</p>
                    <?php if (isset($loginError)): ?>
                        <!-- Wyświetl komunikat o błędzie, jeśli zmienna $loginError jest ustawiona -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">Identyfikator użytkownika:</label>
                    <input type="text" id="userid" name="userid" required>
                    <label for="password">Hasło:</label>
                    <input type="password" id

="password" name="password" required>
                    <?php
                        // Zakładając, że $showPassword to zmienna PHP określająca, czy hasło ma być początkowo widoczne
                        echo '<label class="passwordshow" for="showPassword">[Pokaż hasło]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                    ?>
                    <button type="submit" name="login_submit">Zaloguj</button>
                </form>   
            </div>

<!-- Kontroluj widoczność hasła -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // Jeśli zaznaczone, hasło będzie widoczne
      passwordInput.type = 'text';
    } else {
      // Odznacz, aby ukryć hasło
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // Jeśli zalogowany, wyświetl stronę historii pobierania
  ?>
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Historia pobierania</title>
    <!-- Styl wyświetlania historii pobierania (modyfikowalne w razie potrzeby) -->
    <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">【Historia pobierania】 【<a href="?logout=true">Wyloguj</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">Data</th>
            <th class="tableheader">Pobrań</th>
          </tr>
          <?php	  
            $totalDownload = 0;

            // Odczytaj tylko jeśli plik istnieje
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Sprawdź, czy $lineArray[1] jest wartością numeryczną
                $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">Łączna: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// Funkcja do oczyszczania wszystkich elementów tablicy
function sanitize($arr)
{
  // Jeśli to tablica, zastosuj oczyszczanie rekurencyjnie
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // Usuń znaki NULL ze środka ciągów
  return str_replace("\0", "", $arr);
}

// Utwórz nowy plik dziennika, jeśli nie istnieje
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);

    // Ustaw uprawnienia pliku
    chmod($filePath, 0666);
  } else {
  }
}
Zapisz plik z rozszerzeniem ".php".

To kończy wprowadzenie kodu PHP dla "Licznika Pobierania/Programu Przeglądania Historii Pobierania." Mamy nadzieję, że będzie dla Ciebie użyteczny.

Mogą występować błędy w sformułowaniu, ponieważ jest to tłumaczenie z wersji japońskiej. Przepraszamy za niedogodności, ale jeśli wystąpi błąd w sformułowaniu w kodzie, proszę samodzielnie go poprawić lub dostosować.

Czekamy na Twoją opinię na temat korzystania z tego kodu. Niestety nie mogę odpowiadać na pytania.

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

Last updated : 2024/02/05