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

Μετρητής Λήψεων
Πρόγραμμα Προβολής Ιστορικού Λήψεων
= Λήψη και Εγκατάσταση Κώδικα PHP =
Δείγμα Μετρητή Λήψεων

Εισαγωγή:

Αυτή είναι μια εισαγωγή σε ένα πρόγραμμα που σας επιτρέπει να γνωρίζετε τον αριθμό των λήψεων όταν ένας χρήστης της ιστοσελίδας λήψεων και χρησιμοποιεί ένα πρόγραμμα. Είναι δυνατόν να ρυθμίσετε ένα μετρητή λήψεων στη σελίδα, και οι διαχειριστές του ιστότοπου μπορούν επίσης εύκολα να ελέγξουν το ιστορικό λήψεων στο πρόγραμμα περιήγησης.

[Δείγμα Εγκατεστημένο στη Σελίδα]
Συνολικές Λήψεις: 1865[Σήμερα: 23 Χθες: 76
[Δείγμα Ανοιχτό στο Πρόγραμμα Περιήγησης]
Σημείωση: Εάν μια σελίδα με έναν σύνδεσμο λήψης εμφανίζει ένα μήνυμα προτροπής για αποθήκευση αρχείου και κλείνει χωρίς να ξεκινήσει η λήψη, θα μετρηθεί παρ'όλα αυτά ως λήψη. Αυτό συμβαίνει διότι μετρά τον αριθμό των κλικ στους συνδέσμους.
Οδηγίες Λήψης:

Από αυτήν τη σελίδα, κάντε λήψη του συμπιεσμένου αρχείου "zip" του προγράμματος και εγκαταστήστε το στον δικό σας ιστότοπο. Το αρχείο ονομάζεται "count.php", αλλά μπορείτε να το αλλάξετε.

Είστε ελεύθεροι να χρησιμοποιήσετε και να τροποποιήσετε τον κώδικα, συμπεριλαμβανομένης της αλλαγής του σχεδιασμού της σελίδας.

Παρακαλώ τροποποιήστε τον κώδικα για να προσθέσετε νέες λειτουργίες ή να αλλάξετε τον σχεδιασμό για να δημιουργήσετε μια σελίδα που είναι εύκολη στην κατανόηση και τη χρήση.

 Λήψη Προγράμματος PHP:

Οδηγίες Εγκατάστασης:

Αποσυμπιέστε το κατεβασμένο αρχείο "count.php.zip", και θα δημιουργηθεί ένα αρχείο με το όνομα "count.php". Παρακαλώ δημιουργήστε έναν κατάλογο όπως "download_history" και αποθηκεύστε το εκεί.

Το αρχείο "zip" περιέχει μόνο ένα αρχείο, το "count.php", και η "οθόνη σύνδεσης" για τον διαχειριστή δημιουργείται αυτόματα.

Ρυθμίσεις:

Αυτή είναι η κύρια μέθοδος ρύθμισης. Αυτά τα κύρια μέρη αναφέρονται επίσης στο αρχείο PHP.

  1. Ρυθμίσεις Κωδικού Πρόσβασης:
    1. Πρέπει να οριστεί ένας κωδικός για τη σελίδα του διαχειριστή.
    2. Ο προκαθορισμένος κωδικός είναι "admin", αλλά αλλάξτε τον σε οποιαδήποτε συμβολοσειρά της επιλογής σας.
    3. Για να ενισχύσετε την ασφάλεια, ορίστε έναν ισχυρό κωδικό.
  2. Ρύθμιση Αρχείων για Λήψη:
    1. Ολοκληρώστε τις ρυθμίσεις για το "$targetFiles = array()".
    2. Αυτό είναι το τμήμα όπως "'1' => 'Το URL/όνομα αρχείου σας.zip',".
  3. Κατάλογος για τη Φύλαξη των Αρχείων Καταγραφής:
    1. Απαιτείται ένας κατάλογος με το όνομα "log" στον απομακρυσμένο διακομιστή για την αποθήκευση αρχείων καταγραφής που καταγράφουν το ιστορικό.
    2. Αυτό το πρόγραμμα δημιουργεί αυτόματα έναν κατάλογο με το όνομα "log" κατά την πρώτη φορά που ανεβάζετε. Ωστόσο, εάν λάβετε ένα μήνυμα όπως "Χωρίς κατάλογο", παρακαλούμε δημιουργήστε τον και ανεβάστε τον ξεχωριστά.
  4. Εμφάνιση Ιστορικού Φορτωμένης για Πρώτη Φορά:
    1. Όταν φορτ ώνετε για πρώτη φορά, η "ημερομηνία" και ο αριθμός "0" μπορεί να εμφανιστούν στο ιστορικό.
    2. Αυτό συμβαίνει διότι δημιουργούνται αρχεία καταγραφής όπως "count_1.log" που περιέχουν την ημερομηνία φόρτωσης στον αυτόματα δημιουργημένο κατάλογο "log".
    3. Εάν αυτό σας ενοχλεί, κατεβάστε ένα αρχείο όπως "count_1.log" από τον απομακρυσμένο διακομιστή, διαγράψτε τα δεδομένα και ανεβάστε τον.
    4. Ωστόσο, η κατάσταση "ημερομηνία" και "0" μπορεί επίσης να είναι μια ιστορία όταν ξεκίνησε ο μετρητής. Εάν υπάρχει λήψη εκείνη τη μέρα, θα μετρηθεί.
  5. Εμφάνιση Σελίδας Προβολής Διαχειριστή:
    1. Όταν οι διαχειριστές βλέπουν τη σελίδα, μπορείτε να επιλέξετε εάν θα εμφανιστεί το URL ή μόνο το όνομα αρχείου.
    2. τάξη που ορίζεται από το "$targetFiles = array()" ή να τους ταξινομήσετε με την ημερομηνία όταν προκύψουν νέες καταγραφές.
  6. Σχεδιασμός Σελίδας, CSS, κλπ.:
    1. Παρακαλώ προσαρμόστε τον σχεδιασμό της σελίδας, το CSS, κλπ., ώστε να γίνει εύκολη ανάγνωση της σελίδας.
    2. Κάποτε, το CSS γραφόταν ως εξωτερικό αρχείο, αλλά τώρα γράφεται στην ίδια σελίδα ώστε να μπορείτε να αναφέρεστε στις ετικέτες όταν αλλάζετε το CSS.
  7. Ρύθμιση Συνδέσμου Λήψης στη Σελίδα:
    1.  Συνήθως, η ετικέτα λήψης <a> γράφεται ως εξής:
      <a href="/download_history/sample.zip" download="Όνομα Αρχείου κατά τη Λήψη.zip">[Αυθαίρετη συμβολοσειρά]</a>
    2. Σε αυτό το πρόγραμμα, γράψτε την ετικέτα λήψης <a> ως εξής:
    3. [Παράδειγμα]Αντιγραφή
      <a href="/download_history/count.php?download=1" download="Όνομα Αρχείου κατά τη Λήψη.zip" target="_blank">[Αυθαίρετη συμβολοσειρά]</a>
    4. Ταιριάξτε τον αριθμό στο "download=1" με τον αριθμό που ορίζεται στο "$targetFiles = array()". Αυτή η ρύθμιση αναφέρεται στα αρχεία που πρόκειται να ληφθούν.
    5. Παρακαλώ ταιριάξτε το μονοπάτι στη σελίδα σας.
    6. Παρακαλώ ανεβάστε τη σελίδα με τον σύνδεσμο λήψης μετά την ανάρτηση του αρχείου με το "$targetFiles = array()" (σε αυτό το παράδειγμα, "count.php").
  8. Κώδικας για Εμφάνιση Ιστορικού σε Μια Γραμμή:
    1. Δημιουργήστε τον παρακάτω κώδικα JavaScript και τοποθετήστε τον στη σελίδα όπου θέλετε να εμφανιστεί:
    2. [Παράδειγμα]Αντιγραφή
      <script type="text/javascript" src="/download_history/count.php?dsp_count=1&day_dsp=on"></script>
    3. Ταιριάξτε τον αριθμό στο "dsp_count=1" με τον αριθμό που ορίζεται στο "$targetFiles = array()".
    4. Εάν διαγράψετε το "&day_dsp=on," μόνο το "συνολικός αριθμός" θα εμφανίζεται χωρίς την εμφάνιση "σήμερα/χθες".
    5. Συνολικές Λήψεις: 1865[Σήμερα: 23 Χθες: 76
      Συνολικές Λήψεις: 1865
    6. Παρακαλώ ταιριάξτε το μονοπάτι στη σελίδα σας
Σχετικά με τις Ρυθμίσεις Επέκτασης

Όταν εμφανίζονται πολλοί πίνακες, η προεπιλεγμένη ρύθμιση του προγράμματος είναι να ταξινομείται ανά το χρόνο της τελευταίας ενημέρωσης. Αν θέλετε να ταξινομηθεί ανά τον συνολικό αριθμό λήψεων, δημιουργήστε ένα νέο αρχείο όπως το "total_downloads.php" και αντικαταστήστε το ακόλουθο τμήμα.

  1. Αλλαγή στα σχόλια
    Αντικαταστήστε τα σχόλια στο ακόλουθο τμήμα:
    // Επιλογή εάν θα αντικατασταθεί ο αρχικός πίνακας με έναν νέο ταξινομημένο στη σειρά των νέων καταγραφών κατά την εμφάνιση πολλαπλών πινάκων σε μια σελίδα
  2. Αντιγραφή του αντικαταστημένου σχολίου
    // Εάν εμφανίζονται πολλοί πίνακες στη σελίδα, επιλέξτε εάν θα αντικαταστήσετε τον αρχικό πίνακα και να ταξινομήσετε κατά τη σειρά του συνολικού αριθμού λήψεων.
  3. Κωδικός και αλλαγές σχολίων
    Αντικαταστήστε τον κώδικα και τα σχόλια στο ακόλουθο τμήμα. Παρακαλούμε να το λάβετε υπόψη σαν ένα μπλοκ.
    // Λήψη των διαδρομών αρχείων και των τελευταίων ημερομηνιών ενημέρωσής τους (ταξινομημένες με φθίνουσα σειρά ημερομηνίας)
    $filePathsAndDates = array();
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $filePathsAndDates[$key] = filemtime($path);
        } else {
            // Έξοδος αυτού του σφάλματος στο αρχείο καταγραφής και απόφαση εάν θα συνεχίσει ή θα ακυρωθεί η επεξεργασία
            echo "Error: File does not exist - $path<br>";
        }
    }
    
    // Ταξινόμηση με φθίνουσα σειρά ανά τελευταία ενημέρωση (η πιο πρόσφατη ημερομηνία έρχεται πρώτη)
    arsort($filePathsAndDates); arsort($filePathsAndDates); // Ανασύσταση του πίνακα με τις ταξινομημένες διαδρομές αρχείων $sortedFilePaths = array(); foreach ($filePathsAndDates as $key => $date) { $sortedFilePaths[$key] = $filePath[$key]; }
  4. Αντιγραφή του κώδικα και των σχολίων αντικατάστασης
    // Πίνακας που αποθηκεύει τον συνολικό αριθμό λήψεων
    $totalDownloads = array();
    
    // Λήψη της διαδρομής αρχείου και του συνολικού αριθμού λήψεων
    foreach ($filePath as $key => $path) {
        if (file_exists($path)) {
            $line = file($path);
            $total = 0;
    
           // Άθροισμα του αριθμού λήψεων για κάθε γραμμή
            foreach ($line as $val) {
                $valArray = explode(',', $val);
                $total += trim($valArray[1]);
            }
    
           // Αποθήκευση του συνολικού αριθμού λήψεων σε έναν πίνακα
            $totalDownloads[$key] = $total;
        } else {
            //// Εξαγωγή αυτού του σφάλματος στο αρχείο καταγραφής και απόφαση εάν θα συνεχιστεί ή θα διακοπεί η διαδικασία
            echo "Σφάλμα: Το αρχείο δεν υπάρχει - $path";
        }
    }
    
    // Ταξινόμηση κατά φθίνουσα σειρά ανά τον συνολικό αριθμό λήψεων
    arsort($totalDownloads);
    
    // Ανακατασκευή του ταξινομημένου πίνακα διαδρομών αρχείων
    $sortedFilePaths = array();
    foreach ($totalDownloads as $key => $total) {
        $sortedFilePaths[$key] = $filePath[$key];
    }
  5. Δημιουργία και εγκατάσταση αρχείου
    1. Κατά τη δημιουργία πολλών σελίδων, για να αποφευχθούν λάθη στην ρύθμιση στοιχείων κατά την προσθήκη περιεχομένου ομοιόμορφα, δημιουργήστε το ακόλουθο τμήμα του κώδικα ως εξωτερικό αρχείο και φορτώστε το στο ήδη εφαρμοσμένο τμήμα με διαφορετικό κώδικα. Δημιουργήστε ένα εξωτερικό αρχείο με όνομα όπως "config.php".
    // Ρύθμιση αρχείων για λήψη. Αν υπάρχουν πολλαπλά αρχεία, προσθέστε τα ως '2', '3', '4' κλπ. Επίσης, το '0' είναι έγκυρο.
    // Χρησιμοποιήστε "http:" ή "https:" για το πρωτόκολλο.
    $targetFiles = array(
    '1' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.zip',
    '2' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    '3' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    '4' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    );
  6. Αντιγραφή του δείγματος τμήματος για να ονομαστεί "config.php"
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>DownloadHistory</title>
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    </head>
    <body>
    <?php
    // Κάντε μόνο αυτό το τμήμα ένα εξωτερικό αρχείο και φορτώστε το στη σελίδα που χρησιμοποιείτε με το "include __DIR__ . '/config.php';"
    // Ρύθμιση αρχείων για λήψη. Αν υπάρχουν πολλαπλά αρχεία, προσθέστε τα ως '2', '3', '4' κλπ. Επίσης, το '0' είναι έγκυρο.
    // Χρησιμοποιήστε "http:" ή "https:" για το πρωτόκολλο.
    $targetFiles = array(
    '1' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.zip',
    '2' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    '3' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    '4' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    ); ?> </body> </html>
  7. A külső fájlok betöltésének kódja és a kód elhelyezése
    1. άβετε το αρχείο που δημιουργήθηκε με ένα όνομα όπως "config.php" στην ακόλουθη θέση με τον κώδικα "include __DIR__ . '/config.php';".
    2. Σχολιάστε ή διαγράψτε το ακόλουθο τμήμα και αντικαταστήστε το με τον κώδικα "include __DIR__ . '/config.php';".
    //$targetFiles = array(
    // '1' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.zip',
    // '2' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    // '3' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    // '4' => 'ΗΔιεύθυνσήΣας/ΌνομαΑρχείου.pdf',
    //);
  8. Αντιγραφή του κώδικα για αντικατάσταση
    include __DIR__ . '/config.php';
