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

Download Tæller
Download Historie Visningsprogram
= Download og Installation af PHP Kode =
Eksempel på Download Tæller

Introduktion:

Dette er en introduktion til et program, der giver dig mulighed for at kende antallet af downloads, når en webstedsbruger downloader og bruger et program. Det er muligt at opsætte en downloadtæller på siden, og webstedsadministratorer kan også nemt kontrollere downloadhistorikken i browseren.

[Eksempel Installeret på Side]
Samlede Downloads:1865[I dag: 23 I går: 76
[Eksempel Åbnet i Browser]
Bemærk: Hvis en side med et downloadlink viser en besked, der beder om filens lagring, og den lukkes uden at starte downloaden, vil den stadig blive talt som et download. Dette skyldes, at den tæller antallet af linkklik.
Download Instruktioner:

Download den komprimerede "zip" fil af programmet fra denne side og installer den på dit eget websted. Filen er navngivet "count.php", men du kan ændre den.

Du er fri til at bruge og ændre koden, herunder ændring af side designet.

Venligst ændre koden for at tilføje nye funktioner eller ændre designet for at skabe en side, der er nem at forstå og bruge.

 PHP Program Download:

Installations Instruktioner:

Unzip den downloadede "count.php.zip" fil, og en fil ved navn "count.php" vil blive oprettet. Opret venligst en mappe som f.eks. "download_historik" og gem den der.

"Zip" filen indeholder kun én fil, "count.php," og "login skærmen" for administrator er automatisk genereret.

Indstillinger:

Dette er den primære indstilling metode. Det er også opført i PHP-filen.

  1. Adgangskode Indstillinger:
    1. En adgangskode skal angives for administratorens side.
    2. Standardadgangskoden er "admin", men ændr den til en vilkårlig streng.
    3. For at forbedre sikkerheden, indstil en stærk adgangskode.
  2. Indstillinger af Filer til Download:
    1. Færdiggør indstillingerne for "$targetFiles = array()".
    2. Dette er delen såsom "'1' => 'Din URL/filnavn.zip',".
  3. Mappe til Lagring af Logfiler:
    1. Der kræves en mappe ved navn "log" på den fjernbetjente server for at gemme logfiler, der registrerer historie.
    2. Dette program opretter automatisk en mappe kaldet "log", når du uploader for første gang. Hvis du imidlertid får en besked som f.eks. "Ingen mappe", skal du oprette og uploade den separat.
  4. Første Gangs Upload Historie Visning:
    1. Ved den første upload kan "datoen" og tallet "0" vises i historikken.
    2. Dette skyldes, at logfiler som f.eks. "count_1.log" indeholdende upload dato også genereres i den automatisk genererede "log" mappe.
    3. Hvis dette generer dig, skal du downloade en fil som f.eks. "count_1.log" fra den fjernbetjente server, slette dataene og uploade den.
    4. Dog kan "datoen" og "0" tilstanden også være en historik om, hvornår tælleren blev startet. Hvis der er en download på den dag, vil den blive talt op.
  5. Administrator Visnings Sidevisning:
    1. Når administratorer ser siden, kan du vælge, om du vil vise URL'en eller kun filnavnet.
    2. Hvis der er placeret flere historiktabeller på én side, kan du vælge at beholde dem i den rækkefølge, der er angivet af "$targetFiles = array()" eller sortere dem i rækkefølgen af datoen, når nye logfiler opstod.
  6. Side Design, CSS, osv.:
    1. Justér venligst side designet, CSS, osv., efter behov for at gøre siden nem at læse.
    2. Engang var CSS skrevet som en ekstern fil, men nu er det skrevet på samme side, så du kan henvise til tags, når du ændrer CSS.
  7. Opsætning af Download Link på Siden:
    1.  Normalt er download <a> tag skrevet som følger:
      <a href="/download_history/sample.zip" download="Filnavn ved downloadning.zip">[Vilkårlig streng]</a>
    2. I dette program, skriv download <a> tag som følger:
    3. [Eksempel]Kopier
      <a href="/download_history/count.php?download=1" download="Filnavn ved downloadning.zip" target="_blank">[Vilkårlig streng]</a>
    4. Match nummeret i "download=1" til nummeret angivet i "$targetFiles = array()". Denne indstilling henviser til filerne, der skal downloades.
    5. Match stien til din side.
    6. Upload venligst siden med download linket efter at have uploadet filen med "$targetFiles = array()" (i dette eksempel "count.php").
  8. Kode til Visning af Historik i én Linje:
    1. Opret følgende JavaScript og placer det på den side, du ønsker at vise:
    2. [Eksempel]Kopier
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Match nummeret i "dsp_count=1" til nummeret angivet i "$targetFiles = array()".
    4. Hvis du sletter "&day_dsp=on," vil kun "total antal" blive vist uden "i dag/i går" visning.
    5. Samlede Downloads:1865[I dag: 2I går: 76
      Samlede Downloads:1865
    6. Match stien til din side.
Om Udvidelsesindstillinger

Når der vises flere tabeller, er programmets standardindstilling at sortere efter den seneste opdateringstid. Hvis du vil sortere efter den samlede downloadtælling, skal du oprette en ny fil som "total_downloads.php" og erstatte følgende del.

  1. Ændring i kommentarer
    Erstat kommentarerne i følgende afsnit:
    // Vælg, om originalarrayet skal erstattes af en ny sorteret i rækkefølgen af de nye logfiler, når der vises flere tabeller på en side
  2. Kopi af erstatningskommentaren
    // Hvis der vises flere tabeller på siden, vælg om du vil erstatte det originale array og sortere i rækkefølge af den samlede antal downloads.
  3. Ændringer i kode og kommentarer
    Erstat koden og kommentarerne i følgende afsnit. Betragt det venligst som en blok.
    /// Hent filstier og deres sidste opdateringsdatoer (sorteret i faldende rækkefølge efter dato)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
           $filePathsAndDates[$key] = filemtime($path);
            echo "Fejl: Filen eksisterer ikke - $path<br>";
        }
    }
    
    // Sortér i faldende rækkefølge efter den sidste opdateringsdato (så nyere datoer kommer først)
    arsort($filePathsAndDates);
    
    // Genopbyg det sorteret array af filstier
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Kopi af udskiftningskoden og kommentarerne
    // Array der gemmer den samlede antal downloads
    $totalDownloads = array();
    
    // Hent filstien og dens samlede antal downloads
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // Summer antallet af downloads for hver række
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
          // Gem det samlede antal downloads i et array
            $totalDownloads[$key] = $total;
        } else {
           // Udskriv denne fejl til loggen og beslut, om du vil fortsætte eller afbryde processen
            echo "Fejl: Filen eksisterer ikke - $path";
        }
    }
    
    // Sortér efter samlet antal downloads i faldende rækkefølge
    arsort($totalDownloads);
    
    // Genopbyg det sorteret array af filstier
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Filoprettelse og opsætning
    1. Når der oprettes flere sider, for at forhindre fejl i indstillingerne ved tilføjelse af indhold ensartet, skal du oprette følgende del af koden som en ekstern fil og indlæse den i den aktuelt implementerede del med en anden kode. Opret en ekstern fil med et navn som "config.php".
    // Konfiguration af filer til download. Hvis der er flere filer, tilføj dem som '2', '3', '4' osv. Også '0' er gyldig
    // Brug "http:" eller "https:" for protokollen.
    $targetFiles = array(
    '1' => 'DinURL/FilNavn.zip',
    '2' => 'DinURL/FilNavn.pdf',
    '3' => 'DinURL/FilNavn.pdf',
    '4' => 'DinURL/FilNavn.pdf',
    );
  6. Kopi af delen, der skal navngives "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Gør kun denne del til en ekstern fil og indlæs den på siden, du bruger med "include __DIR__ . '/config.php';"
    // Konfiguration af filer til download. Hvis der er flere filer, tilføj dem som '2', '3', '4' osv. Også '0' er gyldig.
    // Brug "http:" eller "https:" for protokollen.
    $targetFiles = array(
    $targetFiles = array(
    '1' => 'DinURL/FilNavn.zip',
    '2' => 'DinURL/FilNavn.pdf',
    '3' => 'DinURL/FilNavn.pdf',
    '4' => 'DinURL/FilNavn.pdf',
    ); ?> </body> </html>
  7. Kode til at indlæse eksterne filer og hvor den skal placeres
    1. Inkluder filen oprettet med et navn som "config.php" på følgende placering med koden "include __DIR__ . '/config.php';".。
    2. Kommenter eller slet følgende afsnit og erstat det med koden "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    // '1' => 'DinURL/FilNavn.zip',
    // '2' => 'DinURL/FilNavn.pdf',
    // '3' => 'DinURL/FilNavn.pdf',
    // '4' => 'DinURL/FilNavn.pdf',
    //);
  8. Kopi af koden til udskiftning
    include __DIR__ . '/config.php';
《 PHP Kode til Oprettelse af Downloadtæller 》
Gem filen med en ".php" udvidelse.

<?php
//***************************************************************************************************
// Download-tæller og Downloadhistorikvisnings PHP-program
// [Alle vides en lille nyttig bog]
//        Minna no Chishiki Chotto Benricho
//        みんなの知識 ちょっと便利帳
// https://www.benricho.org/Tips/download_history/
// Udgivet: 21. februar 2024
//
// Overblik:
// Dette program er et system til sporing af historikken over fildownloads, udstyret med funktionalitet til brugerautentificering.
// Det inkluderer funktioner som inputdata-sanitization, oprettelse af logfil og visning af downloadstatistik.
// Du er velkommen til at bruge det, inklusive at ændre koden og ændre sidens design.
//
// Bemærk:
// Før du uploader siden med downloadlinks, skal du sørge for at konfigurere afsnittet "$targetFiles = array()" i denne fil,
// og upload derefter denne side før siden med downloadlinks.
// Manglende overholdelse heraf kan resultere i, at brugerne ikke kan downloade, når de forsøger, da denne side angiver og refererer til de filer, der skal downloades.
//
// Konfiguration og noter:
// ① Adgangskoden er indstillet til "admin", men vær venlig at ændre den til en hvilken som helst ønsket streng.
// ② "log" -mappen til opbevaring af logfiler genereres automatisk ved den første upload.
// Hvis du dog støder på beskeder som "mappe ikke fundet", skal du uploade den separat.
// ③ Ved den første upload viser historikvisningen "dato" og tallet "0".
// Dette skyldes, at logfiler som "count_1.log" med uploaddatoen samtidig genereres i den automatisk oprettede "log" -mappe.
// Hvis dette er et problem, skal du få adgang til fjernserveren, downloade filer som "count_1.log", slette dataene og derefter uploade dem.
// ④ Når der vises flere tabeller på en side i historikvisningen, kan du vælge, om du vil beholde arrayet sat i [$targetFiles = array] eller vise dem i kronologisk rækkefølge.
// ⑤ I historikvisningen kan du vælge, om du vil inkludere domænet i 1) visning af filen eller 2) kun vise filnavnet.
//
// [Format af linket på siden med downloadlinks]
// [Eksempel] <a href="/download_history/count.php?download=Registreringsnummer" download="DownloadetFilnavn.zip" target="_blank">[Enhver streng]</a>
// ① Juster tallet i "download=1" til det tal, der er angivet i "$targetFiles = array()".
// ② Juster stien, så den passer til din side.
//
// [Kode (JavaScript) til visning af historik i en linje på siden, hvor downloadlinket er placeret]
// [Eksempel] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Juster tallet i "dsp_count=1" til det tal, der er angivet i "$targetFiles = array()".
// ② Hvis du fjerner "&day_dsp=on," vises kun "total" uden "i dag" og "i går".
// ③ Juster stien, så den passer til din side.
//***************************************************************************************************

// Konfiguration af filer til download. Hvis der er flere filer, tilføj dem som '2', '3', '4' osv. Også '0' er gyldig.
// Brug "http:" eller "https:" for protokollen.
$targetFiles = array(
    '1' => 'DinURL/Filnavn.zip',
    '2' => 'DinURL/Filnavn.pdf',
    '3' => 'DinURL/Filnavn.pdf',
    '4' => 'DinURL/Filnavn.pdf',
);

// Indstil tegnkodning for HTML-udgang
header("Content-Type: text/html; charset=utf-8");

// Tegnkodning på siden, der viser downloadhistorikken
$encodingType = 'UTF-8';

// Definer brugerautentificeringsoplysninger og andre indstillinger
$userid = 'admin';   // Bruger-ID (erstat 'admin' med en hvilken som helst streng)
$password = 'admin'; // Adgangskode (erstat 'admin' med en hvilken som helst streng)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Brug password_hash() til at generere en hashværdi
$dataLogDir = 'log/'; // Mappen 'log' genereres automatisk af dette program. Hvis den ikke oprettes, skal du uploade en mappe kaldet 'log' separat

// Vælg, om domænet skal inkluderes, når filnavnet vises, eller ej
$includeDomain = 1;  // 1: Vis inklusive domænenavn, 0: Vis kun filnavnet

// Vælg, om originalarrayet skal erstattes af en ny sorteret i rækkefølgen af de nye logfiler, når der vises flere tabeller på en side
$sortTables = 1;  // 1: Sorter, 0: Sorter ikke

$dir = 'log'; // Mappen til at gemme logfiler og downloadhistorik

// Få domænet for din side
$domain = $_SERVER['HTTP_HOST'];

// Sessionsstyring: Forhindrer sessionskapring og brug session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Indstil HttpOnly- og Secure-flagene
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Adgangskodehashing: Brug password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Gem den nye hashværdi i en database osv.
}

