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-Zähler
Programm zur Anzeige von Download-Verlauf
= PHP-Code herunterladen und installieren =
Sample Download Counter

Einführung:

Dies ist eine Einführung in ein Programm, mit dem Sie die Anzahl der Downloads ermitteln können, wenn ein Webseitenbenutzer ein Programm herunterlädt und verwendet. Es ist möglich, einen Download-Zähler auf der Seite einzurichten, und Site-Administratoren können den Download-Verlauf auch einfach im Browser überprüfen.

[Beispiel auf der Seite installiert]
Gesamtzahl der Downloads: 1865 [Heute: 23 Gestern: 76]
[Beispiel im Browser geöffnet]

Hinweis: Wenn eine Seite mit einem Download-Link eine Meldung zur Speicherung der Datei anzeigt und dann geschlossen wird, ohne den Download zu starten, wird es dennoch als Download gezählt. Dies liegt daran, dass die Anzahl der Klicks auf den Link gezählt wird.

Anleitung zum Download:

Laden Sie von dieser Seite die komprimierte "zip"-Datei des Programms herunter und installieren Sie es auf Ihrer eigenen Webseite. Die Datei heißt "count.php", aber Sie können sie umbenennen.

Sie sind frei, den Code zu verwenden und zu ändern, einschließlich der Änderung des Seitenlayouts.

Ändern Sie den Code, um neue Funktionen hinzuzufügen oder das Design so anzupassen, dass die Seite leicht verständlich und benutzerfreundlich ist.

 PHP-Programm herunterladen:
IInstallationsanleitung:

Entpacken Sie die heruntergeladene "count.php.zip"-Datei, und es wird eine Datei namens "count.php" erstellt. Bitte erstellen Sie ein Verzeichnis wie "download_history" und speichern Sie es dort.

Die "zip"-Datei enthält nur eine Datei, "count.php", und der "Anmeldebildschirm" für den Administrator wird automatisch generiert.

Einstellungen:

Dies ist die Hauptmethode zur Konfiguration. Diese Hauptteile sind auch in der PHP-Datei aufgeführt.

  1. Passworteinstellungen:
    1. Ein Passwort muss für die Administratorseite festgelegt werden.
    2. Das Standardpasswort lautet "admin", aber ändern Sie es in eine Zeichenkette Ihrer Wahl.
    3. Um die Sicherheit zu erhöhen, setzen Sie ein starkes Passwort.
  2. Einstellen der herunterzuladenden Dateien:
    1. Schließen Sie die Einstellungen für "$targetFiles = array()" ab.
    2. Dies ist der Teil wie "'1' => 'Ihre URL/Dateiname.zip',".
  3. Verzeichnis zum Speichern von Protokolldateien:
    1. Ein Verzeichnis namens "log" ist auf dem Remote-Server erforderlich, um Protokolldateien zu speichern, die die Historie aufzeichnen.
    2. Dieses Programm erstellt automatisch ein Verzeichnis namens "log", wenn Sie es zum ersten Mal hochladen. Wenn jedoch eine Meldung wie "Kein Verzeichnis" erscheint, erstellen Sie es bitte separat und laden Sie es hoch.
  4. Anzeige des Upload-Verlauf bei der ersten Übertragung:
    1. Bei der ersten Übertragung können "Datum" und die Zahl "0" im Verlauf angezeigt werden.
    2. Dies liegt daran, dass auch Protokolldateien wie "count_1.log" mit dem Übertragungsdatum im automatisch generierten "log"-Verzeichnis erstellt werden.
    3. Wenn Sie dies stört, laden Sie eine Datei wie "count_1.log" vom Remote-Server herunter, löschen Sie die Daten und laden Sie sie erneut hoch.
    4. Es könnte jedoch auch ein Verlauf sein, wann der Zähler gestartet wurde. Wenn es an diesem Tag einen Download gibt, wird er gezählt.
  5. Anzeige der Administratorenseite:
    1. Wenn Administratoren die Seite anzeigen, können Sie wählen, ob die URL oder nur der Dateiname angezeigt werden soll.
    2. Wenn mehrere Historientabellen auf einer Seite platziert sind, können Sie wählen, ob sie in der Reihenfolge von "$targetFiles = array()" festgelegt bleiben oder in der Reihenfolge des Datums sortiert werden, wenn neue Protokolle aufgetreten sind.
  6. Seitenlayout, CSS, etc.:
    1. Passen Sie das Seitenlayout, das CSS usw. nach Bedarf an, um die Seite leicht lesbar zu machen.
    2. Früher wurde das CSS als externe Datei geschrieben, aber jetzt ist es auf derselben Seite geschrieben, damit Sie sich auf die Tags beziehen können, wenn Sie das CSS ändern.
  7. Einrichtung des Download-Links auf der Seite:
    1. Normalerweise wird der Download-<a>-Tag wie folgt geschrieben:
      <a href="/download_history/sample.zip" download="File name when downloading.zip">[Beliebige Zeichenfolge]</a>
    2. In diesem Programm schreiben Sie den Download-<a>-Tag wie folgt:
    3. [Beispiel]Kopieren
      <a href="/download_history/count.php?download=1" download="File name when downloading.zip" target="_blank">[Beliebige Zeichenfolge]</a>
    4. Passen Sie die Nummer in "download=1" an die Nummer an, die in "$targetFiles = array()" festgelegt ist. Diese Einstellung bezieht sich auf die herunterzuladenden Dateien.
    5. Passen Sie den Pfad zu Ihrer Seite an.
    6. Laden Sie die Seite mit dem Download-Link hoch, nachdem Sie die Datei mit "$targetFiles = array()" hochgeladen haben (in diesem Beispiel "count.php").
  8. Code zum Anzeigen des Verlaufs in einer Zeile:
    1. Erstellen Sie den folgenden JavaScript und platzieren Sie ihn auf der Seite, auf der Sie ihn anzeigen möchten:
    2. [Beispiel]Kopieren
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Passen Sie die Nummer in "dsp_count=1" an die Nummer an, die in "$targetFiles = array()" festgelegt ist.
    4. Wenn Sie "&day_dsp=on," löschen, wird nur die "Gesamtanzahl" ohne die Anzeige von "Heute/Gestern" angezeigt.
    5. Gesamtzahl der Downloads: 1865 [Heute: 23 Gestern: 76]
      Gesamtzahl der Downloads: 1865
    6. Passen Sie den Pfad zu Ihrer Seite an.
Über die Erweiterungseinstellungen

