2010-01-13 32 views
5

Tôi đang xây dựng một trang mạng xã hội trong PHP/MySQL/jQuery. Khi người dùng đăng nhập vào trang web của tôi, tôi muốn truy vấn DB và nhận thông báo quản trị nếu có. Đây sẽ là một hộp thông báo hiển thị trên trang cho tất cả người dùng nhưng nó sẽ có một số X để nhấp vào đó và không hiển thị lại cho đến khi quản trị viên đăng thông báo mới. Vì vậy, nếu bạn không bao giờ nhấp vào X và có thông báo thông báo tồn tại trong db, nó sẽ luôn hiển thị hộp thông báo này trên trang của bạn, tuy nhiên nếu bạn đã cli9ck X để đóng hộp, sau đó bạn quay trở lại trang nó sẽ không ở đó, trừ khi có một thông báo quản trị mới được đăng.Cách tốt nhất để hiển thị thông báo quản trị cho một số người dùng nhất định?

Tôi biết có một số cách để làm điều này nhưng tôi đang tìm cách hiệu quả nhất.

Một ý tưởng tôi có, nếu tôi thêm trường mysql thêm vào bảng của người dùng "admin_message" và đánh dấu là 0, sau đó khi tôi đăng thông báo quản trị mới, nó sẽ thay đổi bản ghi cho mọi người dùng thành 1, nếu quản trị viên tin nhắn được đặt thành 1 sau đó nó hiển thị trên trang của người dùng. Sau đó, khi người dùng nhấp vào X để ẩn hộp, nó sẽ cập nhật có hàng bảng người dùng và chnage giá trị trở lại 0.

Một ý tưởng khác là sử dụng cookie để kiểm tra xem người dùng đã chọn ẩn thư chưa , tôi nghĩ rằng điều này sẽ nhanh hơn nhưng có thể không tốt, vì người dùng có thể đăng nhập bằng các máy tính khác nhau và nếu một thông báo mới được hiển thị, họ có thể không nhìn thấy nó ngay lập tức.

Vì vậy, tôi chỉ tự hỏi có nên sử dụng trường cơ sở dữ liệu bổ sung không? Nếu tôi có 1.000.000 người dùng, khi tôi đăng một thông báo quản trị mới, thì tôi cần phải cập nhật 1.000.000 hàng để đảm bảo mọi người có thể xem tin nhắn. Có cách nào tốt hơn? Ngoài ra khi người dùng đăng nhập vào trang web của tôi, tôi sẽ sử dụng một phiên để lưu trữ giá trị của họ nhìn thấy hoặc ẩn thư thay vì xem xét DB trên mỗi lần tải trang.



CẬP NHẬT

Xin lỗi tôi nghĩ rằng bài viết của tôi có thể về được một chút bối rối hay không rõ ràng về chính xác những gì tôi có nghĩa là bởi vì hầu hết các câu trả lời sẽ được đáp với một hệ thống nhắn tin mà điều này không phải là mọi thứ gần.

Hãy quên đi từ thông báo, tôi sẽ cố giải thích bằng một từ khác. Giả sử có 1 quản trị viên trên trang web, đó là quản trị viên duy nhất có thể đăng thông báo cho người dùng xem. Người dùng sẽ chỉ thấy 1 thư, nếu có 2352345234 thư được đăng trong toàn bộ thời gian của trang web, điều đó không quan trọng, họ sẽ chỉ thấy 1 thư, thư mới nhất.

Bây giờ một số người dùng đăng nhập và thấy thông báo "div" trên trang có thể cảm thấy mệt mỏi khi nhìn vào nó, vì vậy họ sẽ có thể ẩn nó khỏi bao giờ hiển thị lại.

Nó sẽ đơn giản như có hoặc không để hiển thị thông báo này trên trang đó. Tuy nhiên, nếu tôi quyết định tôi cần đăng thông báo quản trị mới để tất cả người dùng nhìn thấy, thì ngay cả người dùng đã chọn ẩn và không hiển thị thông báo quản trị sẽ vẫn thấy thông báo quản trị đó cho đến khi họ chọn không bao giờ thấy lại nó. Quay lại đầu trang

Trả lời

3

Hai giải pháp đơn giản như sau:

