3

私は尋ねられたすべての質問と答えを見てきましたが、私に最も適した答えを見つけることができないようです. 私がやろうとしているのは、ユーザーが特定の xp 制限に達したときに次のレベルに進むシステムを作成することです。次のXPまでにどれだけのXPが必要かを示します。

そう

lvl1 = 0 => lvl2 = 256 => lvl3 = 785 => lvl4 = 1656 => lvl5 = 2654

どうすればそれを行うことができるので、xp が特定の量にある場合は、次のレベルに必要な xp の量と量を表示します。

4

2 に答える 2

6

あなたはこのようなことを試すことができます:

users_xpデータベースには、user_xp_id(主キー-自動インクリメント )フィールドuser_iduser_xp_amount(デフォルト値:0)フィールドを持つテーブルがあります。ユーザーのxp量を更新する場合は、次のようにする必要があります。

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

function update_user_xp($user_id, $amount, $mysqli) {
    $mysqli->query("UPDATE users_xp 
                    SET user_xp_amount=user_xp_amount+" . $amount . " 
                    WHERE user_id='$user_id'");
}

// we call this function like:
update_user_xp(4, 10, $mysqli); // user_id: 4, update with 10 points

実際のユーザーxp量を取得する場合は、dbテーブルから取得できます。

function get_user_xp($user_id, $mysqli) {
    $sql = $mysqli->query("SELECT user_xp_amount 
                           FROM users_xp 
                           WHERE user_id='$user_id'");
   $row = $sql->fetch_assoc();
   return $row['user_xp_amount'];

}

$xp = array('lvl1' => 0, 'lvl2' => 256, 'lvl3' => 785, 'lvl4' => 1656, 'lvl5' => 2654);

$my_xp = get_user_xp(4, $mysqli); // where 4 is my user id

for($i = 0; $i < count($xp); $i++) {
   if($my_xp == $xp[$i]) {
       echo 'I\'m on level ', ($i+1);
       break;
   }
   else {
       if(isset($xp[$i+1])) {
           if($my_xp > $xp[$i] && $my_xp <= $xp[$i + 1]) {
               echo 'My next level is ', ($i+2), ' and I need ', $xp[$i+1], ' more points for achieving it!';
               break;
            } else {
               echo 'My next level is ', ($i+1), ' and I need ', $xp[$i], ' more points for achieving it!';
               break;
            }
        }
    }
}

後で編集:

CREATE TABLE `my_db_name`.`users_xp` (
`user_xp_id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` BIGINT NOT NULL ,
`user_xp_amount` BIGINT NOT NULL DEFAULT '0'
) ENGINE = InnoDB;
于 2012-11-07T08:15:36.233 に答える
1

柔軟性のために、アプリレベルのロジックではなく、DBテーブルにポイントを保存します。提案されたスキーマは次のとおりです。

テーブルレベル:INT A_I P_K id, INT points, VARCHAR name

テーブルユーザー:(INT A_I P_K id, VARCHAR user, VARCHAR password, INT points, INT level_id基本フィールド)

XPを獲得するすべてのユーザーアクションについて、ユーザーのポイントを更新します。これらすべての行をテーブルから取得levelsし、ユーザーの更新されたポイントでチェックして、必要な結果を生成します:) SQLクエリではORDER by points DESC、ループ内でレベルアップを簡単にチェックできるように注意してください。レベルの更新がある場合は、テーブル内level_idの対応するものと一致するようにユーザーを更新するだけです。のようなものを使用して、彼がいるレベルの名前を表示できます。idlevels"SELECT levels.name FROM levels WHERE levels.id = $users_level_id"

function xpAction(...)ユーザーが実行できるすべてのXP関連のアクションの中で呼び出す標準関数をお勧めします。したがって、彼が投稿を追加し、実行している場合は、適切なパラメーターを使用function addPost($data)して呼び出す行をその中に入れてxpActionください。

于 2012-11-07T08:15:06.950 に答える