2010-09-03 17 views
5

PHP/mySQL kullanarak, kullanıcılara her gün üye hesaplarına tek bir tamsayı verilir. Bir noktanın verilmesinin gerekip gerekmediğini belirlemek için kullanacağım veriler şu mysql alanlarıdır: Oluşturulma Tarihi (zaman damgası) ve Son Giriş (UNIX TIME).Herkese Bir Nokta Verme Her Gün

Bu noktaları verme prosedürü, kullanıcı oturum açtığında belirlenir. Sorum şu: Son girişten bu yana kaç gün geçtiğini belirlemenin en etkili yolu nedir? İkinci olarak, eğer bir kullanıcı her gün günlüğe girerse, 24 saat geçip geçmediğini ve bir puan verilip verilmeyeceğini nasıl belirleyebilirim? Günler geçmiş verilen noktalara eşittir (günde 1).

Şu anda bu kodu kullanıyorum:

/* 
** 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'"); 
    } 
} 

Biçimlendirme kenara, benim kod öngörüsüzlüktür açıktır. Kullanıcı hergün bir kez giriş yaparsa, puan kazanmazlar. Bu nedenle, Oluşturulma Tarihi alanını kullanarak bunu yapmak için doğru yöntemi belirlemeliyim. Kafamı bugün etrafta dolamıyorum, herhangi bir öneri? Teşekkürler.

+0

Puanları sadece sabit bir noktada verdiyseniz, gece yarısında söylerseniz daha kolay olabilir. Her biri, saat 12: 1'de kayıt yaptıranlara karşı çok az haksızlık ediyor, 11:59 saatte kayıt yaptıran bir kişi, ancak birkaç aylık üyelikten sonra, bu tür bir farklılık bir yuvarlama hatasıdır. –

+3

ASLA burada yaptığınız gibi matematik yapmayın (aka, 86400'e bölerek). Herhangi bir yılda, bir 23 saat ve bir 25 saat var. Her zaman bir akıllı datetime nesnesi kullanın. Aksi halde programınızda gizli hataları programlamaktır. – riwalk

+0

@ Stargazer712 Bahşiş için teşekkürler, bunu hiç düşünmedim. – mrtwidget

cevap

3

Bu, veritabanı için PHP'den daha uygundur. Benzersiz bir dizin (user_id,login_date) ile bir tablo users_points ekleyin. Örnek veri:

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

Ve almak için: Her girişte Sonra

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

, (satır zaten varsa, endeks tekrarını önleyecek) kullanıcı bu tarihte giriş yaptığını işaretlemek puan sayısı:

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

Bu kullanıcı oturum zaman kriterlerini değiştirip yeniden sayılmasını yapmak istiyorum durumda, günler listesi var olması da iyidir.

user_id kullanılabilir bir endeks var, bir INT, login_date bir DATE olduğunu, bu nedenle her iki uç basıp hızlı olmalı ve tablo bile kullanıcıların büyük bir sayı ile nispeten küçük olacaktır. durumda

bazı yerde depolanan kullanıcı puanı olan ısrar (ya da belki diğer kullanıcı bilgileri ile birlikte almak istiyorum), Girişin üzerinde yapabilirsiniz:

  • insert ignore
  • çalıştırmak
  • 'u kullanarak sonucu tablo users sütununda kaydedin.
+0

Teşekkürler Piskvor! Cevabın, tüm bu hesaplamaları yapmakla ilgili fikrimi değiştirdiğini ve sadece bir masaya yapıştığını düşünüyorum. Zaten sahip olduğum şeyi kullanmaya başladım, bu yönü hiç düşünmedim. Çok basit ve açık (şimdi), ancak bu kadar etkili. Teşekkür ederim! – mrtwidget

+0

@mrtwidget: Rica ederim. – Piskvor

+0

Noktaların sayısı, her zaman erişilen bir değerdir. Her gerektiğinde hesaplamak, kaynak israfıdır. Hesaplama bir süre sonra yapılmalı ve değer DB'den okunmalıdır. –

3

Kullanıcı hesabına noktayı eklediğiniz tarihi tutmak için ayrı bir alan kullanın. Bu bugün olmazsa - bir nokta (veya birkaç) ekleyin ve bir alanı güncelleyin.