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

Contador de Downloads
Programa de Visualização de Histórico de Downloads
= Baixar e Instalar Código PHP =
Sample Download Counter

Introdução:

Esta é uma introdução a um programa que permite saber o número de downloads quando um usuário de uma página da web baixa e usa um programa. É possível configurar um contador de downloads na página, e os administradores do site também podem verificar facilmente o histórico de downloads no navegador.

[Exemplo Instalado na Página]
Downloads totais: 1865 [Hoje: 23 Ontem: 76]
[Exemplo Aberto no Navegador]

Nota: Se uma página com um link de download exibir uma mensagem pedindo para salvar o arquivo e for fechada sem iniciar o download, ainda será contado como um download. Isso ocorre porque ele conta o número de cliques no link.

Instruções de Download:

A partir desta página, baixe o arquivo compactado "zip" do programa e o instale em seu próprio site. O arquivo é chamado "count.php", mas você pode renomeá-lo.

Você tem a liberdade de usar e modificar o código, incluindo a alteração do design da página.

Modifique o código para adicionar novas funções ou alterar o design e criar uma página fácil de entender e usar.

 Download do Programa PHP:
Instruções de Instalação:

Descompacte o arquivo "count.php.zip" baixado, e um arquivo chamado "count.php" será criado. Por favor, crie um diretório como "download_history" e salve-o lá.

O arquivo "zip" contém apenas um arquivo, "count.php", e a "tela de login" para o administrador é gerada automaticamente.

Configurações:

Este é o método principal de configuração. Essas partes principais também estão listadas no arquivo PHP.

  1. Configurações de Senha:
    1. Uma senha deve ser definida para a página do administrador.
    2. A senha padrão é "admin", mas altere para uma string de sua escolha.
    3. Para aumentar a segurança, defina uma senha forte.
  2. Configurar Arquivos para Download:
    1. Complete as configurações para "$targetFiles = array()".
    2. Esta é a parte como "'1' => 'Sua URL/nome do arquivo.zip',".
  3. Diretório para Salvar Arquivos de Log:
    1. Um diretório chamado "log" é necessário no servidor remoto para armazenar arquivos de log que registram o histórico.
    2. Este programa cria automaticamente um diretório chamado "log" quando você faz o upload pela primeira vez. No entanto, se receber uma mensagem como "Sem diretório", crie e faça o upload separadamente.
  4. Exibição do Histórico de Upload na Primeira Vez:
    1. Ao fazer o upload pela primeira vez, a "data" e o número "0" podem ser exibidos no histórico.
    2. Isso ocorre porque arquivos de log como "count_1.log" contendo a data de upload também são gerados no diretório "log" gerado automaticamente.
    3. Se isso incomodar, faça o download de um arquivo como "count_1.log" do servidor remoto, exclua os dados e faça o upload novamente.
    4. No entanto, o estado de "data" e "0" também pode ser um histórico de quando o contador foi iniciado. Se houver um download nesse dia, ele será contado.
  5. Exibição da Página de Visualização do Administrador:
    1. Quando os administradores visualizam a página, você pode escolher se deseja exibir a URL ou apenas o nome do arquivo.
    2. Se várias tabelas de histórico estiverem colocadas em uma página, você pode escolher mantê-las na ordem definida por "$targetFiles = array()" ou ordená-las na ordem da data em que novos logs ocorreram.
  6. Design da Página, CSS, etc.:
    1. Ajuste o design da página, o CSS, etc., conforme necessário para tornar a página fácil de ler.
    2. Em um momento, o CSS era escrito como um arquivo externo, mas agora está escrito na mesma página para que você possa se referir às tags ao alterar o CSS.
  7. Configuração do Link de Download na Página:
    1. Normalmente, a tag de download <a> é escrita da seguinte forma:
      <a href="/download_history/sample.zip" download="File name when downloading.zip">[String Arbitrária]</a>
    2. Neste programa, escreva a tag de download <a> da seguinte forma:
    3. [Exemplo]Copiar
      <a href="/download_history/count.php?download=1" download="File name when downloading.zip" target="_blank">[String Arbitrária]</a>
    4. Faça corresponder o número em "download=1" ao número definido em "$targetFiles = array()". Essa configuração se refere aos arquivos a serem baixados.
    5. Faça corresponder o caminho para sua página.
    6. Faça o upload da página com o link de download após fazer o upload do arquivo com "$targetFiles = array()" (neste exemplo, "count.php").
  8. Código para Exibir o Histórico em Uma Linha:
    1. Crie o seguinte JavaScript e coloque-o na página em que deseja exibi-lo:
    2. [Exemplo]Copiar
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Faça corresponder o número em "dsp_count=1" ao número definido em "$targetFiles = array()".
    4. Se excluir "&day_dsp=on,", apenas o "número total" será exibido sem a exibição "hoje/ontem".
    5. Downloads totais1865 [Hoje: 23 Ontem: 76]
      Downloads totais: 1865
    6. Faça corresponder o caminho para sua página.
