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

Kaunter Muat Turun
Program Paparan Sejarah Muat Turun
= Muat Turun dan Pasang Kod PHP =
Contoh Kaunter Muat Turun

Pengenalan:

Ini adalah pengenalan kepada program yang membolehkan anda mengetahui bilangan muat turun apabila pengguna laman web memuat turun dan menggunakan suatu program. Anda boleh menetapkan penanda muat turun pada laman tersebut, dan pentadbir laman juga boleh dengan mudah memeriksa sejarah muat turun di pelayar.

[Contoh Dipasang pada Laman]
Jumlah Muat Turun:1865[Hari Ini:23 Semalam:76
[Contoh Dibuka dalam Pelayar]
Nota: Jika laman dengan pautan muat turun menunjukkan mesej meminta penyimpanan fail dan ditutup tanpa memulakan muat turun, ia masih akan diira sebagai muat turun. Ini kerana ia mengira bilangan klik pautan.
Petunjuk Muat Turun:

Daripada laman ini, muat turun fail "zip" yang dimampatkan dari program dan pasang pada laman anda sendiri. Fail tersebut dinamakan "count.php", tetapi anda boleh mengubahnya.

Anda bebas untuk menggunakan dan mengubahsuai kod, termasuk mengubahsuai reka bentuk laman.

Sila ubahsuai kod untuk menambah fungsi baru atau menukar reka bentuk untuk mencipta laman yang mudah difahami dan digunakan.

 Muat Turun Program PHP:

Petunjuk Pemasangan:

Unzip fail "count.php.zip" yang dimuat turun, dan fail bernama "count.php" akan dibuat. Sila cipta direktori seperti "sejarah_muat_turun" dan simpan di sana.

「Fail "zip" mengandungi hanya satu fail, "count.php," dan "skrin log masuk" untuk pentadbir dijana secara automatik.

Tetapan:

Ini adalah kaedah tetapan utama. Bahagian-bahagian utama ini juga disenaraikan dalam fail PHP.

  1. Tetapan Kata Laluan:
    1. Kata laluan mesti ditetapkan untuk halaman pentadbir.
    2. Kata laluan asal adalah "admin", tetapi ubahnya kepada sebarang rentetan pilihan anda.
    3. Untuk meningkatkan keselamatan, tetapkan kata laluan yang kuat.
  2. Menetapkan Fail untuk Dimuat Turun:
    1. Lengkapkan tetapan untuk "$targetFiles = array()".
    2. Ini adalah bahagian seperti "'1' => 'URL/anda/nama fail.zip',".
  3. Direktori untuk Menyimpan Fail Log:
    1. Satu direktori bernama "log" diperlukan pada pelayan jauh untuk menyimpan fail log yang merakam sejarah.
    2. Program ini secara automatik mencipta direktori yang dipanggil "log" apabila anda muat naik untuk kali pertama. Walau bagaimanapun, jika anda menerima mesej seperti "Tiada direktori", sila cipta dan muat naik secara berasingan.
  4. Paparan Sejarah Muat Naik Pertama:
    1. Apabila muat naik untuk kali pertama, "tarikh" dan nombor "0" mungkin dipaparkan dalam sejarah.
    2. Ini kerana fail log seperti "count_1.log" yang mengandungi tarikh muat naik juga dijana dalam direktori "log" yang dihasilkan secara automatik.
    3. Jika ini mengganggu anda, muat turun fail seperti "count_1.log" dari pelayan jauh, padam data, dan muat naik semula.
    4. Walau bagaimanapun, keadaan "tarikh" dan "0" juga mungkin sejarah bermula apabila penanda itu dihidupkan. Jika terdapat muat turun pada hari tersebut, ia akan diira sebagai muat turun.
  5. Paparan Halaman Paparan Pentadbir:
    1. Apabila pentadbir melihat laman, anda boleh memilih sama ada untuk papar URL atau hanya nama fail.
    2. Jika beberapa jadual sejarah diletakkan pada satu laman, anda boleh memilih untuk menyimpan mereka dalam susunan yang ditetapkan oleh "$targetFiles = array()" atau mengurutkannya mengikut susunan tarikh apabila log baru berlaku.
  6. Reka Bentuk Laman, CSS, dan lain-lain:
    1. Sila sesuaikan reka bentuk laman, CSS, dan lain-lain yang sesuai untuk membuat laman mudah dibaca.
    2. Pada satu ketika, CSS ditulis sebagai fail luaran, tetapi kini ditulis pada halaman yang sama supaya anda boleh merujuk kepada tag ketika menukar CSS.
  7. Penetapan Pautan Muat Turun pada Laman:
    1.  Biasanya, tag muat turun <a> ditulis seperti berikut:
      <a href="/download_history/sample.zip" download="ダウンロードした際のファイル名.zip">[Rentetan sewenang-wenang]</a>
    2. Dalam program ini, tulis tag muat turun <a> seperti berikut:
    3. [Contoh]Salin
      <a href="/download_history/count.php?download=1" download="Nama fail semasa memuat turun.zip" target="_blank">[Rentetan sewenang-wenang]</a>
    4. Padankan nombor dalam "download=1" kepada nombor yang ditetapkan dalam "$targetFiles = array()". Tetapan ini merujuk kepada fail yang akan dimuat turun.
    5. Sila padankan laluan ke laman anda.
    6. Sila muat naik laman dengan pautan muat turun selepas memuat naik fail dengan "$targetFiles = array()" (dalam contoh ini, "count.php").
  8. Kod untuk Paparan Sejarah dalam Satu Baris:
    1. Cipta JavaScript berikut dan letakkan di laman yang anda ingin paparkan:
    2. [Contoh]Salin
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Padankan nombor dalam "dsp_count=1" kepada nombor yang ditetapkan dalam "$targetFiles = array()".
    4. Jika anda memadam "&day_dsp=on," hanya jumlah "keseluruhan" akan dipaparkan tanpa paparan "hari ini/semalam".
    5. Jumlah Muat Turun:1865[Hari Ini:23 Semalam:76
      Jumlah Muat Turun:1865
    6. Sila padankan laluan ke laman anda.
Tentang Tetapan Sambungan

Apabila memaparkan beberapa jadual, tetapan lalai program adalah untuk mengurutkan mengikut masa kemaskini terkini. Jika anda ingin mengurutkan mengikut jumlah muat turun keseluruhan, cipta fail baru seperti "total_downloads.php" dan gantikan bahagian berikut.

  1. Perubahan dalam komen
    Gantikan komen dalam bahagian berikut:
    // Pilih sama ada untuk menggantikan array asal dengan yang baru yang disusun mengikut urutan log baru apabila memaparkan beberapa jadual pada satu laman
  2. Salin komen gantian
    // Jika memaparkan beberapa jadual pada laman, pilih sama ada untuk menggantikan array asal dan mengurutkan mengikut jumlah muat turun keseluruhan.
  3. Perubahan kod dan komen
    Gantikan kod dan komen dalam bahagian berikut. Harap dianggap sebagai satu blok.
    // Dapatkan laluan fail dan tarikh kemaskini terkini mereka (disusun mengikut turutan menurun tarikh)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Paparkan ralat ini ke log dan tentukan sama ada untuk terus atau menghentikan proses
            echo "Ralat: Fail tidak wujud - $path<br>";
        }
    }
    
    // Susun mengikut turutan menurun oleh tarikh kemaskini terakhir (tarikh baru terlebih dahulu)
    arsort($filePathsAndDates);
    
    // Membina semula array laluan fail yang disusun
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Salin kod gantian dan ulasan
    // Array yang menyimpan jumlah muat turun keseluruhan
    $totalDownloads = array();
    
    // Dapatkan laluan fail dan jumlah muat turun keseluruhan
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
           // Jumlahkan jumlah muat turun untuk setiap baris
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
           // Simpan jumlah muat turun keseluruhan dalam array
            $totalDownloads[$key] = $total;
        } else {
           // Keluarkan ralat ini ke log dan tentukan sama ada untuk terus atau menghentikan proses
            echo "Ralat: Fail tidak wujud - $path";
        }
    }
    
    // Urutkan mengikut jumlah muat turun keseluruhan dalam turun padanan
    arsort($totalDownloads);
    
    // Membina semula array laluan fail yang diurutkan
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Penciptaan Fail dan Persediaan
    1. Apabila membuat beberapa halaman, untuk mengelakkan kesilapan dalam menetapkan perkara semasa menambah kandungan secara seragam, cipta bahagian kod berikut sebagai fail luaran, dan muatkan ke dalam bahagian yang dilaksanakan ketika ini dengan kod yang berbeza. Cipta fail luaran dengan nama seperti "config.php".
    // Konfigurasi fail untuk dimuat turun. Jika terdapat beberapa fail, tambahkan sebagai '2', '3', '4', dan lain-lain. Juga, '0' adalah sah.
    // Gunakan "http:" atau "https:" untuk protokol.
    $targetFiles = array(
        '1' => 'URLAnda/NamaFail.zip',
        '2' => 'URLAnda/NamaFail.pdf',
        '3' => 'URLAnda/NamaFail.pdf', 
        '4' => 'URLAnda/NamaFail.pdf',
    );
  6. Salin contoh bahagian untuk dinamakan "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Buat hanya bahagian ini sebagai fail luaran dan muatkan ke laman yang anda gunakan dengan "include __DIR__ . '/config.php';"
    // Konfigurasi fail untuk dimuat turun. Jika terdapat beberapa fail, tambahkan sebagai '2', '3', '4', dan lain-lain. Juga, '0' adalah sah.
    // Gunakan "http:" atau "https:" untuk protokol.
    $targetFiles = array(
        '1' => 'URLAnda/NamaFail.zip',
        '2' => 'URLAnda/NamaFail.pdf',
        '3' => 'URLAnda/NamaFail.pdf', 
        '4' => 'URLAnda/NamaFail.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Kod untuk muatkan fail luaran dan penempatannya
    1. Sertakan fail yang dicipta dengan nama seperti "config.php" di lokasi berikut dengan kod "include __DIR__ . '/config.php';".
    2. Komenkan atau padam bahagian berikut dan gantikan dengan kod "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'URLAnda/NamaFail.zip',
    //    '2' => 'URLAnda/NamaFail.pdf',
    //    '3' => 'URLAnda/NamaFail.pdf', 
    //    '4' => 'URLAnda/NamaFail.pdf',
    //);
  8. Salin kod untuk gantikan
    include __DIR__ . '/config.php';
《Kod PHP untuk Mencipta Kaunter Muat Turun》
Simpan fail dengan sambungan ".php".

<?php
//***************************************************************************************************
// Program Muat Turun dan Penyemak Sejarah Muat Turun PHP
// [Buku Sedikit Berguna Pengetahuan Semua Orang]
//        Minna no Chishiki Chotto Benricho
//        みんなの知識 ちょっと便利帳
// https://www.benricho.org/Tips/download_history/
// Dikeluarkan: 10 Februari 2024
//
// Gambaran Keseluruhan:
// Program ini adalah sistem untuk mengesan sejarah muat turun fail, dilengkapi dengan fungsi pengesahan pengguna.
// Ia termasuk ciri-ciri seperti sanitasi data input, penciptaan fail log, dan paparan statistik muat turun.
// Anda bebas untuk menggunakannya, termasuk memodifikasi kod dan menukar reka bentuk laman.
//
// Nota:
// Sebelum memuat naik laman yang mengandungi pautan muat turun, pastikan untuk mengkonfigurasi bahagian "$targetFiles = array()" file ini,
// dan muat naik laman ini sebelum laman dengan pautan muat turun.
// Kegagalan untuk berbuat demikian mungkin akan menyebabkan pengguna tidak dapat memuat turun semasa cubaan, kerana laman ini menetapkan dan merujuk fail yang akan dimuat turun.
//
// Konfigurasi dan Nota:
// ① Kata laluan ditetapkan kepada "admin," tetapi sila tukar kepada mana-mana rentetan yang dikehendaki.
// ② Direktori "log" untuk menyimpan fail log secara automatik dihasilkan semasa muat naik pertama.
// Walau bagaimanapun, jika anda mengalami mesej seperti "direktori tidak dijumpai," sila muat naiknya secara berasingan.
// ③ Semasa muat naik pertama, paparan sejarah menunjukkan "tarikh" dan nombor "0."
// Ini kerana fail log seperti "count_1.log" dengan tarikh muat naik juga dihasilkan serentak dalam direktori "log" yang dibuat secara automatik.
// Jika ini merupakan kebimbangan, akses pelayan jauh, muat turun fail seperti "count_1.log," padam data, dan kemudian muat naik semula.
// ④ Apabila memaparkan beberapa jadual pada satu laman dalam paparan sejarah, anda boleh memilih sama ada untuk mengekalkan array asal yang ditetapkan dalam [$targetFiles = array] atau memaparkannya mengikut urutan kronologi.
// ⑤ Dalam paparan sejarah, anda boleh memilih sama ada untuk merangkumi domain dalam 1) paparan fail atau 2) hanya menunjukkan nama fail.
//
// [Format Pautan pada Laman dengan Pautan Muat Turun]
// [Contoh] <a href="/download_history/count.php?download=Nombor Berdaftar" download="NamaFailYangDimuatTurun.zip" target="_blank">[Rentetan Suka Hati]</a>
// ① Sesuaikan nombor dalam "download=1" dengan nombor yang ditetapkan dalam "$targetFiles = array()".
// ② Sesuaikan laluan untuk sepadan dengan laman anda.
//
// [Kod (JavaScript) untuk memaparkan sejarah dalam satu baris pada laman di mana pautan muat turun diletakkan]
// [Contoh] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Sesuaikan nombor dalam "dsp_count=1" dengan nombor yang ditetapkan dalam "$targetFiles = array()".
// ② Jika anda membuang "&day_dsp=on," ia hanya akan memaparkan "jumlah keseluruhan" tanpa "hari ini" dan "semalam".
// ③ Sesuaikan laluan untuk sepadan dengan laman anda.
//***************************************************************************************************

// Konfigurasi fail untuk dimuat turun. Jika terdapat beberapa fail, tambahkan sebagai '2', '3', '4', dan lain-lain. Juga, '0' adalah sah.
// Gunakan "http:" atau "https:" untuk protokol.
$targetFiles = array(
    '1' => 'URLAnda/NamaFail.zip',
    '2' => 'URLAnda/NamaFail.pdf',
    '3' => 'URLAnda/NamaFail.pdf',
    '4' => 'URLAnda/NamaFail.pdf',
);

// Tetapkan kod enkoding aksara untuk output HTML
header("Content-Type: text/html; charset=utf-8");

// Enkoding aksara pada laman yang memaparkan sejarah muat turun
$encodingType = 'UTF-8';

// Tetapkan maklumat pengesahan pengguna dan tetapan lain
$userid = 'admin';   // ID Pengguna (gantikan 'admin' dengan rentetan apa pun)
$password = 'admin'; // Kata Laluan (gantikan 'admin' dengan rentetan apa pun)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Gunakan password_hash() untuk menghasilkan nilai hash
$dataLogDir = 'log/'; // Direktori 'log' dihasilkan secara automatik oleh program ini. Jika tidak dihasilkan, muat naik direktori yang dinamakan 'log' secara berasingan

// Pilih sama ada untuk merangkumi domain apabila memaparkan nama fail atau tidak
$includeDomain = 1;  // 1: Paparan termasuk nama domain, 0: Paparan hanya nama fail

// Pilih sama ada untuk menggantikan array asal dengan yang baru yang disusun mengikut urutan log baru apabila memaparkan beberapa jadual pada satu laman
$sortTables = 1;  // 1: Disusun, 0: Tidak disusun

$dir = 'log'; // Direktori untuk menyimpan fail log dan sejarah muat turun

// Dapatkan domain laman anda
$domain = $_SERVER['HTTP_HOST'];

// Pengurusan Sesi: Cegah hijacking sesi dan gunakan session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Tetapkan bendera HttpOnly dan Secure
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Penghasilan Hash Kata Laluan: Gunakan password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Simpan nilai hash baru dalam pangkalan data, dll.
}