// Opret mappen, hvis den ikke eksisterer
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Vis, hvis mappen ikke kan oprettes
        echo 'Opret venligst mappen "' . $dataLogDir . '" og upload den separat.';
    }
}

// Kontroller, om logmappen kan skrives til
if (!is_writable($dataLogDir)) {
    die('Mappen "' . $dataLogDir . '" eksisterer enten ikke eller har ikke skriveadgang. Opret mappen og indstil tilladelserne korrekt (f.eks. 755).');
}

// Få basen og gårsdagens dato
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Funktion til at få ugedagen fra en dato
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør');
    return $weekDays[$dayOfWeek];
}

// Skift filstien for hvert målfil og opret en logfil, hvis den ikke eksisterer
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Opret logfilen, hvis den ikke eksisterer
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Hent filstier og deres sidste opdateringsdatoer (sorteret i faldende rækkefølge efter dato)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Udskriv denne fejl til loggen og beslut, om du vil fortsætte eller afbryde processen
        echo "Fejl: Filen eksisterer ikke - $path<br>";
    }
}

// Sortér i faldende rækkefølge efter den sidste opdateringsdato (så nyere datoer kommer først)
arsort($filePathsAndDates);

// Genopbyg det sorteret array af filstier
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Betinget vælg om de sorteret stier skal bruges til sortering
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Returner JavaScript-kode til klienten (dynamisk visning af downloadtællinger)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Indstil headeren som en JavaScript-fil
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"Parameter skal være et halvbredde tal\")";
        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]);
        }
    }

    // Hvis datovisningsoptionen er TIL, vis inklusive datoen
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Samlet downloads: <strong>{$total}</strong>[<span class="count_today">I dag : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">I går : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Hvis datovisningsoptionen er FRA, vis kun den samlede downloadtælling
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Samlet downloads: {$total}</p>')
EOF;
    }

    // Hvis tegnkodningen ikke er UTF-8, konverter
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Behandling når der anmodes om en fil-download
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Afslut hvis filens ID ikke er et tal eller hvis filens ID ikke eksisterer
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Forkert numerisk parameter');
    }

    // Åbn filen og lås den
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Kunne ikke åbne filen');
    }

    flock($fp, LOCK_EX);

    // Læs logfilen og gem den i et array
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Beskær filen og tilføj en ny datolinje i begyndelsen
    ftruncate($fp, 0);
    rewind($fp);

    // Tilføj en ny datolinje i begyndelsen, hvis den ikke findes
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Behandle hver linje i filen
    foreach ($line as $val) {
        // Inkrementér downloadtælleren for den aktuelle dato
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Tøm bufferen og frigiv låsen
    fflush($fp);
    flock($fp, LOCK_UN);

    // Luk filen
    fclose($fp);

    // Ryd output-bufferen
    ob_end_clean();

    // Udfør fil-download
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Start sessionen, ødelæg sessionen hvis logud anmodes om
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // Brug password hash-funktionen til at generere en hash-værdi
    // Loginbehandling
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Sammenlign hash-værdier til autentificering
        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 {
            // Behandling af fejl ved autentificering
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">Forkert brugernavn eller adgangskode.</div>';
        }
    }

    // Hvis autentificering ikke lykkes, vis login-skærmen
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>Downloadhistorik Login-skærm</title>
            <!-- Stilarter til login-skærm (kan tilpasses efter behov) -->
            <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">【Se downloadhistorik】</p>
                    <?php if (isset($loginError)): ?>
                        <!-- Vis en fejlmeddelelse, hvis variablen $loginError er sat -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">Bruger-ID:</label>
                    <input type="text" id="userid" name="userid" required>
                    <label for="password">Adgangskode:</label>
                    <input type="password" id="password" name="password" required>
                    <?php
                        // Antag at $showPassword er en PHP-variabel, der bestemmer, om adgangskoden skal vises fra starten
                        echo '<label class="passwordshow" for="showPassword">[Vis adgangskode]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                    ?>
                    <button type="submit" name="

