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

Downloadteller
Geschiedenis bekijken downloaden
= PHP-code downloaden en installeren =
Sample Download Counter

Inleiding

Dit is een introductie tot een programma waarmee je het aantal downloads kunt weten wanneer een gebruiker van een webpagina een programma downloadt en gebruikt. Het is mogelijk om een downloadteller op de pagina in te stellen, en sitebeheerders kunnen ook gemakkelijk de downloadgeschiedenis in de browser controleren.

[Voorbeeld geïnstalleerd op pagina]
Totaal aantal downloads:1865[Vandaag:23 Gisteren:76
[Voorbeeld geopend in browser]
Opmerking: Als een pagina met een downloadlink een bericht weergeeft waarin wordt gevraagd om het bestand op te slaan en vervolgens wordt gesloten zonder de download te starten, wordt dit toch geteld als een download. Dit komt doordat het het aantal klikken op de link telt.
Instructies voor Downloaden:

Download vanaf deze pagina het gecomprimeerde "zip" bestand van het programma en installeer het op je eigen site. Het bestand heet "count.php", maar je kunt het wijzigen.

Je bent vrij om de code te gebruiken en aan te passen, inclusief het wijzigen van het ontwerp van de pagina.

Pas de code aan om nieuwe functies toe te voegen of het ontwerp te wijzigen om een pagina te maken die gemakkelijk te begrijpen en te gebruiken is.

 Download PHP-programma:

Installatie-instructies:

Pak het gedownloade "count.php.zip" bestand uit, en er wordt een bestand met de naam "count.php" aangemaakt. Maak alsjeblieft een map zoals "download_history" aan en sla het daar op.

Het "zip" bestand bevat slechts één bestand, "count.php," en het "inlogscherm" voor de beheerder wordt automatisch gegenereerd.

Over instellingen:

Dit is de belangrijkste instelmethode. Deze belangrijkste onderdelen worden ook vermeld in het PHP-bestand.

  1. Wachtwoordinstellingen:
    1. Er moet een wachtwoord worden ingesteld voor de beheerderspagina.
    2. Het standaardwachtwoord is "admin", maar verander het naar een zelfgekozen tekenreeks.
    3. Om de beveiliging te verbeteren, stel een sterk wachtwoord in.
  2. Instellingen voor Te Downloaden Bestanden:
    1. Voltooi de instellingen voor "$targetFiles = array()".
    2. Dit is het gedeelte zoals "'1' => 'Uw URL/bestandsnaam.zip',".
  3. Map voor het Opslaan van Logbestanden:
    1. Een map met de naam "log" is vereist op de externe server om logbestanden op te slaan die de geschiedenis registreren.
    2. Dit programma maakt automatisch een map genaamd "log" aan bij de eerste upload. Als je echter een bericht krijgt zoals "Geen map", maak deze dan apart aan en upload deze.
  4. Weergave van Eerste Upload Geschiedenis:
    1. Bij de eerste upload kan de "datum" en het getal "0" worden weergegeven in de geschiedenis.
    2. Dit komt doordat logbestanden zoals "count_1.log" met de uploaddatum ook worden gegenereerd in de automatisch aangemaakte "log" map.
    3. Als dit je stoort, download dan een bestand zoals "count_1.log" van de externe server, verwijder de gegevens en upload het opnieuw.
    4. Echter, de "datum" en "0" status kan ook een geschiedenis zijn van wanneer de teller is gestart. Als er op die dag een download is, wordt deze geteld.
  5. Weergavepagina voor Beheerder:
    1. Wanneer beheerders de pagina bekijken, kun je kiezen of je de URL wilt weergeven of alleen de bestandsnaam.
    2. Als er meerdere geschiedenistabellen op één pagina zijn geplaatst, kun je kiezen om ze te behouden in de volgorde ingesteld door "$targetFiles = array()" of ze te sorteren in de volgorde van de datum waarop nieuwe logs plaatsvonden.
  6. Pagina Ontwerp, CSS, etc.:
    1. Pas alsjeblieft het pagina-ontwerp, CSS, etc. aan indien nodig om de pagina gemakkelijk leesbaar te maken.
    2. Vroeger was CSS geschreven als een extern bestand, maar nu is het op dezelfde pagina geschreven zodat je naar de tags kunt verwijzen bij het wijzigen van CSS.
  7. Instellen van Downloadlink op de Pagina:
    1.  Typisch wordt de download <a> tag als volgt geschreven:
      <a href="/download_history/sample.zip" download="Bestandsnaam bij downloaden.zip">[Willekeurige tekenreeks]</a>
    2. In dit programma schrijf je de download <a> tag als volgt:
    3. [Voorbeeld]Kopiëren

      <a href="/download_history/count.php?download=1" download="Bestandsnaam bij downloaden.zip" target="_blank">[Willekeurige tekenreeks]</a>

    4. Pas het nummer in "download=1" aan naar het nummer ingesteld in "$targetFiles = array()". Deze instelling verwijst naar de bestanden die gedownload moeten worden.
    5. Pas het pad aan naar je pagina.
    6. Upload alsjeblieft de pagina met de downloadlink nadat je het bestand hebt geüpload met "$targetFiles = array()" (in dit voorbeeld, "count.php").。
  8. Code voor Weergave van Geschiedenis op één Regel:
    1. Maak de volgende JavaScript en plaats het op de pagina die je wilt weergeven:
    2. [Voorbeeld]Kopiëren
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Pas het nummer in "dsp_count=1" aan naar het nummer ingesteld in "$targetFiles = array()".
    4. Als je "&day_dsp=on," verwijdert, wordt alleen het "totaal aantal" weergegeven zonder de "vandaag/gisteren" weergave.
    5. Totaal aantal downloads:1865[Vandaag:23 Gisteren:76
      Totaal aantal downloads:1865
    6. Pas het pad aan naar je pagina.
Over Extensie-instellingen

Bij het weergeven van meerdere tabellen is de standaardinstelling van het programma om te sorteren op de laatste update tijd. Als je wilt sorteren op het totale aantal downloads, maak dan een nieuw bestand zoals "total_downloads.php" en vervang het volgende gedeelte.

  1. Wijzig commentaar
    Vervang de onderstaande opmerking.
    // Kies of de originele array moet worden vervangen door een nieuwe die is gesorteerd in de volgorde van de nieuwe logs bij het weergeven van meerdere tabellen op een pagina
  2. Kopieer de vervangingsopmerking
    // Als er meerdere tabellen op de pagina worden weergegeven, kies dan of het oorspronkelijke array moet worden vervangen en gesorteerd moet worden in de volgorde van het totale aantal downloads.
  3. Code- en opmerkingswijzigingen
    Vervang de code en opmerkingen in de volgende sectie. Beschouw het als één blok.
    // Haal bestandspaden op en hun laatste update-datum (gesorteerd in aflopende volgorde van datum)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Geef deze foutmelding weer in het logboek en beslis of u wilt doorgaan of de verwerking wilt annuleren
            echo "Fout: Bestand bestaat niet - $path
    "; } } // Sorteer aflopend op de laatste update-datum (nieuwste datum komt eerst) arsort($filePathsAndDates); // Herbouw de array van gesorteerde bestandspaden $sortedFilePaths = array(); foreach ($filePathsAndDates as $key => $date) { $sortedFilePaths[$key] = $filePath[$key]; }
  4. Kopieer vervangingscode en opmerkingen
    // Array die het totale aantal downloads opslaat
    $totalDownloads = array();
    
    // Haal het bestandspad en het totale aantal downloads op
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // Tel het aantal downloads op voor elke regel
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
           // Sla het totale aantal downloads op in een array
            $totalDownloads[$key] = $total;
        } else {
           // Geef deze fout weer in het logboek en beslis of u wilt doorgaan of het proces wilt afbreken
            echo "Fout: Bestand bestaat niet - $path";
        }
    }
    
    // Sorteer op totaal aantal downloads in aflopende volgorde
    arsort($totalDownloads);
    
    // Herbouw het gesorteerde array van bestandspaden
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Bestandscreatie en opzet
    1. Bij het maken van meerdere pagina's, om fouten in het instellen van items te voorkomen bij het uniform toevoegen van inhoud, maak het volgende deel van de code als een extern bestand, en laad het in het momenteel geïmplementeerde deel met een ander code. Maak een extern bestand met een naam als "config.php".
    // Configuratie van bestanden om te downloaden. Als er meerdere bestanden zijn, voeg ze dan toe als '2', '3', '4', enz. Ook '0' is geldig.
    // Gebruik "http:" of "https:" voor het protocol.
    $targetFiles = array(
    '1' => 'UwURL/Bestandsnaam.zip',
    '2' => 'UwURL/Bestandsnaam.pdf',
    '3' => 'UwURL/Bestandsnaam.pdf',
    '4' => 'UwURL/Bestandsnaam.pdf',
    );
  6. Kopieer het voorbeeld van het gedeelte dat "config.php" moet worden genoemd
    <!doctype html
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadGeschiedenis</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Maak alleen dit deel een extern bestand en laad het in de pagina die je gebruikt met "include __DIR__ . '/config.php';"
    // Configuratie van bestanden om te downloaden. Als er meerdere bestanden zijn, voeg ze dan toe als '2', '3', '4', enz. Ook '0' is geldig.
    // Gebruik "http:" of "https:" voor het protocol.
    $targetFiles = array(
        '1' => 'UwURL/Bestandsnaam.zip',
        '2' => 'UwURL/Bestandsnaam.pdf',
        '3' => 'UwURL/Bestandsnaam.pdf',
        '4' => 'UwURL/Bestandsnaam.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Code om een extern bestand te laden en de plaatsing ervan
    1. Inclusief het bestand dat is gemaakt met een naam als "config.php" op de volgende locatie met de code "include __DIR__ . '/config.php';".
    2. Commentaar uit of verwijder het volgende gedeelte en vervang het door de code "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'UwURL/Bestandsnaam.zip',
    //    '2' => 'UwURL/Bestandsnaam.pdf',
    //    '3' => 'UwURL/Bestandsnaam.pdf',
    //    '4' => 'UwURL/Bestandsnaam.pdf',
    //);
  8. Kopieer de code om te vervangen
    include __DIR__ . '/config.php';
* De "font-family" in het programma moet indien nodig worden aangepast aan uw eigen site.
《 PHP-code om een downloadteller te maken 》
Sla het bestand op met een extensie ".php".

<?php
//***************************************************************************************************
// Downloadteller en Downloadgeschiedenisviewer PHP-programma
// [Ieders Kennis Een Beetje Handig Boek]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// Uitgebracht: 6 februari 2024
//
// Overzicht:
// Dit programma is een systeem voor het bijhouden van de geschiedenis van bestandsdownloads, uitgerust met functionaliteit voor gebruikersauthenticatie.
// Het bevat functies zoals inputgegevens-sanitizing, logbestandcreatie en weergave van downloadstatistieken.
// U bent vrij om het te gebruiken, inclusief het wijzigen van de code en het wijzigen van het ontwerp van de pagina.
//
// Opmerking:
// Voordat u de pagina met de downloadlinks uploadt, zorg ervoor dat u de sectie "$targetFiles = array()" van dit bestand configureert,
// en upload deze pagina voor de pagina met de downloadlinks.
// Als u dit niet doet, kunnen gebruikers mogelijk geen downloads uitvoeren wanneer ze dit proberen, omdat deze pagina de te downloaden bestanden instelt en ernaar verwijst.
//
// Configuratie en Opmerkingen:
// ① Het wachtwoord is ingesteld op "admin", maar wijzig het naar elke gewenste tekenreeks.
// ② De "log" directory voor het opslaan van logbestanden wordt automatisch gegenereerd bij de eerste upload.
// Als u echter berichten tegenkomt zoals "directory niet gevonden", upload deze dan apart.
// ③ Bij de initiële upload toont de geschiedenisweergave "datum" en het aantal "0."
// Dit komt omdat logbestanden zoals "count_1.log" met de uploaddatum gelijktijdig worden gegenereerd in de automatisch aangemaakte "log" directory.
// Als dit een probleem is, ga dan naar de externe server, download bestanden zoals "count_1.log," verwijder de gegevens en upload vervolgens.
// ④ Bij het weergeven van meerdere tabellen op een pagina in de geschiedenisweergave, kunt u kiezen of u de array ingesteld in [$targetFiles = array] wilt behouden of ze in chronologische volgorde wilt weergeven.
// ⑤ In de geschiedenisweergave kunt u kiezen of u het domein wilt opnemen in 1) het weergeven van het bestand of 2) alleen de bestandsnaam tonen.
//
// [Formaat van de link op de pagina met downloadlinks]
// [Voorbeeld] <a href="/download_history/count.php?download=Geregistreerd Nummer" download="GedownloadeBestandsnaam.zip" target="_blank">[Willekeurige Tekenreeks]</a>
// ① Pas het nummer in "download=1" aan naar het nummer ingesteld in "$targetFiles = array()".
// ② Pas het pad aan om overeen te komen met uw pagina.
//
// [Code (JavaScript) voor het weergeven van de geschiedenis in één regel op de pagina waar de downloadlink staat]
// [Voorbeeld] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Pas het nummer in "dsp_count=1" aan naar het nummer ingesteld in "$targetFiles = array()".
// ② Als u "&day_dsp=on" verwijdert, wordt alleen de "totaal" weergegeven zonder "vandaag" en "gisteren".
// ③ Pas het pad aan om overeen te komen met uw pagina.
//***************************************************************************************************

// Configuratie van bestanden om te downloaden. Als er meerdere bestanden zijn, voeg deze dan toe als '2', '3', '4', enzovoort. '0' is ook geldig.
// Gebruik "http:" of "https:" voor het protocol.
$targetFiles = array(
    '1' => 'UwURL/Bestandsnaam.zip',
    '2' => 'UwURL/Bestandsnaam.pdf',
    '3' => 'UwURL/Bestandsnaam.pdf',
    '4' => 'UwURL/Bestandsnaam.pdf',
);

// Stel tekencodering in voor HTML-uitvoer
header("Content-Type: text/html; charset=utf-8");

// Tekencodering op de pagina waarop de downloadgeschiedenis wordt weergegeven
$encodingType = 'UTF-8';

// Definieer gebruikersauthenticatiegegevens en andere instellingen
$userid = 'admin';   // Gebruikers-ID (vervang 'admin' door een willekeurige tekenreeks)
$password = 'admin'; // Wachtwoord (vervang 'admin' door een willekeurige tekenreeks)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Gebruik password_hash() om een hash-waarde te genereren
$dataLogDir = 'log/'; // De 'log'-directory wordt automatisch gegenereerd door dit programma. Als deze niet is aangemaakt, upload dan apart een directory met de naam 'log'

// Kies of het domein moet worden opgenomen bij het weergeven van de bestandsnaam of niet
$includeDomain = 1;  // 1: Weergeven inclusief de domeinnaam, 0: Alleen de bestandsnaam weergeven

// Kies of het oorspronkelijke array moet worden vervangen door een nieuw gesorteerd array in de volgorde van de nieuwe logs bij het weergeven van meerdere tabellen op een pagina
$sortTables = 1;  // 1: Sorteren, 0: Niet sorteren

$dir = 'log'; // Map om logbestanden en downloadgeschiedenis op te slaan

// Haal het domein van je site op
$domain = $_SERVER['HTTP_HOST'];

// Sessiebeheer: Voorkom sessie-overname en gebruik session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Stel HttpOnly- en Secure-vlaggen in
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Wachtwoordhashing: Gebruik password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Bewaar de nieuwe hash-waarde in een database, enz.
}