// Cipta direktori jika ia tidak wujud
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Paparkan jika kegagalan pembuatan direktori
        echo 'Sila cipta direktori "' . $dataLogDir . '" dan muat naiknya secara berasingan.';
    }
}

// Semak sama ada direktori log boleh ditulis
if (!is_writable($dataLogDir)) {
    die('Direktori "' . $dataLogDir . '" sama ada tidak wujud atau tiada kebenaran menulis. Sila cipta direktori dan tetapkan kebenaran dengan betul (contohnya, 755).');
}

// Dapatkan tarikh asas dan tarikh semalam
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Fungsi untuk mendapatkan hari dalam seminggu dari tarikh
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab');
    return $weekDays[$dayOfWeek];
}

// Tetapkan laluan fail untuk setiap fail sasaran dan cipta fail log jika ia tidak wujud
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Cipta fail log jika ia tidak wujud
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Dapatkan laluan fail dan tarikh kemaskini terkini mereka (disusun mengikut turutan menurun tarikh)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Paparkan ralat ini ke log dan tentukan sama ada untuk terus atau menghentikan proses
        echo "Ralat: Fail tidak wujud - $path<br>";
    }
}

// Susun mengikut turutan menurun oleh tarikh kemaskini terakhir (tarikh baru terlebih dahulu)
arsort($filePathsAndDates);