Tốt: Kiểm tra các tập tin cookie người dùng, nếu nó có chứa một lá cờ cho thấy thông điệp được hiển thị không hiển thị thông điệp, nếu không hiển thị nó. Khi người dùng đóng nó, hãy cập nhật cookie. Ưu điểm: hoàn toàn đơn giản. Nhược điểm: Người dùng có thể thấy cùng một thông báo hai lần tùy thuộc vào việc họ có xóa cookie hay đăng nhập từ một máy khác hay không.

Tốt hơn: Lưu trữ cờ trong cơ sở dữ liệu ở đâu đó (bạn có thể lưu trữ nó trong bảng người dùng quản trị ngay bây giờ và xuống dòng ngắt nó thành bảng khác). Khi người dùng đăng nhập, 1) lưu cờ này vào cookie hoặc phiên của người dùng, 2) cập nhật cơ sở dữ liệu, 3) quyết định xem thư có cần được hiển thị hay không. Khi người dùng đóng thư, hãy cập nhật cookie/phiên và DB. Ưu điểm: Người dùng không bao giờ được hiển thị thông báo hai lần. Nhược điểm: hơi tham gia nhiều hơn khi bạn cần duy trì cờ trong db.

Chi tiết triển khai: Đối với cờ, bạn có thể sử dụng id thư như đã đề xuất hoặc nhiều khả năng bạn đã giữ lại dấu thời gian đăng nhập cuối cùng của người dùng và có thể sử dụng.

0

Tôi khuyên bạn nên có bảng admin_message_queue. Nó sẽ có nội dung thư, ID người dùng và ID thư. Khi bạn đăng thông báo quản trị mới, nó sẽ thêm bản ghi cho mọi người dùng quản trị viên vào bảng đó. Sau đó, khi họ đăng nhập, bạn chỉ cần chọn tất cả các hàng admin_message_queue nơi ID người dùng = người dùng đã đăng nhập.

Để loại bỏ thư bạn chỉ cần có nút đóng, kích hoạt gọi lại AJAX cho phương thức trên máy chủ nhận ID tin nhắn. Phương thức đó sẽ xóa khỏi admin_message_queue trong đó ID tin nhắn = ID được gửi và ID người dùng = ID người dùng từ phiên. Bằng cách đó, người dùng không thể xóa tin nhắn cho người khác.

Làm theo cách này giúp bạn tránh phải giữ lại các hàng tin nhắn đã xem. Tại sao chuyển đổi một chút để ẩn nó cho ai đó? Bạn sẽ kết thúc việc lưu trữ nhiều dữ liệu không còn được sử dụng nữa.

Cập nhật sau khi cập nhật câu hỏi: Rất tiếc, tôi cho rằng bạn đang cố gắng hiển thị tin nhắn cho quản trị viên chỉ. Bạn có thể giữ cùng một logic này để hiển thị thông điệp gần đây nhất cho tất cả người dùng. Đơn giản chỉ cần có một bảng với một userID, văn bản tin nhắn. Bất cứ khi nào bạn đăng một tin nhắn nó sẽ đi qua và ghi đè lên các tin nhắn văn bản cho tất cả những người có hồ sơ vẫn còn tồn tại (những người không ẩn tin nhắn) và thêm hàng cho người khác. Khi họ ẩn tin nhắn xóa hàng của người dùng đó.

+0

Thực ra nó không phức tạp lắm. Nó sẽ là 1 admin trên trang web và nó sẽ chỉ hiển thị 1 tin nhắn, thông điệp mới nhất sẽ cho mọi người dùng xem, tôi chỉ cần một cách để người dùng ẩn hộp tin nhắn nếu họ chọn hiển thị trên trang đó và một cách để tôi ép buộc hộp ẩn hiển thị nếu tôi đăng một tin nhắn mới. Vì vậy, tôi không cần lưu trữ bất kỳ ID người dùng nào thuộc bất kỳ loại nào và tôi không cần truy vấn mã số đặc biệt – JasonDavis

1

Mỗi người dùng có thể có last_message_seen, vì vậy bạn phải truy vấn thư "mới" (message_id> last_message_seen) cho người dùng của mình. Nếu bạn [X] đóng (hoặc hết thời gian chờ), thì javascript của bạn có thể kiểm tra thư mới và cứ thế ...

Ý tưởng khác là có số số lần xem cuối cùng trong môi trường javascript, nhưng trong trường hợp đó nó sẽ được reseted (tính toán lại) khi bạn refresh/từ bỏ trang, và nếu nó không phải trên DB, người dùng của bạn có thể bỏ lỡ các thông điệp được chèn vào giữa tải trang cuối cùng và làm mới này.