* Η "font-family" στο πρόγραμμα θα πρέπει να προσαρμοστεί ώστε να ταιριάζει με τον ιστότοπό σας, αν χρειαστεί.
《 PHP Κώδικας για Δημιουργία Μετρητή Λήψεων 》
Αποθήκευση του αρχείου με επέκταση ".php".

<?php
//***************************************************************************************************
// Πρόγραμμα PHP για τον Μετρητή Λήψεων και την Προβολή Ιστορικού Λήψεων
// [Βιβλίο με Λίγες Χρήσιμες Γνώσεις για Όλους]
//        Minna no Chishiki Chotto Benricho
//        みんなの知識 ちょっと便利帳
// https://www.benricho.org/Tips/download_history/
// Έκδοση: 28 Φεβρουαρίου 2024
//
// Επισκόπηση:
// Αυτό το πρόγραμμα είναι ένα σύστημα για την παρακολούθηση του ιστορικού των λήψεων αρχείων, εξοπλισμένο με λειτουργικότητα πιστοποίησης χρήστη.
// Περιλαμβάνει χαρακτηριστικά όπως αποσαφήνιση εισόδου δεδομένων, δημιουργία αρχείων καταγραφής και εμφάνιση στατιστικών λήψεων.
// Είστε ελεύθεροι να το χρησιμοποιήσετε, συμπεριλαμβανομένης της τροποποίησης του κώδικα και της αλλαγής της σχεδίασης της σελίδας.
//
// Σημείωση:
// Πριν ανεβάσετε τη σελίδα που περιέχει τους συνδέσμους λήψης, βεβαιωθείτε ότι έχετε ρυθμίσει το τμήμα "$targetFiles = array()" αυτού του αρχείου,
// και ανεβάστε αυτήν τη σελίδα πριν από τη σελίδα με τους συνδέσμους λήψης.
// Η αποτυχία να το κάνετε μπορεί να οδηγήσει σε αδυναμία λήψης από τους χρήστες κατά την προσπάθεια, καθώς αυτή η σελίδα ορίζει και αναφέρεται στα αρχεία που πρέπει να ληφθούν.
//
// Ρυθμίσεις και Σημειώσεις:
// ① Ο κωδικός πρόσβασης έχει οριστεί σε "admin", αλλά παρακαλούμε αλλάξτε το σε οποιαδήποτε επιθυμητή συμβολοσειρά.
// ② Ο κατάλογος "log" για την αποθήκευση αρχείων καταγραφής δημιουργείται αυτόματα κατά το πρώτο ανέβασμα.
//    Ωστόσο, αν αντιμετωπίσετε μηνύματα όπως "δεν βρέθηκε κατάλογος", παρακαλούμε ανεβάστε τον ξεχωριστά.
// ③ Κατά το πρώτο ανέβασμα, η εμφάνιση του ιστορικού δείχνει "ημερομηνία" και τον αριθμό "0".
//    Αυτό συμβαίνει επειδή αρχεία καταγραφής όπως "count_1.log" με την ημερομηνία ανεβάσματος δημιουργούνται ταυτόχρονα στον αυτόματα δημιουργημένο κατάλογο "log".
//    Εάν αυτό είναι ένα πρόβλημα, αποκτήστε πρόσβαση στον απομακρυσμένο διακομιστή, κατεβάστε αρχεία όπως το "count_1.log", διαγράψτε τα δεδομένα και στη συνέχεια ανεβάστε τα.
// ④ Κατά την εμφάνιση πολλαπλών πινάκων σε μια σελίδα στην εμφάνιση ιστορικού, μπορείτε να επιλέξετε εάν θα διατηρήσετε τον πίνακα που έχει οριστεί σε [$targetFiles = array] ή θα τους εμφανίσετε κατά χρονολογική σειρά.
// ⑤ Στην εμφάνιση ιστορικού, μπορείτε να επιλέξετε εάν θα περιλάβετε τον τομέα στο 1) εμφάνιση του αρχείου ή 2) εμφάνιση μόνο του ονόματος του αρχείου.
//
// [Μορφή του Συνδέσμου στη Σελίδα με τους Συνδέσμους Λήψης]
// [Παράδειγμα] <a href="/download_history/count.php?download=ΑριθμόςΚαταχωρημένου" download="ΟνομαΑρχείου.zip" target="_blank">[Οποιαδήποτε Συμβολοσειρά]</a>
// ① Προσαρμόστε τον αριθμό στο "download=1" στον αριθμό που έχει οριστεί στο "$targetFiles = array()".
// ② Προσαρμόστε τη διαδρομή ώστε να ταιριάζει με τη σελίδα σας.
//
// [Κώδικας (JavaScript) για εμφάνιση ιστορικού σε μια γραμμή στη σελίδα όπου βρίσκεται ο σύνδεσμος λήψης]
// [Παράδειγμα] <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); // Ορισμός των σημάτων HttpOnly και Secure
session_start();
if (!isset($_SESSION['auth'])) {
    $_SESSION['auth'] = FALSE;
}