login_submit">Login</button>
                </form>   
            </div>

<!-- Kontroller synligheden af adgangskoden -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // Hvis markeret, vises adgangskoden
      passwordInput.type = 'text';
    } else {
      // Fravælg for at skjule adgangskoden
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // Hvis der er logget ind, vis downloadhistorik-siden
  ?>
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Downloadhistorik</title>
    <!-- Stil for visning af downloadhistorik (kan tilpasses efter behov) -->
    <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">【Downloadhistorik】 【<a href="?logout=true">Logud</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">Dato</th>
            <th class="tableheader">Downloads</th>
          </tr>
          <?php	  
            $totalDownload = 0;

            // Læs kun hvis filen eksisterer
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Kontroller om $lineArray[1] er en numerisk værdi
                $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">Samlet antal: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// Funktion til at rense alle elementer i et array
function sanitize($arr)
{
  // Hvis det er et array, anvend sanitizering rekursivt
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // Fjern NULL-tegn fra strengene
  return str_replace("\0", "", $arr);
}

// Opret en ny logfil, hvis den ikke eksisterer
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);

    // Indstil filrettighederne
    chmod($filePath, 0666);
  } else {
  }
}
Dette afslutter introduktionen af PHP koden til "Downloadtæller/Visning af Downloadhistorik". Vi håber, du finder den nyttig.

Der kan være fejl i formuleringen, da det er en oversættelse fra den japanske version. Vi beklager ulejligheden, men hvis der er en fejl i formuleringen i koden, kan du selv rette eller justere den.

Vi værdsæ tter din feedback på brugen af denne kode. Bemærk, at jeg ikke kan besvare spørgsmål.

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

Last updated : 2024/02/05