Belirli kullanıcılar için bir yönetici mesajı göstermek için en iyi yolu?

5 Cevap php

PHP / MySQL / jQuery bir sosyal ağ sitesi inşa ediyorum. Bir kullanıcı benim siteye giriş sonra, ben DB sorgulamak ve bir varsa bir yönetici duyuru almak istiyorum. Bu, tüm kullanıcılar için sayfa üzerinde gösterir ama bir X üzerine tıklayın ve değil admin yeni bir duyuru mesaj göndermek kadar hiç tekrar göstermek zorunda kalacak bir mesaj kutusu olacak. Eğer X tıklayın asla ve db var duyuru mesajları varsa Yani, her zaman kutusunu kapatmak için X cli9ck yaptım ancak, o zaman sayfaya geri olacak gelmek, sayfanızda Bu mesaj kutusu gösterecektir yayınlanan yeni bir yönetici mesajı olmadıkça, orada olmayacak.

Ben bunu çeşitli yolları olduğunu biliyorum ama ben en verimli şekilde arıyorum.

Ben kullanıcının tablo "admin_message" üzerine ekstra mysql alan eklemek ve 0 olarak işaretlemek eğer yeni bir yönetici mesaj göndermek zaman yönetici mesajı ayarlı ise Bir fikir ben, o, 1 her kullanıcı için kayıt değişecek var 1 o kullanıcının sayfasında gösterir. Kullanıcı kutusunu gizlemek için X tıkladığında o zaman, orada kullanıcı tablo satır güncellemek ve 0'a geri değerini chnage.

Ben Başka bir fikir, bir kullanıcı mesaj gizlemek seçilmiş olup olmadığını kontrol etmek kurabiyelerin kullanmak, i kullanıcı değişik bilgisayarlarla oturum açabilir ve yeni bir mesaj gösterilir, onlar olabilir çünkü bu, daha hızlı ama belki iyi değil olacağını düşünüyorum hemen göremiyorum.

Bu ekstra veritabanı alanını kullanmak için kötü bir fikirdir Yani eğer ben sadece merak ediyorum? Ben 1,000,000 kullanıcıları olsaydı ben yeni bir yönetici bir mesaj yolladı zaman, o Eminim herkes mesajı görebilirsiniz yapmak için 1.000.000 satırları güncellemeniz gerekir. Daha iyi bir yolu var mı? Ayrıca benim site içine kez bir kullanıcı oturum açtığında ben onları görme veya mesaj gizleme yerine her sayfa yük DB bakarak değerini saklamak için bir oturumu kullanır.



UPDATE

Üzgünüm çoğu tepkiler bu yakın bir şey değil bir mesaj sistemine kanat çünkü benim sonrası ben ne demek istediğini açık biraz kafa karıştırıcı ya da değil orada bulundunuz mu düşünüyorum.

Mesajı kelimesini unutun Ben farklı bir kelime ile anlatmaya çalışacağız. Adlı sitede 1 admin var diyelim, o görmek için kullanıcılara bir mesaj göndermeden sadece admin. Kullanıcıların sadece onlar sadece 1 mesaj, yeni mesajı göreceksiniz, sitenin ömrü üzerinde yayınlanan 2352345234 mesajları varsa, o önemli değil, 1 mesajı göreceksiniz.

Şimdi giriş ve sayfada bu mesajı "div" görmek, bazı kullanıcılar bunun bakarak yorulabilir, bu yüzden asla göstererek onu gizlemek mümkün olacak.

Bu orada sayfadaki bu mesajı gösteren bir evet ya da hayır gibi basit olacaktır.

Onlar bir daha asla görmek için tercih kadar ben karar verirseniz Ancak ben görmek tüm kullanıcılar için yeni bir yönetici mesaj göndermek gerekiyor, daha sonra yönetici mesajı göstermek gizlemek ve yok seçti bile kullanıcı yine tekrar göreceğiz.

5 Cevap

Aşağıdaki gibi iki basit çözümler vardır:

İyi: Bu mesaj iletiyi görüntülemek yok görüntülenen belirten bir bayrak içerir, aksi takdirde görüntülemek, kullanıcıların çerez edin. Kullanıcı kapattığında, çerez güncelleyin. Artıları: kesinlikle basittir. Eksileri: Kullanıcı kendi çerezlerini temizlemek veya başka bir makineden oturum halinde bağlı olarak iki kez aynı mesajı görebilirsiniz.