// Κωδικοποίηση κωδικού πρόσβασης: Χρήση password_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 'Please create the "' . $dataLogDir . '" directory and upload it separately.';
    }
}

// Έλεγχος εάν ο κατάλογος καταγραφής είναι εγγράψιμος
if (!is_writable($dataLogDir)) {
    die('The "' . $dataLogDir . '" directory either does not exist or does not have write permissions. Please create the directory and set the permissions properly (e.g., 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 "Error: File does not exist - $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(\"Parameter must be a half-width number\")";
        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">Total downloads: <strong>{$total}</strong>[<span class="count_today">Today : <strong>{$todayCount}</strong></span>  <span class="count_yesterday">Yesterday : <strong>{$yesterdayCount}</strong></span>]</div>')
EOF;
    } else {
        // Εάν η επιλογή εμφάνισης ημερομηνίας είναι ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ, εμφανίστε μόνο το συνολικό αριθμό λήψεων
        $countDsp = <<<EOF
document.write('<p class="counter_inpage">Total downloads: {$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);
    }

    // Εκκαθάριση του buffer και απελευθέρωση του κλειδώματος
    fflush($fp);
    flock($fp, LOCK_UN);

    // Κλείσιμο του αρχείου
    fclose($fp);

    // Εκκαθάριση του buffer εξόδου
    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="en">
        <head>
            <meta charset="utf-8">
            <meta name="robots" content="NOINDEX,NOFOLLOW">
            <title>Οθόνη Σύνδεσης Ιστορικού Λήψεων</title>
            <!-- Στυλ οθόνης σύνδεσης (προσαρμόσιμο όπως χρειάζεται)-->
            <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">【Προβολή Ιστορικού Λήψεων】</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="en">
  <head>
    <meta charset="utf-8">
    <meta name="robots" content="NOINDEX,NOFOLLOW">
    <title>Ιστορικό Λήψεων</title>
    <!-- Στυλ προβολής ιστορικού λήψεων (προσαρμόσιμο όπως χρειάζεται) -->
    <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">【Ιστορικό Λήψεων】 【<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);

                // Έλεγχος εάν η $lineArray[1] είναι αριθμητική τιμή
                $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);
  }
  // Αφαίρεση χαρακτήρων NULL από το εσωτερικό των συμβολοσειρών
  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/02/05