Wenn mehrere Tabellen angezeigt werden, ist die Standardkonfiguration dieses Programms, nach der Uhrzeit der letzten Aktualisierung zu sortieren. Wenn Sie nach der Gesamtanzahl der Downloads sortieren möchten, erstellen Sie eine neue Datei wie "total_downloads.php" und ersetzen Sie den folgenden Abschnitt.

  1. Änderungen in den Kommentaren
    Ersetzen Sie die Kommentare im folgenden Abschnitt:
    // Wählen Sie aus, ob das ursprüngliche Array durch ein neues Array ersetzt werden soll, das in der Reihenfolge der neuen Logs sortiert ist, wenn auf einer Seite mehrere Tabellen angezeigt werden
  2. Kopieren Sie den zu ersetzenden Kommentar
    // Wenn mehrere Tabellen auf der Seite angezeigt werden, wählen/legen Sie, ob das ursprüngliche Array ersetzt und in absteigender Reihenfolge der Gesamtzahl der Downloads sortiert werden soll.
  3. Änderungen im Code und in den Kommentaren
    Ersetzen Sie den Code und die Kommentare im folgenden Abschnitt. Betrachten Sie es als einen einzelnen Block.
    // Dateipfade und ihre letzten Aktualisierungsdaten abrufen (sortiert in absteigender Reihenfolge des Datums)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Diesen Fehler im Log ausgeben und entscheiden, ob der Vorgang fortgesetzt oder abgebrochen werden soll
            echo "Fehler: Datei existiert nicht - $path<br>";
        }
    }
    
    // Sortieren in absteigender Reihenfolge nach dem letzten Aktualisierungsdatum (neuestes Datum zuerst)
    arsort($filePathsAndDates);
    
    // Das Array der sortierten Dateipfade neu erstellen
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Kopieren Sie den Ersetzungscode und die Kommentare
    // Array, das die Gesamtzahl der Downloads speichert
    $totalDownloads = array();
    
    // Den Dateipfad und die Gesamtzahl der Downloads abrufen
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // Summiere die Anzahl der Downloads für jede Zeile
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
            // Gesamtzahl der Downloads in einem Array speichern
            $totalDownloads[$key] = $total;
        } else {
            // Diesen Fehler in das Protokoll ausgeben und entscheiden, ob der Prozess fortgesetzt oder abgebrochen werden soll
            echo "Fehler: Datei existiert nicht - $path";
        }
    }
    
    // Nach Gesamtzahl der Downloads in absteigender Reihenfolge sortieren
    arsort($totalDownloads);
    
    // Das sortierte Array von Dateipfaden neu erstellen
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Neue Dateien erstellen und installieren
    1. Um beim Erstellen mehrerer Seiten Fehler beim einheitlichen Festlegen von Elementen beim Hinzufügen von Inhalten zu vermeiden, erstellen Sie den Code für den Teil darunter in einer externen Datei und laden Sie ihn mit separatem Code in den aktuell implementierten Teil. Bitte erstellen Sie eine externe Datei mit einem Namen wie „config.php“.
    // Konfiguration der herunterzuladenden Dateien. Wenn es mehrere Dateien gibt, fügen Sie diese als '2', '3', '4' usw. hinzu. Auch '0' ist gültig.
    // Verwenden Sie "http:" oder "https:" für das Protokoll.
    $targetFiles = array(
        '1' => 'IhreURL/Dateiname.zip',
        '2' => 'IhreURL/Dateiname.pdf',
        '3' => 'IhreURL/Dateiname.pdf',
        '4' => 'IhreURL/Dateiname.pdf',
    );
  6. Kopieren Sie den Beispielabschnitt mit dem Namen „config.php“.
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Machen Sie nur diesen Teil zu einer externen Datei und laden Sie sie mit „include __DIR__ . '/config.php';“ in die von Ihnen verwendete Seite.
    // Konfiguration der herunterzuladenden Dateien. Wenn es mehrere Dateien gibt, fügen Sie diese als '2', '3', '4' usw. hinzu. Auch '0' ist gültig.
    // Verwenden Sie "http:" oder "https:" für das Protokoll.
    $targetFiles = array(
        '1' => 'IhreURL/Dateiname.zip',
        '2' => 'IhreURL/Dateiname.pdf',
        '3' => 'IhreURL/Dateiname.pdf',
        '4' => 'IhreURL/Dateiname.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Code zum Laden externer Dateien und wo sie abgelegt werden
    1. Fügen Sie die mit einem Namen wie "config.php" erstellte Datei an der folgenden Stelle mit dem Code "include __DIR__ . '/config.php';"
    2. Kommentieren Sie den folgenden Abschnitt aus oder löschen Sie ihn und ersetzen Sie ihn durch den Code "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'IhreURL/Dateiname.zip',
    //    '2' => 'IhreURL/Dateiname.pdf',
    //    '3' => 'IhreURL/Dateiname.pdf',
    //    '4' => 'IhreURL/Dateiname.pdf',
    //);
  8. Kopieren Sie den zu ersetzenden Code
    include __DIR__ . '/config.php';
《 PHP-Code zum Erstellen des Download-Zählers 》
Speichern Sie die Datei mit der Erweiterung ".php".

<?php
//***************************************************************************************************
// PHP-Programm zum Zählen von Downloads und Anzeigen des Download-Verlaufs
// [Jedermanns Wissen Ein Wenig Nützliches Buch]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// Veröffentlicht: 28. Januar 2024
//
// Überblick:
// Dieses Programm ist ein System zur Verfolgung der Historie von Dateidownloads, ausgestattet mit Benutzerauthentifizierungsfunktionen.
// Es enthält Funktionen wie die Säuberung von Eingabedaten, die Erstellung von Log-Dateien und die Anzeige von Download-Statistiken.
// Sie können es frei verwenden, einschließlich der Modifikation des Codes und der Änderung des Seitenlayouts.
//
// Hinweis:
// Bevor Sie die Seite mit den Download-Links hochladen, stellen Sie sicher, dass Sie den Abschnitt "$targetFiles = array()" dieser Datei konfigurieren
// und laden Sie diese Seite vor der Seite mit den Download-Links hoch.
// Andernfalls könnten Benutzer beim Versuch, zu downloaden, möglicherweise nicht erfolgreich sein, da diese Seite die Dateien zum Herunterladen setzt und darauf verweist.
//
// Konfiguration und Hinweise:
// ① Das Passwort ist auf "admin" eingestellt, ändern Sie es jedoch in eine gewünschte Zeichenfolge.
// ② Das "log"-Verzeichnis zum Speichern von Log-Dateien wird automatisch beim ersten Hochladen generiert.
// Wenn jedoch Nachrichten wie "Verzeichnis nicht gefunden" auftreten, laden Sie es bitte separat hoch.
// ③ Nach dem ersten Hochladen zeigt die Historie "Datum" und die Zahl "0".
// Dies liegt daran, dass Log-Dateien wie "count_1.log" mit dem Hochladedatum gleichzeitig im automatisch erstellten "log"-Verzeichnis generiert werden.
// Falls dies ein Anliegen ist, greifen Sie auf den Remote-Server zu, laden Sie Dateien wie "count_1.log" herunter, löschen Sie die Daten und laden Sie sie dann hoch.
// ④ Bei der Anzeige mehrerer Tabellen auf einer Seite in der Historienanzeige können Sie wählen, ob Sie das Array in [$targetFiles = array] beibehalten oder sie in chronologischer Reihenfolge anzeigen möchten.
// ⑤ In der Historienanzeige können Sie wählen, ob Sie die Domain 1) beim Anzeigen der Datei oder 2) nur beim Anzeigen des Dateinamens einschließen möchten.
//
// [Format des Links auf der Seite mit Download-Links]
// [Beispiel] <a href="/download_history/count.php?download=Registrierte Nummer" download="HeruntergeladenerDateiname.zip" target="_blank">[Beliebige Zeichenfolge]</a>
// ① Passen Sie die Nummer in "download=1" auf die in "$targetFiles = array()" festgelegte Nummer an.
// ② Passen Sie den Pfad an, um zu Ihrer Seite zu passen.
//
// [Code (JavaScript) zum Anzeigen der Historie in einer Zeile auf der Seite, auf der der Download-Link platziert ist]
// [Beispiel] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Passen Sie die Nummer in "dsp_count=1" auf die in "$targetFiles = array()" festgelegte Nummer an.
// ② Wenn Sie "&day_dsp=on" entfernen, wird nur das "Gesamt" ohne "heute" und "gestern" angezeigt.
// ③ Passen Sie den Pfad an, um zu Ihrer Seite zu passen.
//***************************************************************************************************

// Konfiguration der herunterzuladenden Dateien. Wenn es mehrere Dateien gibt, fügen Sie diese als '2', '3', '4' usw. hinzu. Auch '0' ist gültig.
// Verwenden Sie "http:" oder "https:" für das Protokoll.
$targetFiles = array(
    '1' => 'IhreURL/Dateiname.zip',
    '2' => 'IhreURL/Dateiname.pdf',
    '3' => 'IhreURL/Dateiname.pdf',
    '4' => 'IhreURL/Dateiname.pdf',
);

// Zeichencodierung für die HTML-Ausgabe festlegen
header("Content-Type: text/html; charset=utf-8");

// Zeichencodierung auf der Seite, die den Download-Verlauf anzeigt
// Auf 'SJIS' für Shift-JIS oder 'EUC-JP' für EUC-JP setzen
$encodingType = 'UTF-8';

// Benutzerauthentifizierungsinformationen und andere Einstellungen definieren
$userid = 'admin';   // Benutzer-ID (ersetzen Sie 'admin' durch eine beliebige Zeichenfolge)
$password = 'admin'; // Passwort (ersetzen Sie 'admin' durch eine beliebige Zeichenfolge)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Verwenden Sie password_hash(), um einen Hash-Wert zu generieren
$dataLogDir = 'log/'; // Das 'log'-Verzeichnis wird automatisch von diesem Programm generiert. Wenn nicht erstellt, laden Sie ein Verzeichnis namens 'log' separat hoch

// Wählen Sie aus, ob die Domain beim Anzeigen des Dateinamens enthalten sein soll oder nicht
$includeDomain = 1;  // 1: Anzeigen des Domainnamens, 0: Nur den Dateinamen anzeigen

// Wählen Sie aus, ob das ursprüngliche Array durch ein neues Array ersetzt werden soll, das in der Reihenfolge der neuen Logs sortiert ist, wenn auf einer Seite mehrere Tabellen angezeigt werden
$sortTables = 1;  // 1: Sortieren, 0: Nicht sortieren

$dir = 'log'; // Verzeichnis zum Speichern von Log-Dateien und Download-Verlauf

// Die Domain Ihrer Seite abrufen
$domain = $_SERVER['HTTP_HOST'];

// Sitzungsverwaltung: Vor Sitzungsentführung schützen und session_set_cookie_params() verwenden
session_set_cookie_params(0, '/', $domain, true, true); // Setzen von HttpOnly- und Secure-Flaggen
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Passwort-Hashing: Verwenden von password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Den neuen Hash-Wert in einer Datenbank speichern, etc.
}