Hoặc ... nó có thể nằm trong Phiên, vì vậy bạn không bỏ lỡ bất kỳ. Khi bạn đăng nhập, số được gửi lại thành một số "bình thường", giả sử: tin nhắn cuối cùng, hoặc tin nhắn sau (bây giờ - 1h), hoặc bất cứ điều gì ...

1

Tôi sẽ sử dụng ý tưởng số 1. Tôi sẽ không sử dụng một trường bool để kiểm tra xem người dùng có đọc thông báo hay không, tôi sẽ sử dụng trường datetime, với một số giá trị mặc định. Nếu trường == mặc định, chưa đọc. Khi đọc, hãy đặt trường NOW().

Bằng cách đó, bạn biết khoảng cách người dùng của bạn đọc tin nhắn nhanh đến mức nào.

EDIT:

sau khi chỉnh sửa của bạn, tôi muốn vẫn sử dụng cơ chế tương tự. Tin nhắn cần một trường để tìm hiểu xem có đọc hay không. Nếu người dùng nhấp vào X (để đóng), hãy cập nhật db và đánh dấu thư là đã đọc.

Nếu quản trị viên đăng thông báo mới, thông báo này sẽ bật lên.

Bạn cũng cần tạo ngày giờ cho messahe của bạn, gây ra nếu người dùng không đóng thư trước đó và quản trị viên đăng bài mới, chỉ thư mới nhất có thể được hiển thị.

EDIT2: Trong trả lời bình luận này:

Thậm chí nếu người dùng bỏ lỡ thông điệp sáng, chỉ mới nhất sẽ được hiển thị.Có lẽ tôi đang hiểu lầm nhưng có vẻ như bạn đang đang nói rằng đánh dấu một thông điệp là đọc 100.000 lần 100.000 người dùng nhấp vào X và tôi nghĩ rằng nó phải là nhiều hơn trên bảng người dùng, hiển thị hoặc không hiển thị hộp thư , không phải trên một cá nhân cơ sở

điều gì đó không phải là vị trí trong lý thuyết của bạn. Bạn muốn lưu "hiển thị/không hiển thị" dưới dạng cài đặt, nhưng bạn vẫn muốn hiển thị thông báo. Làm cách nào để bạn biết khi nào sẽ ghi đè người dùng và khi nào không nhớ liệu hệ thống có hiển thị thông báo cho người dùng không? Thậm chí nếu bạn muốn chỉ hiển thị nó một lần, bạn sẽ cần một trường trong cơ sở dữ liệu (trên mức tin nhắn) để lưu trữ xem hệ thống có hiển thị thông báo cho người dùng hay không.

+0

Ngay cả khi người dùng bỏ lỡ thư, chỉ hiển thị thông báo mới nhất. Có lẽ tôi đang hiểu sai nhưng có vẻ như bạn đang nói để đánh dấu một thông điệp một cách cơ bản là 100.000 lần là 100.000 người dùng nhấp vào X và tôi nghĩ rằng nó nên được nhiều hơn trên bảng người dùng, hiển thị hoặc không hiển thị hộp tin nhắn, chứ không phải trên cơ sở cá nhân – JasonDavis

+0

Nó không ở cấp độ tin nhắn, ok để làm cho nó đơn giản để hiểu, cho phép giả vờ chỉ có 1 tin nhắn EVER được thực hiện và tôi chỉ cập nhật tin nhắn/bình luận/thông báo bất cứ điều gì bạn muốn gọi nó. Khi tôi cập nhật nó sau đó mọi người dùng sẽ thấy nó trên trang ngay cả khi họ chọn không nhìn thấy chúng. Các thiết lập để ẩn nó chỉ là để ẩn nó cho đến khi tôi cập nhật/gửi một cái mới. Tôi nghĩ rằng tôi đã nhận ra nó bây giờ, tôi sẽ thêm một lĩnh vực thiết lập để DB hiển thị hoặc không hiển thị thông báo trang chủ/tin nhắn – JasonDavis

+0

cảm ơn vì đã cố gắng hiểu những gì tôi đang nói, tôi biết thật khó để giải thích mọi thứ – JasonDavis

1

Bạn đang giữ thời gian đăng nhập cho người dùng phải không? Giống như một datetime last_login?

Vì vậy, hãy nhận tất cả thư có date_created> = last_login. Hiển thị chúng, sau đó cập nhật last_login time to now().

Các vấn đề liên quan