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 Counter
تحميل برنامج عرض التاريخ
= قم بتنزيل وتثبيت كود PHP =
Sample Download Counter

* يجب تعديل "font-family" في البرنامج لتتناسب مع موقعك إذا لزم الأمر.
《 تحميل كود PHP لإنشاء العداد 》
الامتداد عند الحفظ هو ".php".

<?php
//***************************************************************************************************
// برنامج PHP لتتبع عداد التنزيل وعارض تاريخ التنزيل
// [معرفة الجميع كتاب صغير مفيد للجميع]
// [みんなの知識 ちょっと便利帳]
// https://www.benricho.org/Tips/download_history/
// تاريخ النشر: 4 فبراير 2024
//
// نظرة عامة:
// هذا البرنامج هو نظام لتتبع تاريخ تنزيل الملفات، مجهز بوظائف مصادقة المستخدم.
// يتضمن ميزات مثل تنقية بيانات الإدخال، إنشاء ملف تسجيل، وعرض إحصائيات التنزيل.
// يمكنك استخدامه بحرية، بما في ذلك تعديل الشيفرة وتغيير تصميم الصفحة.
//
// ملاحظة:
// قبل تحميل الصفحة التي تحتوي على روابط التنزيل، تأكد من تكوين قسم "$targetFiles = array()" في هذا الملف،
// وقم بتحميل هذه الصفحة قبل الصفحة التي تحتوي على روابط التنزيل.
// قد يؤدي فشل القيام بذلك إلى عدم قدرة المستخدمين على التنزيل عند المحاولة، حيث تقوم هذه الصفحة بتعيين والرجوع إلى الملفات المراد تنزيلها.
//
// التكوين والملاحظات:
// ① تم تعيين كلمة المرور إلى "admin"، ولكن يرجى تغييرها إلى أي سلسلة مطلوبة.
// ② يتم إنشاء دليل "log" لتخزين ملفات السجل تلقائيًا عند التحميل الأول.
// ومع ذلك، إذا واجهت رسائل مثل "الدليل غير موجود"، يرجى تحميله بشكل منفصل.
// ③ عند التحميل الأولي، يظهر عرض السجل "التاريخ" والعدد "0".
// يحدث ذلك لأن ملفات السجل مثل "count_1.log" بتاريخ التحميل يتم إنشاؤها في الدليل "log" الذي تم إنشاؤه تلقائيًا في نفس الوقت.
// إذا كان هذا يشكل قلقًا، قم بالوصول إلى الخادم عن بُعد، وقم بتنزيل ملفات مثل "count_1.log"، واحذف البيانات، ثم قم بالتحميل مرة أخرى.
// ④ عند عرض جداول متعددة على صفحة في عرض التاريخ، يمكنك اختيار ما إذا كنت ترغب في الاحتفاظ بمجموعة الصفائف المعينة في [$targetFiles = array] أم عرضها بترتيب زمني.
// ⑤ في عرض التاريخ، يمكنك اختيار ما إذا كنت ترغب في تضمين المجال في 1) عرض الملف أو 2) عرض اسم الملف فقط.
//
// [تنسيق الرابط على الصفحة مع روابط التنزيل]
// [مثال] <a href="/download_history/count.php?download=Registered Number" download="DownloadedFileName.zip" target="_blank">[Any String]</a>
// ① قم بضبط الرقم في "download=1" ليتناسب مع الرقم المعين في "$targetFiles = array()".
// ② قم بضبط المسار ليتناسب مع صفحتك.
//
// [الكود (جافا سكريبت) لعرض التاريخ في سطر واحد على الصفحة حيث توضع روابط التنزيل]
// [مثال] <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
// ① قم بضبط الرقم في "dsp_count=1" ليتناسب مع الرقم المعين في "$targetFiles = array()".
// ② إذا قمت بإزالة "&day_dsp=on"، سيعرض فقط "الإجمالي" دون "اليوم" و"الأمس".
// ③ قم بضبط المسار ليتناسب مع صفحتك.
//***************************************************************************************************

// تكوين الملفات للتنزيل. إذا كانت هناك ملفات متعددة، قم بإضافتها كـ '2'، '3'، '4'، إلخ. كما أن '0' صالح.
// استخدم "http:" أو "https:" للبروتوكول.
$targetFiles = array(
    '1' => 'YourURL/FileName.zip',
    '2' => 'YourURL/FileName.pdf',
    '3' => 'YourURL/FileName.pdf',
    '4' => 'YourURL/FileName.pdf',
);