// Verzeichnis erstellen, falls es nicht existiert
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Anzeigen, wenn das Verzeichnis nicht erstellt werden kann
        echo 'Bitte erstellen Sie das Verzeichnis "' . $dataLogDir . '" und laden Sie es separat hoch.';
    }
}

// Überprüfen, ob das Log-Verzeichnis beschreibbar ist
if (!is_writable($dataLogDir)) {
    die('Das Verzeichnis "' . $dataLogDir . '" existiert entweder nicht oder hat keine Schreibberechtigungen. Bitte erstellen Sie das Verzeichnis und setzen Sie die Berechtigungen korrekt (z.B. 755).');
}

// Das Basisdatum und das Datum von gestern abrufen
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Funktion zum Abrufen des Wochentags aus einem Datum
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');
    return $weekDays[$dayOfWeek];
}

// Den Dateipfad für jede Zieldatei festlegen und eine Log-Datei erstellen, falls sie nicht existiert
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Log-Datei erstellen, falls sie nicht existiert
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Dateipfade und ihre letzten Aktualisierungsdaten abrufen (sortiert in absteigender Reihenfolge des Datums)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Diesen Fehler im Log ausgeben und entscheiden, ob der Vorgang fortgesetzt oder abgebrochen werden soll
        echo "Fehler: Datei existiert nicht - $path<br>";
    }
}