Sobre as Configurações de Extensão

Quando exibindo várias tabelas, a configuração padrão deste programa é ordenar pela hora da última atualização. Se deseja ordenar pelo total de downloads, crie um novo arquivo como "total_downloads.php" e substitua a seguinte parte.

  1. Mudanças nos comentários
    Substitua os comentários na seguinte seção:
    // Escolha se deseja substituir a matriz original por uma nova ordenada na ordem dos novos logs ao exibir várias tabelas em uma página
  2. Copie o comentário a ser substituído
    // Se múltiplas tabelas forem exibidas na página, selecione/defina se deseja substituir o array original e classifique em ordem decrescente do número total de downloads.
  3. Mudanças no código e nos comentários
    Substitua o código e os comentários na seguinte seção. Considere como um único bloco.
    // Obtenha os caminhos dos arquivos e suas datas de última atualização (ordenados em ordem decrescente de data)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Saída deste erro para o log e decida se continua ou aborta o processamento
            echo "Erro: Arquivo não existe - $path<br>";
        }
    }
    
    // Classifique em ordem decrescente pela última data de atualização (a data mais recente vem primeiro)
    arsort($filePathsAndDates);
    
    // Reconstrua a matriz de caminhos de arquivo ordenados
    $sortedFilePaths = array();
    foreach ($filePathsAndDates as $key => $date) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  4. Copie o código de substituição e os comentários
    //Array que armazena o número total de downloads
    $totalDownloads = array();
    
    // Obtém o caminho do arquivo e seu número total de downloads
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
            // Soma o número de downloads para cada linha
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
            // Armazena o número total de downloads em um array
            $totalDownloads[$key] = $total;
        } else {
            // Envie este erro para o log e decida se deseja continuar ou abortar o processo
            echo "Erro: o arquivo não existe - $path<br>";
        }
    }
    
    // Classifique pelo total de downloads em ordem decrescente
    arsort($totalDownloads);
    
    // Reconstruir matriz de caminhos de arquivos classificados
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Criação e configuração de arquivos
    1. Ao criar várias páginas, para evitar erros na configuração de itens ao adicionar conteúdo de forma uniforme, crie a seguinte parte do código como um arquivo externo e carregue-o na parte atualmente implementada com um código diferente. Crie um arquivo externo com um nome como "config.php".
    // Configuração de arquivos para download. Se houver vários arquivos, adicione-os como '2', '3', '4', etc. '0' também é válido.
    // Use "http:" ou "https:" para o protocolo.
    $targetFiles = array(
        '1' => 'SuaURL/NomeDoArquivo.zip',
        '2' => 'SuaURL/NomeDoArquivo.pdf',
        '3' => 'SuaURL/NomeDoArquivo.pdf',
        '4' => 'SuaURL/NomeDoArquivo.pdf',
    );
  6. Copie o exemplo da parte a ser nomeada "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Transforme apenas esta parte em um arquivo externo e carregue-o na página que você usa com "include __DIR__ . '/config.php';"
    // Configuração de arquivos para download. Se houver vários arquivos, adicione-os como '2', '3', '4', etc. '0' também é válido.
    // Use "http:" ou "https:" para o protocolo.
    $targetFiles = array(
        '1' => 'SuaURL/NomeDoArquivo.zip',
        '2' => 'SuaURL/NomeDoArquivo.pdf',
        '3' => 'SuaURL/NomeDoArquivo.pdf',
        '4' => 'SuaURL/NomeDoArquivo.pdf',
    );
    ?>
    </body>
    </html>
    
  7. Código para leitura de arquivos externos e onde colocá-los
    1. Inclua o arquivo criado com um nome como "config.php" no seguinte local com o código "include __DIR__ . '/config.php';".
    2. Comente ou exclua a seção a seguir e substitua-a pelo código "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    //    '1' => 'SuaURL/NomeDoArquivo.zip',
    //    '2' => 'SuaURL/NomeDoArquivo.pdf',
    //    '3' => 'SuaURL/NomeDoArquivo.pdf',
    //    '4' => 'SuaURL/NomeDoArquivo.pdf',
    //);
  8. Copie o código a ser substituído
    include __DIR__ . '/config.php';
