• 26-09-2023, 13:58:38
    #1
    Üyeliği durduruldu
    Merhabalar,

    chartjs ile online sayaç yapmak istiyorum.
    online sayaçım kişiler girdikce kaç kişi olduğunu rowcount ile saydırıp alabilirim.
    fakat şurda takılıyorum chartjsde son 7 günün gün gün istatistigini nasıl tutcagıım bilmiyorum bana bu konu hakkında fikir yöntem verebilcek varmi?
    php pdo kullanıyorum saygılarımla

  • 26-09-2023, 14:04:48
    #2
    Üyeliği durduruldu
    günlük artan azalan değerde tablo kullanarak
  • 26-09-2023, 14:12:59
    #3
    Üyeliği durduruldu
    konu güncel
  • 26-09-2023, 14:33:13
    #4
    Son 7 gün istastiği için ek olarak bir şeye ihtiyacınız yok
    id,IP_adres,Tarih
    Adlı bir db yapısı olduğunu varsayalım yapmanız gerek Tarih kısmını group by kullanmak ve count ile toplamak where ile bugünden 7 gün çıkarmak bu şekilde sorunu çözebilirsiniz
  • 26-09-2023, 14:36:31
    #5
    Üyeliği durduruldu
    Canozkan adlı üyeden alıntı: mesajı görüntüle
    Son 7 gün istastiği için ek olarak bir şeye ihtiyacınız yok
    id,IP_adres,Tarih
    Adlı bir db yapısı olduğunu varsayalım yapmanız gerek Tarih kısmını group by kullanmak ve count ile toplamak where ile bugünden 7 gün çıkarmak bu şekilde sorunu çözebilirsiniz
    aslinda buraya kadar yaptim hocam sadece şu kısımda takılıyorum
    gün gün istatik nasıl tutucam onu bilemedim
    örnek bugün 26 sı rowcount ile güne özel saydırabilirim bu şekilde alabilirim fakat chartjsde gün gün istatiskleri nasil yazdircam bilmiyorum kendimide anlatamıyorum şuan 1 gündür bununla ugraşıyorum çıkmaza girdim sanirim
  • 26-09-2023, 14:42:07
    #6
    Anladığım kadarıyla ekteki videoda anlatılan sistemi yapmak istiyorsunuz, 1 haftayı günlere bölecek şekilde ayarlıyor. 04:43'ten itibaren izleyebilirsiniz.

    https://www.youtube.com/watch?v=EVHi41f7psQ


    Back-end'de ise online istatistikler için özel tablo oluşturup tarihleri tutmanız gerekecek. Verileri günlük olarak almanız yeterli olacaktır, sorgu hazırlayarak haftalık, aylık ve yıllık sayıları alabilirsiniz. Belirli periyotlarda(CRON ile 1 aydan/yıldan eski kayıtları sildirmek gibi vb.) temizlik yaptırarak maliyetleri düşürebilirsiniz. Verileri bu şekilde aldıktan sonra ekteki videoda görüldüğü gibi yapı kurabilirsiniz, hatta aynı obje yapısını kurup statik verileri dinamik PHP kodlarıyla değiştirebilirsiniz.
  • 26-09-2023, 20:47:39
    #7
    Tarihlerde bir sorun var gibi kontrol edeceğim; startoverflow'dan farklı sql örneği buldum


    chartjs.php
    <?php
    $before = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');
    $after = array('Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi', 'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt', 'Paz', 'Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara');
    
    if (isset($_REQUEST['ajax']) || isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') {
        $host = "localhost";
    
        $dbname = "r10";
        $username = "root";
        $password = "";
    
        try {
            $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            die("Bağlantı hatası: " . $e->getMessage());
        }
    
        $sql = "
            SELECT
                CONCAT(YEAR(`created_at`), ', ', MONTHNAME(`created_at`), ' ', FLOOR(((DAY(`created_at`) - 1) / 7) + 1)) `week`, 
                COUNT(*) AS visitor_count,
                SUM(CASE WHEN action_type = 'view' THEN 1 ELSE 0 END) AS view_count,
                SUM(CASE WHEN action_type = 'click' THEN 1 ELSE 0 END) AS click_count
            FROM
                visitor
            LEFT JOIN
                visitor_log ON visitor.visitor_id = visitor_log.visitor_id
            GROUP BY
                `week`
            ORDER BY month(`created_at`), `week`;
        ";
    
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
    
        $weeklyData = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
        foreach ($weeklyData as $index => $row) {
            //$row['start_date'] = get_dateformat($row['start_date'], 'd F');
            //$row['end_date'] = get_dateformat($row['end_date'], 'd F');
            $row['week'] = str_replace($before, $after, $row['week']);
            $weeklyData[$index] = $row;
        }
    
        header('Content-Type: application/json');
        exit(json_encode($weeklyData, JSON_NUMERIC_CHECK));
    }
    ?>
    <!DOCTYPE html>
    <html lang="tr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Haftalık Ziyaretçi Sayısı Grafiği</title>
        <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    </head>
    <body>
        <div style="width: 80%; margin: auto;">
            <canvas id="visitorChart"></canvas>
        </div>
    
        <script>
            $.ajax({
                url: "",
                method: "GET",
                dataType: "JSON",
                success: function(data) {
                    var ctx = document.getElementById("visitorChart").getContext("2d");
                    var visitorChart = new Chart(ctx, {
                        type: "line",
                        data: {
                            labels: data.map(function(item) {
                                return "(" + item.week + ")";
                            }),
                            datasets: [{
                                label: "Tekil Ziyaretçi",
                                data: data.map(function(item) {
                                    return item.visitor_count;
                                }),
                                borderColor: "rgba(75, 192, 192, 1)",
                                borderWidth: 2,
                                fill: false
                            }, {
                                label: "Görüntüleme",
                                data: data.map(function(item) {
                                    return item.view_count;
                                }),
                                borderColor: "rgba(255, 99, 132, 1)",
                                borderWidth: 2,
                                fill: false
                            }, {
                                label: "Tıklama",
                                data: data.map(function(item) {
                                    return item.click_count;
                                }),
                                borderColor: "rgba(54, 162, 235, 1)",
                                borderWidth: 2,
                                fill: false
                            }]
                        },
                        options: {
                            scales: {
                                y: {
                                    beginAtZero: true
                                }
                            },
                            plugins: {
                                title: {
                                    display: true,
                                    text: "Haftalık Ziyaretçi Sayısı Grafiği"
                                }
                            }
                        }
                    });
                },
                error: function() {
                    console.error("Veri çekme hatası");
                }
            });
        </script>
    </body>
    </html>
    index.php - bunu kendim denemek için yaptım
    session_start();
    
    function get_my() {
        if (isset($_COOKIE['my'])) {
            return $_COOKIE['my'];
        } elseif (isset($_SESSION['my'])) {
            return $_SESSION['my'];
        } else {
            $uniq = uniqid();
            setcookie('my', $uniq, time() + 3600 * 24 * 365);
            $_SESSION['my'] = $uniq;
            return $uniq;
        }
    }
    
    function create_visitor($pdo, $visitor_id) {
        $sql = "INSERT INTO visitor (visitor_id, created_at) VALUES (:visitor_id, :created_at)";
        $stmt = $pdo->prepare($sql);
        $created_at = date('Y-m-d H:i:s');
        $stmt->bindParam(':visitor_id', $visitor_id, PDO::PARAM_STR);
        $stmt->bindParam(':created_at', $created_at, PDO::PARAM_STR);
        $stmt->execute();
    }
    
    function log_page_visit($pdo, $visitor_id, $page_url) {
        $sql = "INSERT INTO visitor_log (visitor_id, page_url, action_type) VALUES (:visitor_id, :page_url, :action_type)";
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':visitor_id', $visitor_id, PDO::PARAM_STR);
        $stmt->bindParam(':page_url', $page_url, PDO::PARAM_STR);
        $action_type = "view"; // Görüntüleme işlemi, tıklama veya başka bir işlem türü olabilir
        $stmt->bindParam(':action_type', $action_type, PDO::PARAM_STR);
        $stmt->execute();
    }
    
    $host = "localhost";
    $dbname = "r10";
    $username = "root";
    $password = "";
    
    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        die("Bağlantı hatası: " . $e->getMessage());
    }
    
    $visitor_id = get_my();
    
    // Ziyaretçiyi "visitor" tablosuna ekle (eğer daha önce eklenmediyse)
    $sql = "SELECT COUNT(*) FROM visitor WHERE visitor_id = :visitor_id";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':visitor_id', $visitor_id, PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->fetchColumn();
    
    if ($count == 0) {
        create_visitor($pdo, $visitor_id);
    }
    
    $page_url = $_SERVER['REQUEST_URI'];
    
    $parsed_url = parse_url($page_url);
    
    if (isset($parsed_url['path'])) {
        $page_url = rtrim($parsed_url['path'], '/');
    }
    
    // Aynı sayfa URL'siyle birden fazla kayıt oluşturmayı önlemek için kontrol yap
    $sql = "SELECT COUNT(*) FROM visitor_log WHERE visitor_id = :visitor_id AND page_url = :page_url";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':visitor_id', $visitor_id, PDO::PARAM_STR);
    $stmt->bindParam(':page_url', $page_url, PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->fetchColumn();
    
    if ($count == 0) {
        // Ziyaretçinin sayfa ziyareti kaydedilmediyse, kaydet
        log_page_visit($pdo, $visitor_id, $page_url);
    }
    SQL yapısı


    -- r10.visitor: 16 rows tablosu için veriler indiriliyor
    /*!40000 ALTER TABLE `visitor` DISABLE KEYS */;
    REPLACE INTO `visitor` (`id`, `visitor_id`, `created_at`) VALUES
        (1, 'uniqid1', '2023-09-05 10:00:00'),
        (2, 'uniqid2', '2023-09-05 11:30:00'),
        (3, 'uniqid3', '2023-09-06 09:45:00'),
        (4, 'uniqid4', '2023-09-06 14:15:00'),
        (5, 'uniqid5', '2023-09-07 16:20:00'),
        (6, 'uniqid6', '2023-09-07 17:45:00'),
        (7, 'uniqid7', '2023-09-08 08:30:00'),
        (8, 'uniqid8', '2023-09-08 12:00:00'),
        (9, 'uniqid9', '2023-09-09 14:10:00'),
        (10, 'uniqid10', '2023-09-09 15:30:00'),
        (11, 'uniqid11', '2023-09-10 11:20:00'),
        (12, 'uniqid12', '2023-09-10 16:45:00'),
        (13, 'uniqid13', '2023-09-11 09:15:00'),
        (14, 'uniqid14', '2023-09-11 13:40:00'),
        (15, 'uniqid15', '2023-09-12 14:50:00'),
        (25, '65130d72afc20', '2023-09-26 20:42:55');
    /*!40000 ALTER TABLE `visitor` ENABLE KEYS */;
    
    -- tablo yapısı dökülüyor r10.visitor_log
    CREATE TABLE IF NOT EXISTS `visitor_log` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `visitor_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `page_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `action_type` enum('view','click','submit') COLLATE utf8_unicode_ci NOT NULL,
      `log_date` datetime DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `visitor_id` (`visitor_id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    -- r10.visitor_log: 18 rows tablosu için veriler indiriliyor
    /*!40000 ALTER TABLE `visitor_log` DISABLE KEYS */;
    REPLACE INTO `visitor_log` (`id`, `visitor_id`, `page_url`, `action_type`, `log_date`) VALUES
        (1, 'uniqid1', '/anasayfa', 'view', '2023-09-05 10:05:00'),
        (2, 'uniqid2', '/urunler', 'view', '2023-09-05 11:35:00'),
        (3, 'uniqid3', '/hakkimizda', 'view', '2023-09-06 09:50:00'),
        (4, 'uniqid4', '/urunler', 'click', '2023-09-06 14:20:00'),
        (5, 'uniqid5', '/iletisim', 'view', '2023-09-07 16:25:00'),
        (6, 'uniqid6', '/urunler', 'view', '2023-09-07 17:50:00'),
        (7, 'uniqid7', '/hakkimizda', 'view', '2023-09-08 08:35:00'),
        (8, 'uniqid8', '/urunler', 'click', '2023-09-08 12:05:00'),
        (9, 'uniqid9', '/iletisim', 'view', '2023-09-09 14:15:00'),
        (10, 'uniqid10', '/anasayfa', 'view', '2023-09-09 15:35:00'),
        (11, 'uniqid11', '/urunler', 'click', '2023-09-10 11:25:00'),
        (12, 'uniqid12', '/hakkimizda', 'view', '2023-09-10 16:50:00'),
        (13, 'uniqid13', '/anasayfa', 'view', '2023-09-11 09:20:00'),
        (14, 'uniqid14', '/iletisim', 'submit', '2023-09-11 13:45:00'),
        (15, 'uniqid15', '/urunler', 'click', '2023-09-12 14:55:00'),
        (16, '65130d72afc20', '', 'view', '2023-09-26 20:18:42'),
        (18, '65130d72afc20', '/selamsdghsd', 'view', '2023-09-26 20:34:53');
    /*!40000 ALTER TABLE `visitor_log` ENABLE KEYS */;
  • 26-09-2023, 21:08:16
    #8
    denersin @selcukcbk;