2013-10-23 51 views
0

我試圖比較我從用戶獲得的數字和存儲在數據庫中的數字。比較從數據庫和代碼取得的值Yii

基本上,我正在做一個獎勵系統,用戶達到一定數量的積分將被給予一個徽章。現在,我正在做的是,代碼將計算用戶擁有的點數,並將其發送給一個函數,該函數有一個if else用於比較每個徽章的點數和值。

我想現在要做的是,通過將每個徽標的值放入db中以使下一次更新db而不更新代碼更簡單。以下是我現在正在做的事情。

//check total points that the user has 
public function totalPointsValue($userId) { 

    $value = Yii::app()->db->createCommand() 
     ->select('sum(totalPoints) as pointsSum') 
     ->from('fndn_UserTotal') 
     ->where('userId =:id', array(':id'=>$userId)) 
     ->queryRow(); 

    $totalPoints = $value['pointsSum']; 

    return $totalPoints; 
} 

//checks whether the user points is enough for a badge 
public function checkEligable($userId){ 

    $points = $this->totalPointsValue($userId); 

    //is not eligable for a badge 
    if ($points <100){ 
     error_log(" $userId has less than 100 points. Number of points is $points "); 
    } 

    //eligable for the over 100 points badge 
    elseif ($points > 100 && $points <1000){ 
     error_log(" $userId is eligable for over-100 badge. Number of points is $points "); 


    } 

    //eligable for the over 1000 points badge 
    elseif ($points > 1000 && $points <2000){ 
     error_log(" $userId is eligable for over-1000 badge. Number of points is $points "); 


    } 

    //eligable for the over 2000 points badge 
    else { 
     error_log(" $userId is eligable for over-2000 badge. Number of points is $points "); 


    } 

    error_log(print_r($points, true), 3, 'debug.log'); 

} 

我想使它的代碼,檢查數據庫中的值,並與$點進行比較。以下是我的徽章數據庫。

==============

id   badgeName  requiredPoints 
1   over100   100 
2   over500   500 
3   over1000   1000 
4   over2000   2000 

因此,可以說用戶有600點,它會檢​​查該徽章的用戶有權接收。如果$ points> requirePoints,它將授予用戶一個徽章。

回答

0

假設你有表&型號名稱徽章。

編輯: 如果你只是想只徽章水平最接近點用戶得到

function getBadgesOfUser($points){ 
     $achive_badges = ""; 
     $badges = CHtml::listData(Badge::model()->findAll(array(
      'order'=>'requiredPoints', // ASC 
      'condition'=>'requiredPoints>=:rqp', 
      'params'=>array('rqp'=>$points))), 'badgeName', 'requiredPoints'); 

     if(count($badges)>0){ 
      //php 5.4 
      $achive_badges = array_keys($badges)[0]; // I don't use array_shift in this line because it would cause the warning raising in some cases. 

      //following for PHP 5.3 
      $temp = array_keys($badges); $achive_badges = $temp[0]; 

     } 
     return $achive_badges; 
} 

我用比較操作進行排序查詢,這意味着requirePoints列的數據類型必須是數值(INT ,小數等)

+0

我還沒有嘗試過這段代碼,但我有一個問題,什麼是最小值和最大值。不太明白@Telvin –

+0

每個徽章級別都需要用戶獲得該徽章所能獲得的收益點標準表(最小 - 最大)。例如:徽章'500以上'需要min = 500&max = 1000,max = 1000,因爲您的表格記錄表明1000是徽章的下一個等級點500 –

+0

我沒有看過您的輸出。可以說這個點是750,我不想要2個值的數組。我只想要超過500個徽章,而不是超過100個徽章。 –