// Membina semula array laluan fail yang disusun
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Pilih dengan bersyarat sama ada menggunakan laluan yang disusun untuk penyusunan
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Kembalikan kod JavaScript kepada pelanggan (paparan dinamik jumlah muat turun)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Tetapkan tajuk sebagai fail JavaScript
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"Parameter mesti berupa nombor separuh lebar\")";
        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]);
        }
    }

    // Jika pilihan paparan tarikh adalah HIDUP, paparkan termasuk tarikh
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Muat turun keseluruhan: <strong>{$total}</strong>[<span class="count_today">Hari ini : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Semalam : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Jika pilihan paparan tarikh adalah MATI, paparkan hanya jumlah muat turun keseluruhan
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Muat turun keseluruhan: {$total}</p>')
EOF;
    }

    // Jika kod enkoding bukan UTF-8, tukar
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Pemprosesan apabila permintaan muat turun fail diminta
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Keluar jika ID fail bukan nombor atau jika ID fail tidak wujud
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Parameter nombor tidak tepat');
    }

    // Buka fail dan kunci ia
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Gagal membuka fail');
    }

    flock($fp, LOCK_EX);

    // Baca fail log dan simpan dalam array
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Pemangkasan fail dan tambah baris tarikh baru di awal
    ftruncate($fp, 0);
    rewind($fp);

    // Tambah baris tarikh baru di awal jika tidak wujud
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Proses setiap baris dalam fail
    foreach ($line as $val) {
        // Tingkatkan jumlah muat turun untuk tarikh semasa
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Buang penimbal dan bebaskan kunci
    fflush($fp);
    flock($fp, LOCK_UN);

    // Tutup fail
    fclose($fp);

    // Kosongkan penimbal output
    ob_end_clean();

    // Lakukan muat turun fail
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Mulakan sesi, musnahkan sesi jika log keluar diminta
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // Gunakan fungsi hash kata laluan untuk menghasilkan nilai hash
    // Pemprosesan log masuk
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Bandingkan nilai hash untuk pengesahan
        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 {
            // Pemprosesan bagi kegagalan pengesahan
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">ID Pengguna atau kata laluan tidak tepat.</div>';
        }
    }

    // Jika pengesahan tidak berjaya, paparkan skrin log masuk
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>Skrin Log Masuk Sejarah Muat Turun</title>
            <!-- Gaya skrin log masuk (boleh diubah suai mengikut keperluan)-->
            <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">【Lihat Sejarah Muat Turun】</p>
                    <?php if (isset($loginError)): ?>
                        <!-- Paparkan mesej ralat jika pembolehubah $loginError ditetapkan -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">ID Pengguna:</label>
                    <input type="text" id="userid" name="userid" required>
                    <label for="password">Kata Laluan:</label>
                    <input type="password" id="password" name="password" required>
                    <?php
                        // Menganggap $showPassword adalah pembolehubah PHP yang menentukan sama ada untuk menunjukkan kata laluan pada mulanya
                        echo '<label class="passwordshow" for="showPassword">[Tunjukkan Kata Laluan]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ?

 'checked' : '') . '></div></label>';
                    ?>
                    <button type="submit" name="login_submit">Log Masuk</button>
                </form>   
            </div>