Daha iyi: (şimdi için yönetici kullanıcı tabloda depolamak ve satır aşağı başka bir tabloya bunu kırabilir) yere veritabanında bir bayrak saklayın. Kullanıcı oturum açtığında, 1), kullanıcının çerez veya oturum için bu bayrak kaydetmek 2) veritabanını güncellemek, 3) mesajı gösterilmesi gereken karar. Kullanıcı mesajı kapattığında, çerez / oturum ve DB updare. Artıları: Kullanıcı iki kez mesaj gösterilir geçmez. Eksileri: biraz daha Eğer db bayrağını korumak için ihtiyaç olarak çıkıyor.

Implementation details: For the flag, you could use a message id as suggested already, or more than likely you are already retaining the user's last login timestamp and could use that.

Every user could have a last_message_seen, sizin kullanıcı için "yeni" iletileri (message_id> last_message_seen) sorgulamak zorunda. Eğer [X] yakın (veya zaman aşımı), sonra javascript yeni mesajlarınızı kontrol vesaire ... Eğer

Diğer fikir, o last message seen number in the javascript environment var, ama bu durumda sayfayı terk / yenileme zaman (hesaplanır) reseted olacak, ve DB üzerinde değilse, kullanıcı son sayfası arasına yerleştirilen mesajlar özledim yük ve bu yenileme.

Ya da ... it can be in the Session, bu nedenle herhangi bir kaçırmayın. Eğer oturum açma zaman, sayı bazı "normal" numarasına reseted olduğunu, diyelim: son mesaj, mesaj veya sonra (şimdi - 1s), ya da her neyse ...

Haklısınız kullanıcı için bir oturum açma süresini tutuyor? Bir last_login datetime gibi?

Yani date_created> = last_login tüm iletileri alabilirsiniz. Bunları görüntülemek ardından şimdi last_login zaman güncelleştirme ().

Ben fikir 1. kullanabilirsiniz. Ben kullanıcı mesajı okumak olup olmadığını kontrol etmek için bir bool-alanı kullanmak istemem, ben bazı varsayılan değere sahip, bir datetime-alanını kullanmak istiyorum. Alan == varsayılan, okunmamış eğer. Okuduğunuzda,) (ŞİMDİ alanını ayarlayın.

Eğer kullanıcıların mesajı okumak Yaklaşık olarak ne kadar hızlı olduğunu bu şekilde.

EDIT:

düzenlemeden sonra, ben hala aynı mekanizmayı kullanmak istiyorum. Mesajı okumak olup olmadığını öğrenmek için bir alan gerekiyor. Kullanıcılar (kapatmak için) X tıklarsa, db güncelleme ve okumak gibi mesajı işaretlemek.

Admin mesajlar bir yeni bir mesaj varsa, bu penceresini açar.

Ayrıca sadece son mesaj gösterilebilir, Admin Mesajlar yeni bir kullanıcı önceki mesajı kapatmak olmasaydı neden, sizin messahe için bir yaratılış-datetime gerekir ve.

EDIT2: In reply to this comment:

Even if a user missed am message, only the newest should be shown. Maybe I am misunderstaning but it sounds like you are saying to basicly mark a message read 100,000 times is 100,000 users click the X and I think it should be more on the user table, show or do not show message box, not on an individual basis

something is not locigal in your theory. You want to save the "show/don't show" as a setting, but you want to show the message anyway. How do you know when to overrule the usersetting and when not without remembering whether the system showed the message to the user? Even if you want to just show it once, you'll need a field in the database (on message-level) to store whether the system showed the message to the user or not.

Ben bir admin_message_queue tablo sahip tavsiye ederim. Bu bir mesaj gövdesi, bir kullanıcı kimliği ve bir ileti kimliği olacak. Eğer yeni bir yönetici mesaj göndermek zaman bu tabloya her yönetici kullanıcı için bir kayıt ekleyeceğiz. Onlar sizin oturum açtığınızda sonra sadece kullanıcı ID = kullanıcı oturum açmış olan tüm admin_message_queue satırları seçin.

Sadece yakın düğmesine mesajı kimliğini alır sunucuda bir yönteme bir AJAX geri arama tetikleyen olurdu mesajın kurtulmak için. Bu yöntem mesaj ID = tek yayınlanmıştır admin_message_queue silmek ve kullanıcı ID = oturumu kullanıcı kimliği. Bu şekilde bir kullanıcı bir başkası için mesajları silemezsiniz.

Bunu bu şekilde yaparak inceledi mesajları satırları etrafında tutmak zorunda sizi kurtarır. Neden birisi için bunu gizlemek için biraz geçiş? Artık kullanılan çok sayıda veri etrafında tutarak bitireceğiz.

Updated after question update: Sorry I thought you were trying to show messages to just admins. You could keep this same logic for displaying the most recent message to all users, too. Simply have a table with a userID, message text. Whenever you post a message it will go through and overwrite the message text for all people that have records still existing (people who haven't hidden the message) and add rows for other people. When they hide the message delete that user's row.