• 15-01-2023, 20:11:43
    #1
    Merhaba arkadaşlar;

    Öncelikle ne yaptığımı yapmak istediğimi açıklayayım kişi konuya girdiği zaman konu 1 kez okundu olarak veri tabanına kayıt ekletiyorum. Kişi sayfayı tekrar yenilediğinde ise kayıt ekletmiyorum. Gayet iyi fakat google chrome ve Edge tarayıcısında güzel çalışıyor ama Mozilla Firefox tarayıcısında sayfa yenilensede cache kontrolü yapmıyor veriyi defalarca kayıt etmiş oluyor.

    Mozilla firefox tarayıcıda ağ yönetimine baktığımda böyle yazıyor. => Cache-Control : no-store, no-cache, must-revalidate

    Buraya yazıp sizi rahatsız etmemek için çok araştırdım fakat bir yöntem bulamadım. Bir fikrinizi alabilir miyim?

    <?php
    $pageRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) &&($_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0' || $_SERVER['HTTP_CACHE_CONTROL'] == 'no-cache');
    if($pageRefreshed == 0){
    echo 'Sayfa yenilendi.';
    }else{
    echo 'İlk defa geldiği için işlem yap veri tabanına ekle ';
    }
    ?>
  • 15-01-2023, 20:19:10
    #2
    HTTP_CACHE_CONTROL mozilla da kullanılmıyor onun yerine session kullan

    bunu kullana bilirsin

    <?php session_start(); if(!isset($_SESSION['visited'])){ echo "İlk defa geldiği için işlem yap veri tabanına ekle"; $_SESSION['visited'] = true; }else{ echo "Sayfa yenilendi."; } ?>
  • 15-01-2023, 20:31:31
    #3
    @Royxr_cod;

    Hocam çok teşekkür ederim mozilla firefox da işe yaradı fakat google chrome da denedim işe yaramıyor.

    Hem mozilla hem chrome da kullana bileceğim bir yöntem varsa yaza bilir misin?
  • 15-01-2023, 20:33:34
    #4
    Ertenya adlı üyeden alıntı: mesajı görüntüle
    @Royxr_cod;

    Hocam çok teşekkür ederim mozilla firefox da işe yaradı fakat google chrome da denedim işe yaramıyor.

    Hem mozilla hem chrome da kullana bileceğim bir yöntem varsa yaza bilir misin?
    session her yerde çalışır hocam
  • 28-01-2023, 11:09:27
    #5
    Mozilla Firefox tarayıcısı, sayfa yenilendiğinde "no-store" ve "no-cache" özellikleri ile HTTP Cache-Control başlığını gönderir. Bu nedenle, sadece sayfa ilk defa yüklendiğinde işlem yapmak istediğinizde, $_SERVER['HTTP_CACHE_CONTROL'] değişkenini kontrol etmeli ve "max-age=0" veya "no-cache" değerine eşit olup olmadığını kontrol etmelisiniz.

    Ancak, bazı tarayıcılar sayfa yenilendiğinde bu değişkeni göndermeyebilir. Bu nedenle, alternatif bir yöntem de, sayfa yenilendiğinde çerezleri kontrol etmek olabilir. Aşağıda örnek bir PHP kodunu görebilirsiniz:

    <?php
    // Sayfa yenilendiğinde çerezleri kontrol et
    if(isset($_COOKIE['pageRefreshed'])) {
    echo 'Sayfa yenilendi.';
    } else {
    // İlk defa ziyaret edildi
    echo 'İlk defa geldiği için işlem yap veri tabanına ekle ';
    // Çerezi oluştur
    setcookie('pageRefreshed', 1, time() + 3600);
    }
    ?>

    Bu kod, sayfa ilk defa yüklendiğinde çerez oluşturur ve sayfa yenilendiğinde çerezi kontrol eder. Bu yöntem, tüm tarayıcılar için çalışacaktır.

    Ayrıca, Tarayıcı özelliklerine göre oluşan bu sorunları çözmek için JavaScript kodlarını kullanarak da çözümler bulunabilir. Örneğin, tarayıcının sayfa yenilendiğini algılamak için window.performance.navigation özellikleri kullanılabilir.



    MySQL veritabanı ile bu PHP kodu kullanılabilir. Örneğin, "konu" adında bir tablo olsun ve "konu_id", "konu_baslik", "konu_okundu" gibi sütunlar olsun. İlk defa sayfaya girdiğinde, "konu_okundu" sütununun değeri 1 olarak güncellenebilir ve tekrar sayfaya girdiğinde veritabanına yeni bir kayıt eklenmeyecektir.

    Aşağıda örnek bir MySQL sorgusu verilmiştir:

    if($pageRefreshed == 0){
    $sql = "UPDATE konu SET konu_okundu = 1 WHERE konu_id = '$konu_id'";
    mysqli_query($link, $sql);
    echo 'Sayfa yenilendi.';
    }else{
    echo 'İlk defa geldiği için işlem yap veri tabanına ekle ';
    }

    Bu kod bloğunda, sayfa yenilendiğinde veritabanındaki konunun okundu sayısını arttırırken, sayfa ilk defa açıldığında bir işlem yapmaz.

    Ancak, dikkat etmeniz gereken bir nokta var ki oda, üstteki kod bloğunda MySQL sorgusu için gerekli olan mysqli bağlantısının açık olmasıdır. Ayrıca, konu_id değişkeninin tanımlanmış olduğundan emin olmanız gerekir.
  • 28-01-2023, 11:54:33
    #6
    @alit;

    Hocam çok teşekkürler bu _COOKIE olayı çok daha mantıklı geldi.

    Peki her ayrı konuda yeni bir _COOKIE mi üretmeliyim?

    Teşekkürler.
  • 28-01-2023, 12:39:10
    #7
    Ertenya adlı üyeden alıntı: mesajı görüntüle
    @alit;

    Hocam çok teşekkürler bu _COOKIE olayı çok daha mantıklı geldi.

    Peki her ayrı konuda yeni bir _COOKIE mi üretmeliyim?

    Teşekkürler.
    Evet, her ayrı konuda farklı bir çerez oluşturmanız gerekir. Örneğin, "konu1_okundu", "konu2_okundu" gibi farklı isimlerle çerezler oluşturabilirsiniz. Böylece, kullanıcının hangi konuları yenilendiğini ve hangilerinin ilk defa okunduğunu takip edebilirsiniz. Ayrıca, çerezleri süresi dolmuşsa silebilirsiniz.
  • 28-01-2023, 12:44:13
    #8
    Ayrıca çerezlerin silinmesi için setcookie() fonksiyonunun ikinci parametresi olarak -1 kullanabilirsiniz.

    setcookie('konu_id_'.$konu_id, -1, time() - 3600);


    Bu şekilde çerez 1 saat önce oluşturulduğu zaman silinir.
  • 28-01-2023, 12:48:21
    #9
    İnsert işlemimi yapıyorsunuz okuduğunda eğer böyle yapıyor iseniz.

    Link cookie değeri vb bilgilerle insert işleminin sonuna on duplicate key update derseniz 2. kayıt oluşmaz mevcutu güncellemeye çalışır