2010-09-03 32 views
5

Sử dụng PHP/mySQL, người dùng được cấp một điểm nguyên duy nhất cho tài khoản thành viên của họ mỗi ngày. Dữ liệu tôi sẽ sử dụng để xác định xem một điểm có nên được cấp là các trường mysql này không: Ngày tạo (dấu thời gian) và Lần đăng nhập gần nhất (UNIX TIME).Cấp cho người dùng một điểm mỗi ngày

Quy trình cấp các điểm này được xác định khi người dùng đăng nhập. Câu hỏi của tôi là, cách hiệu quả nhất để xác định số ngày đã trôi qua kể từ lần đăng nhập cuối cùng? Thứ hai, nếu người dùng đăng nhập mỗi ngày, làm thế nào để tôi xác định xem đã qua 24 giờ và một điểm sẽ được cấp không? Ngày qua tương đương với các điểm được đưa ra (1 mỗi ngày).

Hiện nay tôi đang sử dụng mã này:

/* 
** Updates Points based on days since last visit 
*/ 
static function UpdatePoints($username) 
{ 
    $getlog = System::$mySQL->Select("lastLog, creation FROM users WHERE username='$username'"); 
    $log = System::$mySQL->Fetch($getlog); 

    $offset = (TIME() - $log['lastLog'])/86400; // 24hrs 
    $lastlog = round($offset); // in days 

    if($lastlog > 0) 
    { 
     System::$mySQL->Update("users SET points=points+".$lastlog." WHERE username='$username'"); 
    } 
} 

Markup sang một bên, nó rõ ràng mã của tôi là thiển cận. Nếu người dùng đăng nhập một lần mỗi ngày, họ không đạt được một điểm. Vì vậy, tôi phải xác định phương pháp chính xác để làm như vậy bằng cách sử dụng trường ngày tạo. Tôi chỉ không thể quấn đầu của tôi xung quanh nó ngày hôm nay, bất cứ đề nghị? Cảm ơn.

+0

Có thể dễ dàng hơn nếu bạn chỉ được cấp điểm tại một điểm cố định đúng lúc, vào lúc nửa đêm. Mọi thứ hơi không công bằng với những người đăng ký lúc 12:01 sáng với một người đăng ký lúc 11:59 tối, nhưng sau một vài tháng thành viên, sự khác biệt đó là một lỗi làm tròn. –

+3

KHÔNG BAO GIỜ làm toán ngày như bạn đã làm ở đây (aka, bằng cách chia cho 86400). Trong bất kỳ năm nào, có một ngày 23 giờ và một ngày 25 giờ. Luôn sử dụng một đối tượng datetime thông minh. Để làm khác là để chương trình lỗi ẩn trong chương trình của bạn. – riwalk

+0

@ Stargazer712 Cảm ơn lời khuyên, tôi chưa bao giờ nghĩ đến điều đó. – mrtwidget

Trả lời

3

Điều này phù hợp hơn cho cơ sở dữ liệu so với PHP. Thêm bảng users_points, với chỉ mục duy nhất (user_id,login_date). dữ liệu mẫu:

user_id | login_date 
====================== 
19746 | 2010-09-02 
19746 | 2010-09-03 

Sau đó, trên mỗi đăng nhập, đánh dấu mà người dùng đã đăng nhập vào ngày đó (nếu hàng đã tồn tại, chỉ số sẽ ngăn chặn sự trùng lặp):

INSERT IGNORE INTO `users_points` (`user_id`,`login_date`) VALUES (19746,CURDATE()) 

Và để có được những số điểm:

SELECT COUNT(*) FROM `users_points` WHERE `user_id` = 19746 

Đây cũng là tốt mà bạn có một danh sách ngày khi người dùng đã đăng nhập, trong trường hợp bạn thay đổi các tiêu chí và muốn làm một kể lại.

user_id là INT, login_date là DATE, có chỉ mục có thể sử dụng, vì vậy cả chèn và chọn phải nhanh và bảng sẽ tương đối nhỏ ngay cả với số lượng người dùng lớn.

Trong trường hợp bạn nhấn mạnh vào có số điểm người dùng được lưu trong một số nơi (hoặc có thể bạn muốn lấy nó cùng với dữ liệu người dùng khác), bạn có thể làm điều này trên đăng nhập:

  • chạy insert ignore
  • chạy select count
  • lưu kết quả vào cột của bảng users.
+0

Cảm ơn Piskvor! Tôi nghĩ rằng phản ứng của bạn đã thay đổi suy nghĩ của tôi về việc làm tất cả những tính toán đó, và chỉ gắn bó với một cái bàn. Tôi đã quá quen với việc sử dụng những gì tôi đã có Tôi không bao giờ xem xét hướng này. Rất đơn giản và rõ ràng (bây giờ), nhưng rất hiệu quả. Cảm ơn bạn! – mrtwidget

+0

@mrtwidget: Bạn được chào đón. – Piskvor

+0

Số điểm là giá trị được truy cập mọi lúc. Tính toán mỗi khi cần thiết là lãng phí tài nguyên. Tính toán phải được thực hiện một lần và giá trị sẽ được đọc từ DB. –

3

Sử dụng một trường riêng biệt để giữ ngày khi bạn thêm điểm vào tài khoản của người dùng. Nếu điều này không xảy ra hôm nay - hãy thêm một điểm (hoặc một số) và cập nhật một trường.

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