《 Código PHP para Criar o Contador de Downloads 》
Salve o arquivo com a extensão ".php".

<?php
//***************************************************************************************************
// Contador de Downloads e Visualizador de Histórico de Downloads - Programa PHP
// [Livro Um Pouco Útil do Conhecimento de Todos]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// Lançado em: 28 de janeiro de 2024
//
// Visão Geral:
// Este programa é um sistema para rastrear o histórico de downloads de arquivos, equipado com funcionalidade de autenticação de usuário.
// Inclui recursos como saneamento de dados de entrada, criação de arquivos de log e exibição de estatísticas de downloads.
// Você está livre para usá-lo, incluindo modificar o código e alterar o design da página.
//
// Nota:
// Antes de enviar a página contendo os links de download, certifique-se de configurar a seção "$targetFiles = array()" deste arquivo,
// e faça o upload desta página antes da página com os links de download.
// Falhar em fazer isso pode resultar em usuários incapazes de baixar ao tentar, pois esta página define e referencia os arquivos a serem baixados.
//
// Configuração e Notas:
// ① A senha está definida como "admin", mas por favor, altere para qualquer string desejada.
// ② O diretório "log" para armazenar arquivos de log é gerado automaticamente no primeiro upload.
// No entanto, se encontrar mensagens como "diretório não encontrado", faça o upload separadamente.
// ③ No upload inicial, a exibição do histórico mostra "data" e o número "0".
// Isso ocorre porque os arquivos de log, como "count_1.log" com a data de upload, são gerados simultaneamente no diretório "log" criado automaticamente.
// Se isso for uma preocupação, acesse o servidor remoto, baixe arquivos como "count_1.log", exclua os dados e, em seguida, faça o upload.
// ④ Ao exibir várias tabelas em uma página no histórico, você pode escolher se deseja manter a matriz definida em [$targetFiles = array] ou exibi-los em ordem cronológica.
// ⑤ Na exibição do histórico, você pode escolher se deseja incluir o domínio em 1) exibir o arquivo ou 2) mostrar apenas o nome do arquivo.
//
// [Formato do Link na Página com Links de Download]
// [Exemplo] <a href="/download_history/count.php?download=NúmeroRegistrado" download="NomeDoArquivoBaixado.zip">[Qualquer String]</a>
// ① Ajuste o número em "download=1" para o número definido em "$targetFiles = array()".
// ② Ajuste o caminho para corresponder à sua página.
//
// [Código (JavaScript) para exibir o histórico em uma linha na página onde o link de download é colocado]
// [Exemplo] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① Ajuste o número em "dsp_count=1" para o número definido em "$targetFiles = array()".
// ② Se você remover "&day_dsp=on," ele exibirá apenas o "total" sem "hoje" e "ontem".
// ③ Ajuste o caminho para corresponder à sua página.
//***************************************************************************************************

// Configuração de arquivos para download. Se houver vários arquivos, adicione-os como '2', '3', '4', etc. '0' também é válido.
// Use "http:" ou "https:" para o protocolo.
$targetFiles = array(
    '1' => 'SuaURL/NomeDoArquivo.zip',
    '2' => 'SuaURL/NomeDoArquivo.pdf',
    '3' => 'SuaURL/NomeDoArquivo.pdf',
    '4' => 'SuaURL/NomeDoArquivo.pdf',
);

// Defina a codificação de caracteres para a saída HTML
header("Content-Type: text/html; charset=utf-8");