// قم بتعيين ترميز الأحرف لإخراج HTML
header("Content-Type: text/html; charset=utf-8");

// ترميز الأحرف على الصفحة التي تعرض تاريخ التنزيل
$encodingType = 'UTF-8';

// تعريف معلومات مصادقة المستخدم وإعدادات أخرى
$userid = 'admin';   // معرف المستخدم (استبدل 'admin' بأي سلسلة)
$password = 'admin'; // كلمة المرور (استبدل 'admin' بأي سلسلة)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // استخدام password_hash() لتوليد قيمة تجزئة
$dataLogDir = 'log/'; // يتم إنشاء دليل 'log' تلقائيًا بواسطة هذا البرنامج. إذا لم يتم إنشاءه، قم بتحميل دليل باسم 'log' بشكل منفصل

// اختيار ما إذا كنت ترغب في تضمين المجال عند عرض اسم الملف أم لا
$includeDomain = 1;  // 1: عرض مع اسم المجال، 0: عرض فقط اسم الملف

// اختيار ما إذا كنت تريد استبدال الصف الأصلي بصف جديد مرتب حسب ترتيب السجلات الجديدة عند عرض جداول متعددة على صفحة
$sortTables = 1;  // 1: فرز، 0: عدم الفرز

$dir = 'log'; // الدليل لتخزين ملفات السجل وتاريخ التنزيل


// احصل على نطاق موقعك
$domain = $_SERVER['HTTP_HOST'];

// إدارة الجلسة: منع اختطاف الجلسة واستخدام session_set_cookie_params()
session_set_cookie_params(0, '/', $domain, true, true); // Set HttpOnly and Secure flags
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// تجزئة كلمة المرور: استخدم كلمة المرور_needs_rehash()
if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {
    $newHashedPassword = password_hash($password, PASSWORD_DEFAULT);
    // احفظ قيمة التجزئة الجديدة في قاعدة البيانات، وما إلى ذلك.
}

// أنشئ الدليل إذا لم يكن موجودًا
if (!is_dir($dir)) {
    if (mkdir($dir, 0755, true)) {
    } else {
        // عرض إذا فشل إنشاء الدليل
        echo 'الرجاء إنشاء الدليل "' . $dataLogDir . '" وتحميله بشكل منفصل.';
    }
}

// تحقق مما إذا كان دليل السجل قابلاً للكتابة
if (!is_writable($dataLogDir)) {
    die('The "' . $dataLogDir . '" الدليل إما غير موجود أو ليس لديه أذونات الكتابة. الرجاء إنشاء الدليل وتعيين الأذونات بشكل صحيح (على سبيل المثال، 755).');
}

// احصل على التاريخ الأساسي وتاريخ الأمس
$baseDay = date("Y/m/d");
$yesterday = date("Y/m/d", strtotime("-1 day"));