// Maak de directory aan als deze niet bestaat
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Toon een bericht als het maken van de directory mislukt
        echo 'Maak alstublieft de "' . $dataLogDir . '" directory aan en upload deze apart.';
    }
}

// Controleer of de log-directory beschrijfbaar is
if (!is_writable($dataLogDir)) {
    die('De directory "' . $dataLogDir . '" bestaat niet of heeft geen schrijfrechten. Maak de directory aan en stel de rechten correct in (bijv. 755).');
}

// Haal de basisdatum en de datum van gisteren op
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Functie om de dag van de week van een datum te krijgen
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Zon', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za');
    return $weekDays[$dayOfWeek];
}

// Stel het bestandspad in voor elk doelbestand en maak een logbestand aan als het niet bestaat
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Maak het logbestand aan als het niet bestaat
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Haal bestandspaden en hun laatste update-datum op (gesorteerd in aflopende volgorde van datum)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Geef deze fout weer in het logboek en beslis of het proces moet worden voortgezet of afgebroken
        echo "Fout: Bestand bestaat niet - $path<br>";
    }
}

// Sorteer aflopend op de laatste update-datum (de nieuwste datum komt eerst)
arsort($filePathsAndDates);

// Herbouw het array van gesorteerde bestandspaden
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Kies conditioneel of de gesorteerde paden moeten worden gebruikt voor het sorteren
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Geef JavaScript-code terug aan de client (dynamische weergave van downloadaantallen)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Stel de header in als een JavaScript-bestand
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"Parameter moet een halfbreed nummer zijn\")";
        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]);


        }
    }

    // Als de optie voor datumweergave AAN staat, toon dan inclusief de datum
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Totaal aantal downloads: <strong>{$total}</strong>[<span class="count_today">Vandaag : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Gisteren : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Als de optie voor datumweergave UIT staat, toon dan alleen het totale aantal downloads
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Totaal aantal downloads: {$total}</p>')
EOF;
    }

    // Als de tekencodering niet UTF-8 is, converteer dan
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Verwerking wanneer een bestandsdownload wordt aangevraagd
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Stop als het bestands-ID geen nummer is of als het bestands-ID niet bestaat
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Onjuiste numerieke parameter');
    }

    // Open het bestand en vergrendel het
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Kan het bestand niet openen');
    }

    flock($fp, LOCK_EX);

    // Lees het logbestand en sla het op in een array
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Truncate het bestand en voeg een nieuwe datumregel toe aan het begin
    ftruncate($fp, 0);
    rewind($fp);

    // Voeg een nieuwe datumregel toe aan het begin als deze niet bestaat
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Verwerk elke regel in het bestand
    foreach ($line as $val) {
        // Verhoog het downloadaantal voor de huidige datum
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Flush de buffer en ontgrendel het bestand
    fflush($fp);
    flock($fp, LOCK_UN);

    // Sluit het bestand
    fclose($fp);

    // Maak de uitvoerbuffer leeg
    ob_end_clean();

    // Voer de bestandsdownload uit
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Start de sessie, vernietig de sessie als uitloggen wordt aangevraagd
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // Gebruik de wachtwoordhashfunctie om een hash-waarde te genereren
    // Inlogverwerking
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Vergelijk hash-waarden voor authenticatie
        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 {
            // Verwerking bij mislukte authenticatie
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">Onjuiste gebruikersnaam of wachtwoord.</div>';
        }
    }

    // Als de authenticatie niet succesvol is, toon dan het inlogscherm
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>Download Geschiedenis Inlogscherm</title>
            <!-- Stijlen voor het inlogscherm (aanpasbaar indien nodig) -->
            <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">【Bekijk Downloadgeschiedenis】</p>
                    <?php if (isset($loginError)): ?>
                        <!-- Toon een foutmelding als de variabele $loginError is ingesteld -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">Gebruikersnaam:</label>
                    <input type="text" id="userid" name="userid" required>
                    <label for="password">Wachtwoord:</label>
                    <input type="password" id="password" name="password" required>
                    <?php
                        // Ga ervan uit dat $showPassword een PHP-variabele is die bepaalt of het wachtwoord in eerste instantie wordt weergegeven
                        echo '<label class="passwordshow" for="showPassword">[Toon Wachtwoord]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                    ?>
                    <button type="submit" name="login_submit">Inloggen</button>
                </form>   
            </div>