// Codificação de caracteres na página que exibe o histórico de downloads
// Defina como 'SJIS' para Shift-JIS, 'EUC-JP' para EUC-JP
$encodingType = 'UTF-8';

// Definir informações de autenticação do usuário e outras configurações
$userid = 'admin';   // ID do usuário (substitua 'admin' por qualquer string)
$password = 'admin'; // Senha (substitua 'admin' por qualquer string)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // Use password_hash() para gerar um valor de hash
$dataLogDir = 'log/'; // O diretório 'log' é gerado automaticamente por este programa. Se não for criado, faça o upload de um diretório chamado 'log' separadamente

// Escolha se deseja incluir o domínio ao exibir o nome do arquivo ou não
$includeDomain = 1;  // 1: Exibir incluindo o nome do domínio, 0: Exibir apenas o nome do arquivo

// Escolha se deseja substituir a matriz original por uma nova ordenada na ordem dos novos logs ao exibir várias tabelas em uma página
$sortTables = 1;  // 1: Ordenar, 0: Não ordenar

$dir = 'log'; // Diretório para armazenar arquivos de log e histórico de downloads

// Obtenha o domínio do seu site
$domain = $_SERVER['HTTP_HOST'];

// Gerenciamento de sessão: Evite o sequestro de sessão e use session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Defina as flags HttpOnly e Secure
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Hashing de senha: Use password_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // Salve o novo valor de hash em um banco de dados, etc.
}

// Crie o diretório se ele não existir
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // Exiba se a criação do diretório falhar
        echo 'Por favor, crie o diretório "' . $dataLogDir . '" e faça o upload separadamente.';
    }
}

// Verifique se o diretório de log é gravável
if (!is_writable($dataLogDir)) {
    die('O diretório "' . $dataLogDir . '" não existe ou não possui permissões de gravação. Por favor, crie o diretório e defina as permissões corretamente (por exemplo, 755).');
}

// Obtenha a data base e a data de ontem
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// Função para obter o dia da semana a partir de uma data
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb');
    return $weekDays[$dayOfWeek];
}

// Configure o caminho do arquivo para cada arquivo de destino e crie um arquivo de log se ele não existir
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // Crie o arquivo de log se ele não existir
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// Obtenha os caminhos dos arquivos e suas datas de última atualização (ordenados em ordem decrescente de data)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // Saída deste erro para o log e decida se continua ou aborta o processamento
        echo "Erro: Arquivo não existe - $path<br>";
    }
}

// Classifique em ordem decrescente pela última data de atualização (a data mais recente vem primeiro)
arsort($filePathsAndDates);

// Reconstrua a matriz de caminhos de arquivo ordenados
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// Escolha condicionalmente se deseja usar os caminhos ordenados para ordenar
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// Retorne o código JavaScript para o cliente (exibindo dinamicamente contagens de download)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // Defina o cabeçalho como um arquivo JavaScript
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"O parâmetro deve ser um número de largura de meia\")";
        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]);
        }
    }

    // Se a opção de exibição de data estiver LIGADA, exiba incluindo a data
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">Downloads totais: <strong>{$total}</strong>[<span class="count_today">Hoje : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Ontem : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Se a opção de exibição de data estiver DESLIGADA, exiba apenas a contagem total de downloads
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Downloads totais: {$total}</p>')
EOF;
    }

    // Se a codificação de caracteres não for UTF-8, converta
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// Processamento quando é solicitado o download de um arquivo
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // Saia se o ID do arquivo não for um número ou se o ID do arquivo não existir
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('Parâmetro numérico incorreto');
    }

    // Abrir o arquivo e bloqueá-lo
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('Falha ao abrir o arquivo');
    }

    flock($fp, LOCK_EX);

    // Ler o arquivo de log e armazená-lo em um array
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // Truncar o arquivo e adicionar uma nova linha de data no início
    ftruncate($fp, 0);
    rewind($fp);

    // Adicionar uma nova linha de data no início, se não existir
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // Processar cada linha no arquivo
    foreach ($line as $val) {
        // Incrementar a contagem de downloads para a data atual
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // Limpar o buffer e liberar o bloqueio
    fflush($fp);
    flock($fp, LOCK_UN);

    // Fechar o arquivo
    fclose($fp);

    // Limpar o buffer de saída
    ob_end_clean();

    // Realizar o download do arquivo
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // Inicie a sessão, destrua a sessão se o logout for solicitado
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // Use a função de hash de senha para gerar um valor de hash
    // Processamento de login
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // Compare os valores de hash para autenticação
        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 {
            // Processamento para falha na autenticação
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">ID de usuário ou senha incorreta.</div>';
        }
    }

  // Se a autenticação não for bem-sucedida, exiba a tela de login