// دالة للحصول على يوم الأسبوع من التاريخ
function getDayOfWeek($date)
{
    $dayOfWeek = date('w', strtotime($date));
    $weekDays = array('الأحد', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت');
    return $weekDays[$dayOfWeek];
}

// قم بتعيين مسار الملف لكل ملف هدف وإنشاء ملف سجل إذا لم يكن موجودًا
foreach ($targetFiles as $key => $val) {
    $filePath[$key] = $dataLogDir . "count_" . $key . ".log";

    // قم بإنشاء ملف السجل إذا لم يكن موجودًا
    if (!file_exists($filePath[$key])) {
        createLogFile($filePath[$key]);
    }
}

// احصل على مسارات الملفات وتواريخ آخر تحديث لها (مرتبة بترتيب تنازلي للتاريخ)
$filePathsAndDates = array();
foreach ($filePath as $key => $path) {
    if (file_exists($path)) {
        $filePathsAndDates[$key] = filemtime($path);
    } else {
        // قم بإخراج هذا الخطأ إلى السجل وحدد ما إذا كنت تريد متابعة المعالجة أو إحباطها
        echo "خطأ: الملف غير موجود - $path<br>";
    }
}

// فرز تنازلي حسب تاريخ التحديث الأخير (التاريخ الأحدث يأتي أولاً)
arsort($filePathsAndDates);

// إعادة بناء مصفوفة مسارات الملفات التي تم فرزها
$sortedFilePaths = array();
foreach ($filePathsAndDates as $key => $date) {
    $sortedFilePaths[$key] = $filePath[$key];
}

// اختر بشكل مشروط ما إذا كنت تريد استخدام المسارات التي تم فرزها للفرز
$filePath = ($sortTables) ? $sortedFilePaths : $filePath;

// إعادة كود JavaScript إلى العميل (عرض عدد التنزيلات ديناميكيًا)
if (isset($_GET['dsp_count'])) {
    header("Content-type: application/x-javascript");

    // قم بتعيين الرأس كملف JavaScript
    if (!preg_match("/^[0-9]+$/", $_GET['dsp_count'])) {
        echo "document.write(\"يجب أن تكون المعلمة رقمًا بنصف العرض\")";
        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]);
        }
    }

    // إذا كان خيار عرض التاريخ قيد التشغيل، فاعرض التاريخ بما في ذلك
    if (isset($_GET['day_dsp']) && $_GET['day_dsp'] == 'on') {
        $countDsp = <<<EOF
document.write('<div class="counter_inpage">إجمالي التنزيلات: <strong>{$total}</strong>[<span class="count_today">اليوم : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">أمس : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // إذا كان خيار عرض التاريخ في وضع إيقاف التشغيل، فاعرض إجمالي عدد التنزيلات فقط
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">إجمالي التنزيلات: {$total}</p>')
EOF;
    }

    // إذا كان ترميز الأحرف ليس UTF-8، فقم بالتحويل
    if ($encodingType != 'UTF-8') $countDsp = mb_convert_encoding($countDsp, "$encodingType", 'UTF-8');
    echo $countDsp;

    exit();
}