<!-- Kawal kelihatan kata laluan -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // Jika diperiksa, kata laluan akan ditunjukkan
      passwordInput.type = 'text';
    } else {
      // Batal pilihan untuk menyembunyikan kata laluan
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // Jika log masuk, paparkan halaman sejarah muat turun
  ?>
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Sejarah Muat Turun</title>
    <!-- Gaya paparan sejarah muat turun (boleh diubah suai mengikut keperluan) -->
    <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">【Sejarah Muat Turun】 【<a href="?logout=true">Log Keluar</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">Tarikh</th>
            <th class="tableheader">Muat Turun</th>
          </tr>
          <?php	  
            $totalDownload = 0;

            // Baca hanya jika fail wujud
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Periksa jika $lineArray[1] adalah nilai nombor
                $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">Jumlah: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// Fungsi untuk menyucikan semua elemen dalam suatu array
function sanitize($arr)
{
  // Jika ia adalah array, terapkan penyingkiran secara rekursif
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // Alihkan aksara NULL dari dalam rentetan
  return str_replace("\0", "", $arr);
}

// Cipta fail log baru jika tidak wujud
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);

    // Tetapkan kebenaran fail
    chmod($filePath, 0666);
  } else {
  }
}
Simpan fail dengan sambungan ".php".
Ini mengakhiri pengenalan kod PHP untuk "Kaunter Muat Turun/Program Paparan Sejarah Muat Turun." Kami harap anda mendapat manfaat daripadanya.

Mungkin terdapat kesalahan dalam pilihan perkataan kerana ia adalah terjemahan dari versi Jepun. Kami memohon maaf atas kesulitan ini, tetapi jika terdapat kesalahan dalam perkataan dalam kod, sila betulkan atau sesuaikan sendiri.

Maklum balas anda tentang penggunaan kod ini dihargai. Sila ambil perhatian bahawa saya tidak dapat menjawab soalan.

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

Last updated : 2024/02/05