<!-- Beheer de zichtbaarheid van het wachtwoord -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // Als aangevinkt, wordt het wachtwoord weergegeven
      passwordInput.type = 'text';
    } else {
      // Uitvinken om het wachtwoord te verbergen
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // Als ingelogd, toon dan de pagina met downloadgeschiedenis
  ?>
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Downloadgeschiedenis</title>
    <!-- Stijl voor het bekijken van de downloadgeschiedenis (aanpasbaar indien nodig) -->
    <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">【Downloadgeschiedenis】 【<a href="?logout=true">Uitloggen</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">Datum</th>
            <th class="tableheader">Downloads</th>
          </tr>
          <?php	  
            $totalDownload = 0;

            // Lees alleen als het bestand bestaat
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Controleer of $lineArray[1] een numerieke waarde is
                $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">Totaal: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// Functie om alle elementen in een array te saneren
function sanitize($arr)
{
  // Als het een array is, pas dan de sanering recursief toe
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // Verwijder NULL-karakters uit strings
  return str_replace("\0", "", $arr);
}

// Maak een nieuw logbestand als het niet bestaat
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);

    // Stel bestandsrechten in
    chmod($filePath, 0666);
  } else {
  }
}
Dit concludeert de introductie van de PHP-code voor het "Downloadteller/Programma voor het bekijken van downloadgeschiedenis." We hopen dat je het nuttig vindt.

Er kunnen fouten zijn in de bewoording omdat het een vertaling is van de Japanse versie. Onze excuses voor het ongemak, maar als er een fout is in de bewoording in de code, corrigeer of pas deze dan zelf aan.

We waarderen je feedback over het gebruik van deze code. Houd er rekening mee dat ik niet kan reageren op vragen.

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

Last updated : 2024/06/29