// المعالجة عند طلب تنزيل الملف
if (isset($_GET['download'])) {
    $fileId = $_GET['download'];

    // اخرج إذا كان معرف الملف ليس رقمًا أو إذا كان معرف الملف غير موجود
    if (!preg_match("/^[0-9]+$/", $fileId) || !isset($filePath[$fileId])) {
        exit('معلمة رقمية غير صحيحة');
    }

    // افتح الملف وأغلقه
    $fp = fopen($filePath[$fileId], "rb+");
    if (!$fp) {
        exit('فشل في فتح الملف');
    }

    flock($fp, LOCK_EX);

    // اقرأ ملف السجل وقم بتخزينه في مصفوفة
    $line = array();
    while (($data = fgets($fp)) !== false) {
        $line[] = $data;
    }

    // اقتطاع الملف وإضافة سطر تاريخ جديد في البداية
    ftruncate($fp, 0);
    rewind($fp);

    // أضف سطر تاريخ جديدًا في البداية إذا لم يكن موجودًا
    if (strpos($line[0], $baseDay) === false) {
        $writeLine = $baseDay . ',1' . "\n";
        fwrite($fp, $writeLine);
    }

    // معالجة كل سطر في الملف
    foreach ($line as $val) {
        // زيادة عدد التنزيلات للتاريخ الحالي
        if (strpos($val, $baseDay) !== false) {
            $valArray = explode(',', $val);
            $valArray[1] = rtrim($valArray[1], "\n") + 1;
            $val = $valArray[0] . ',' . $valArray[1] . "\n";
        }
        fwrite($fp, $val);
    }

    // امسح المخزن المؤقت وحرر القفل
    fflush($fp);
    flock($fp, LOCK_UN);

    // أغلق الملف
    fclose($fp);

    // امسح المخزن المؤقت للإخراج
    ob_end_clean();

    // قم بإجراء تنزيل الملف
    header("Location: {$targetFiles[$fileId]}");
    exit();
} else {
    // ابدأ الجلسة، وقم بتدمير الجلسة إذا طلب تسجيل الخروج
    session_start();
    if (isset($_GET['logout'])) {
        $_SESSION = array();
        session_destroy();
    }

    $loginError = '';

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

    // استخدم وظيفة تجزئة كلمة المرور لإنشاء قيمة تجزئة
    // معالجة تسجيل الدخول
    if (isset($_POST['userid']) && isset($_POST['password'])) {
        // قارن قيم التجزئة للمصادقة
        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 {
            // معالجة فشل المصادقة
            $_SESSION['auth'] = FALSE;
            $loginError = '<div style="text-align: center; color: crimson;">معرف المستخدم أو كلمة المرور غير صحيحة.</div>';
        }
    }

  // إذا لم تكن المصادقة ناجحة، فاعرض شاشة تسجيل الدخول
    if ($_SESSION['auth'] !== TRUE) {
        ?>
        <!DOCTYPE html>
        <html lang="ar" dir="rtl">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>تحميل شاشة تسجيل الدخول التاريخ</title>
            <!-- أنماط شاشة تسجيل الدخول (قابلة للتعديل حسب الحاجة)-->
            <style>
                body {
                    font-family: 'Noto Naskh Arabic', 'Amiri', 'Hiragino Kaku Gothic ProN', 'Hiragino Kaku Gothic ProN W3', Meiryo, Osaka, 'MS PGothic', arial, helvetica, 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">【عرض تاريخ التنزيل】</p>
                    <?php if (isset($loginError)): ?>
                        <!-- عرض رسالة خطأ إذا تم تعيين المتغير $loginError -->
                        <p style="color: crimson;"><?php echo $loginError; ?></p>
                    <?php endif; ?>
                    <label for="userid">معرف المستخدم:</label>
                    <input type="text" id="userid" name="userid" required>
                    <label for="password">كلمة المرور:</label>
                    <input type="password" id="password" name="password" required>
                    <?php
                        // بافتراض أن $showPassword هو متغير PHP يحدد ما إذا كان سيتم عرض كلمة المرور في البداية أم لا
                        echo '<label class="passwordshow" for="showPassword">[عرض كلمة المرور]<div class="center-container"><input type="checkbox" id="showPassword" onchange="togglePasswordVisibility()" ' . ($showPassword ? 'checked' : '') . '></div></label>';
                    ?>
                    <button type="submit" name="login_submit">تسجيل الدخول</button>
                </form>   
            </div>

<!-- التحكم في رؤية كلمة المرور -->
<script>
  function togglePasswordVisibility() {
    var passwordInput = document.getElementById('password');
    var showPasswordCheckbox = document.getElementById('showPassword');

    if (showPasswordCheckbox.checked) {
      // إذا تم تحديده، سيتم عرض كلمة المرور
      passwordInput.type = 'text';
    } else {
      // قم بإلغاء التحديد لإخفاء كلمة المرور
      passwordInput.type = 'password';
    }
  }
</script>
</body>
</html><?php
exit();
} else {
  // إذا قمت بتسجيل الدخول، فاعرض صفحة سجل التنزيل
  ?>
  <!DOCTYPE html>
  <html lang="ar" dir="rtl">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>تحميل التاريخ</title>
    <!-- نمط عرض سجل التنزيل (قابل للتعديل حسب الحاجة) -->
    <style>
                 body {
                    font-family: 'Noto Naskh Arabic', 'Amiri', '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">【تحميل التاريخ】 【<a href="?logout=true">تسجيل خروج</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">تاريخ</th>
            <th class="tableheader">التحميلات</th>
          </tr>
          <?php	  
            $totalDownload = 0;

            // اقرأ فقط في حالة وجود الملف
            if (file_exists($val)) {
              $line = file($val);
              foreach ($line as $lineVal) {
                $lineArray = explode(',', $lineVal);

                // Check if $lineArray[1] is a numeric value
                $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">إجمالي التنزيلات: <?php echo $totalDownload;?></th>
          </tr>
        </table>
      </div>              
    <?php
                }
              }
            }
          ?>
</body>
</html><?php
// وظيفة لتطهير جميع العناصر في المصفوفة
function sanitize($arr)
{
  // إذا كانت مصفوفة، فقم بتطبيق التعقيم بشكل متكرر
  if (is_array($arr)) {
    return array_map('sanitize', $arr);
  }
  // قم بإزالة الأحرف الفارغة من داخل السلاسل
  return str_replace("\0", "", $arr);
}

// قم بإنشاء ملف سجل جديد إذا لم يكن موجودًا
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);

    // تعيين أذونات الملف
    chmod($filePath, 0666);
  } else {
  }
}
الامتداد عند الحفظ هو ".php".
بهذا نختتم مقدمة كود PHP الخاص بـ "برنامج عرض سجل التنزيلات/عداد التنزيلات". نتنمى أن تجده مفيد.
سنكون ممتنين لو تمكنت من إرسال انطباعاتك إلينا بعد استخدام خدمتنا. يرجى ملاحظة أننا غير قادرين على الإجابة على أسئلتك.

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

Last updated : 2024/06/29