// Sortieren in absteigender Reihenfolge nach dem letzten Aktualisierungsdatum (neuestes Datum zuerst)
arsort($filePathsAndDates);

// Das Array der sortierten Dateipfade neu erstellen
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Bedingt wählen, ob die sortierten Pfade für die Sortierung verwendet werden sollen
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// JavaScript-Code an den Client zurückgeben (dynamische Anzeige der Download-Zählungen)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Den Header als JavaScript-Datei setzen
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"Parameter muss eine Halbbreitenzahl sein\")";
        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]);
        }
    }

    // Wenn die Option zur Anzeige des Datums EIN ist, inklusive des Datums anzeigen
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Gesamtzahl der Downloads: <strong>{$total}</strong>[<span class="count_today">Heute: <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Gestern: <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Wenn die Option zur Anzeige des Datums AUS ist, nur die Gesamtanzahl der Downloads anzeigen
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Gesamtzahl der Downloads: {$total}</p>')
EOF;
    }

    // Wenn die Zeichenkodierung nicht UTF-8 ist, umwandeln
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Verarbeitung, wenn ein Dateidownload angefordert wird
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Beenden, wenn die Datei-ID keine Zahl ist oder wenn die Datei-ID nicht existiert
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Falscher numerischer Parameter');
    }

    // Datei öffnen und sperren
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Fehler beim Öffnen der Datei');
    }

    flock($fp, LOCK_EX);

    // Die Protokolldatei lesen und in einem Array speichern
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Die Datei abschneiden und eine neue Datumszeile am Anfang hinzufügen
    ftruncate($fp, 0);
    rewind($fp);

    // Eine neue Datumszeile am Anfang hinzufügen, falls sie nicht existiert
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Jede Zeile in der Datei verarbeiten
    foreach ($line as $val) {
        // Den Download-Zähler für das aktuelle Datum erhöhen
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Den Puffer leeren und die Sperre freigeben
    fflush($fp);
    flock($fp, LOCK_UN);

    // Die Datei schließen
    fclose($fp);

    // Den Ausgabepuffer leeren
    ob_end_clean();

    // Den Dateidownload durchführen
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Sitzung starten, die Sitzung zerstören, wenn Logout angefordert wird
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // Die Passwort-Hash-Funktion verwenden, um einen Hash-Wert zu generieren
    // Anmeldeverarbeitung
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Hash-Werte für die Authentifizierung vergleichen
        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 {
            // Verarbeitung bei Authentifizierungsfehler
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">Falsche Benutzer-ID oder falsches Passwort.</div>';
        }
    }

  // Wenn die Authentifizierung nicht erfolgreich ist, wird der Anmeldebildschirm angezeigt