if ($_SESSION['auth'] !== TRUE) {
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="robots" content="NOINDEX,NOFOLLOW">
        <title>Tela de Login do Histórico de Downloads</title>
        <!-- Estilos da tela de login (modificáveis conforme necessário)-->
        <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">【Ver Histórico de Downloads】</p>
                <?php if (isset($loginError)): ?>
                    <!-- Exibir mensagem de erro se a variável $loginError estiver definida -->
                    <p style="color: crimson;"><?php echo $loginError; ?></p>
                <?php endif; ?>
                <label for="userid">ID do Usuário:</label>
                <input type="text" id="userid" name="userid" required>
                <label for="password">Senha:</label>
                <input type="password" id="password" name="password" required>
                <?php
                    // Supondo que $showPassword seja uma variável PHP que determina se mostrar a senha inicialmente
                    echo '<label class="passwordshow" for="showPassword">[Mostrar Senha]<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>

        <!-- Controle da visibilidade da senha -->
        <script>
          function togglePasswordVisibility() {
            var passwordInput = document.getElementById('password');
            var showPasswordCheckbox = document.getElementById('showPassword');

            if (showPasswordCheckbox.checked) {
              // Se marcado, a senha será exibida
              passwordInput.type = 'text';
            } else {
              // Desmarque para ocultar a senha
              passwordInput.type = 'password';
            }
          }
        </script>
    </body>
    </html><?php
    exit();
} else {
    // Se estiver logado, exiba a página de histórico de downloads
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="robots" content="NOINDEX,NOFOLLOW">
        <title>Histórico de Downloads</title>
        <!-- Estilo de visualização do histórico de downloads (modificável conforme necessário) -->
        <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">【Histórico de Downloads】 【<a href="?logout=true">Logout</a>】</div> 
        <?php foreach($filePath as $key => $val){ ?>                      
          <div class="log_table">         
            <div class="get_url"><?php echo $includeDomain ? $targetFiles[$key] : basename($targetFiles[$key]); ?></div>
            <table align="center">
              <tr>
                <th class="tableheader">Data</th>
                <th class="tableheader">Downloads</th>
              </tr>
              <?php	  
                $totalDownload = 0;

                // Ler apenas se o arquivo existir
                if (file_exists($val)) {
                  $line = file($val);
                  foreach ($line as $lineVal) {
                    $lineArray = explode(',', $lineVal);

                    // Verifique se $lineArray[1] é um valor numérico
                    $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">Total: <?php echo $totalDownload;?></th>
              </tr>
            </table>
          </div>              
        <?php
                    }
                  }
                }
              ?>
    </body>
    </html><?php
    // Função para sanitizar todos os elementos em uma matriz
    function sanitize($arr)
    {
      // Se for uma matriz, aplique a sanitização recursivamente
      if (is_array($arr)) {
        return array_map('sanitize', $arr);
      }
      // Remova caracteres NULL de dentro das strings
      return str_replace("\0", "", $arr);
    }

    // Crie um novo arquivo de log se ele não existir
    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);

        // Defina as permissões do arquivo
        chmod($filePath, 0666);
      } else {
      }
    }
Salve o arquivo com a extensão ".php".
Isso conclui a introdução do código PHP para o "Contador de Downloads/Programa de Visualização de Histórico de Downloads". Esperamos que seja útil.

Pode haver erros na redação, pois é uma tradução da versão japonesa. Pedimos desculpas por qualquer inconveniente, mas se houver erros na redação do código, corrija ou ajuste você mesmo.

Seu feedback sobre o uso deste código é apreciado. Observe que não posso responder a perguntas.

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

Last updated : 2024/04/23