2010-09-03 15 views
5

PHP/mySQL का उपयोग करके, उपयोगकर्ता को प्रत्येक दिन अपने सदस्य खाते में एक पूर्णांक बिंदु प्रदान किया जाता है। डेटा का उपयोग यह निर्धारित करने के लिए किया जाएगा कि क्या एक बिंदु दिया जाना चाहिए ये mysql फ़ील्ड हैं: निर्माण दिनांक (टाइमस्टैम्प) और अंतिम लॉगिन (यूनिक्स टाइम)।अनुदान उपयोगकर्ता एक बिंदु प्रत्येक दिन

उपयोगकर्ता इन लॉग इन करने के लिए इन बिंदुओं को प्रदान करने की प्रक्रिया निर्धारित होती है। मेरा सवाल यह है कि अंतिम लॉगिन के बाद से कितने दिन बीत चुके हैं यह निर्धारित करने का सबसे प्रभावी तरीका क्या है? दूसरा, यदि कोई उपयोगकर्ता प्रत्येक दिन लॉग इन करता है, तो मैं कैसे निर्धारित करूं कि 24 घंटे बीत चुके हैं और एक बिंदु दिया जाना है? पिछले दिन दिए गए बिंदुओं के बराबर (1 प्रति दिन)।

वर्तमान में मैं इस कोड का उपयोग कर रहा हूँ:

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

मार्कअप एक तरफ, यह स्पष्ट मेरी कोड अदूरदर्शा है। यदि उपयोगकर्ता रोजाना एक बार लॉग इन करता है, तो उन्हें कोई अंक नहीं मिलता है। इसलिए मुझे निर्माण तिथि फ़ील्ड का उपयोग करके ऐसा करने के लिए सही विधि निर्धारित करनी होगी। मैं आज अपने सिर को इसके चारों ओर लपेट नहीं सकता, कोई सुझाव? धन्यवाद।

+0

मध्यरात्रि में बताए गए समय में निश्चित बिंदु पर अंक दिए जाने पर शायद आसान हो सकता है। उन लोगों के लिए बहुत ही अनुचित, जो 12:01 बजे पंजीकरण करते हैं, जो 11:59 बजे पंजीकृत होते हैं, लेकिन सदस्यता के कुछ महीनों के बाद, इस तरह का अंतर एक गोल करने वाली त्रुटि है। –

+3

आपने कभी भी गणित की तारीख नहीं की है (उर्फ, 86400 से विभाजित करके)। किसी भी वर्ष में, एक 23 घंटे का दिन और एक 25 घंटे का दिन होता है। हमेशा एक बुद्धिमान डेटाटाइम ऑब्जेक्ट का उपयोग करें। अन्यथा ऐसा करने के लिए अपने कार्यक्रम में छिपी हुई बग प्रोग्राम करना है। – riwalk

+0

@ Stargazer712 टिप के लिए धन्यवाद, मैंने कभी ऐसा नहीं माना। – mrtwidget

उत्तर

3

यह PHP के मुकाबले डेटाबेस के लिए बेहतर है। अद्वितीय अनुक्रमणिका (user_id,login_date) के साथ, एक तालिका users_points जोड़ें। नमूना डेटा:

user_id | login_date 
====================== 
19746 | 2010-09-02 
19746 | 2010-09-03 
तो हर बार प्रवेश करने पर

, निशान है कि उपयोगकर्ता है कि तारीख पर में लॉग इन किया है (यदि पंक्ति पहले से मौजूद है, सूचकांक दोहराव कर पाएगा):

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

और प्राप्त करने के लिए अंकों की संख्या:

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

यह भी आप उपयोगकर्ता के लॉग इन किया है दिनों की एक सूची है कि इस मामले में आप मापदंड बदल सकते हैं और एक बयान क्या करना चाहते हैं अच्छा है।

उपयोगकर्ता_आईडी INT है, login_date DATE है, वहां एक उपयोगी सूचकांक है, इसलिए दोनों डालने और चयन त्वरित होना चाहिए, और तालिका बड़ी संख्या में उपयोगकर्ताओं के साथ अपेक्षाकृत छोटी होगी।

मामले में आप कुछ स्थान में संग्रहीत उपयोगकर्ता स्कोर होने पर जोर देते हैं (या शायद आप इसे एक साथ पुनः प्राप्त करने के अन्य उपयोगकर्ता डेटा के साथ चाहते हैं), तो आप प्रवेश पर ऐसा कर सकता है:

  • insert ignore
  • चलाने
  • select count
  • तालिका users तालिका के कॉलम में परिणाम सहेजें।
+0

धन्यवाद Piskvor! मुझे लगता है कि आपकी प्रतिक्रिया ने उन सभी गणनाओं के बारे में अपना मन बदल दिया है, और बस एक टेबल के साथ चिपके हुए हैं। मैं जो कुछ भी पहले से ही कर रहा हूं उसका उपयोग करने में इतना पकड़ा गया हूं, मैंने कभी इस दिशा को नहीं माना। इतना सरल और स्पष्ट (अब), अभी तक इतना प्रभावी है। धन्यवाद! – mrtwidget

+0

@mrtwidget: आपका स्वागत है। – Piskvor

+0

अंकों की संख्या एक मूल्य है जो हर समय उपयोग किया जाता है। हर बार इसकी आवश्यकता होने पर इसकी संसाधनों की बर्बादी है। गणना अवधि के बाद किया जाना चाहिए और मूल्य डीबी से पढ़ा जाना चाहिए। –

3

जब आप उपयोगकर्ता के खाते में बिंदु जोड़ते हैं तो तिथि रखने के लिए एक अलग फ़ील्ड का उपयोग करें। यदि यह आज नहीं हुआ - एक बिंदु (या कई) जोड़ें और एक फ़ील्ड अपडेट करें।

संबंधित मुद्दे