if ($_SESSION['auth'] !== TRUE) {
    ?>
    <!DOCTYPE html>
    <html lang="de">
    <head>
        <meta charset="utf-8">
        <meta name="robots" content="NOINDEX,NOFOLLOW">
        <title>Download-Verlauf Anmeldeseite</title>
        <!-- Anmeldebildschirm-Stile (nach Bedarf anpassbar)-->
        <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">【Download-Verlauf anzeigen】</p>
                <?php if (isset($loginError)): ?>
                    <!-- Fehlermeldung anzeigen, wenn die Variable $loginError gesetzt ist -->
                    <p style="color: crimson;"><?php echo $loginError; ?></p>
                <?php endif; ?>
                <label for="userid">Benutzer-ID:</label>
                <input type="text" id="userid" name="userid" required>
                <label for="password">Passwort:</label>
                <input type="password" id="password" name="password" required>
                <?php
                    // Vorausgesetzt, $showPassword ist eine PHP-Variable, die bestimmt, ob das Passwort zu Beginn angezeigt werden soll
                    echo '<label class="passwordshow" for="showPassword">[Passwort anzeigen]<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>

<!-- Die Sichtbarkeit des Passworts steuern -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // Wenn ausgewählt, wird das Passwort angezeigt
      passwordInput.type = 'text';
    } else {
      // Abwählen, um das Passwort zu verbergen
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // Wenn angemeldet, wird die Seite mit dem Download-Verlauf angezeigt
  ?>
  <!DOCTYPE html>
  <html lang="de">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Download-Verlauf</title>
    <!-- Stil für die Anzeige des Download-Verlaufs (nach Bedarf anpassbar) -->
    <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">【Download-Verlauf】 【<a href="?logout=true">Abmelden</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;

            // Nur lesen, wenn die Datei existiert
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Überprüfen, ob $lineArray[1] ein numerischer Wert ist
                $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">Gesamtzahl: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// Funktion zum Säubern aller Elemente in einem Array
function sanitize($arr)
{
  // Wenn es sich um ein Array handelt, die Säuberung rekursiv anwenden
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // NULL-Zeichen aus Zeichenketten entfernen
  return str_replace("\0", "", $arr);
}

// Erstellen Sie eine neue Protokolldatei, wenn sie nicht existiert
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);

    // Dateiberechtigungen setzen
    chmod($filePath, 0666);
  } else {
  }
}
Speichern Sie die Datei mit der Erweiterung ".php".

Damit endet die Einführung des PHP-Codes für das "Download-Zähler/Programm zur Anzeige des Download-Verlaufs." Wir hoffen, dass es Ihnen nützlich ist.

Es könnten Fehler in der Formulierung vorhanden sein, da dies eine Übersetzung aus der japanischen Version ist. Wir entschuldigen uns für eventuelle Unannehmlichkeiten, aber wenn Fehler in der Formulierung im Code auftreten, korrigieren oder passen Sie diese bitte selbst an.

Ihr Feedback zur Verwendung dieses Codes wird geschätzt. Beachten Sie, dass ich keine Fragen beantworten kann.

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

Last updated : 2024/04/23