Php 用户类组合函数

Php 用户类组合函数,php,sql,pdo,Php,Sql,Pdo,我最近开始阅读有关类和函数的内容,以便为我所属的在线游戏社区创建一个用户系统。我目前有三个表为我提供用户数据:部门、等级和用户 用户表如下所示: user_id | user_name | char_name | email | password | rank_id rank_id | rank_name | div_id div_id | div_name 排名表类似于: user_id | user_name | char_name | email | password | rank_

我最近开始阅读有关类和函数的内容,以便为我所属的在线游戏社区创建一个用户系统。我目前有三个表为我提供用户数据:部门等级用户

用户表如下所示:

user_id | user_name | char_name | email | password | rank_id
rank_id | rank_name | div_id
div_id | div_name
排名表类似于:

user_id | user_name | char_name | email | password | rank_id
rank_id | rank_name | div_id
div_id | div_name
分区表如下所示:

user_id | user_name | char_name | email | password | rank_id
rank_id | rank_name | div_id
div_id | div_name
大约有100个军衔,每个军衔在一个特定的师中。例如,等级1-5为1级,等级6-10为2级,依此类推

下面是旧代码

我创建了一个User类,其中包含一些函数来获取我需要的数据,但我觉得我做得不对,因为使用了很多SELECT语句,我在测试页面上调用了所有三个函数来获取数据

我的用户课程如下:

require_once('dbcon.php');
class User {
    public static function all_users() {
        global $conn;
        $records = $conn->prepare('SELECT * FROM users');
        $records->execute();
        $results = $records->fetchAll(PDO::FETCH_ASSOC);
        return $results;
    }
    public static function by_id($userid=0) {
        global $conn;
        $records = $conn->prepare('SELECT * FROM users WHERE user_id = :userid');
        $records->bindParam(':userid', $userid);
        $records->execute();
        $results = $records->fetch(PDO::FETCH_ASSOC);
        return $results;
    }
    public static function get_rank($userid=0) {
        global $conn;
        $records = $conn->prepare('SELECT * FROM users WHERE user_id = :userid');
        $records->bindParam(':userid', $userid);
        $records->execute();
        $results = $records->fetch(PDO::FETCH_ASSOC);
        $rankid = $results['rank_id'];
        $records2 = $conn->prepare('SELECT * FROM ranks WHERE rank_id=:rankid');
        $records2->bindParam(':rankid', $rankid);
        $records2->execute();
        $results2 = $records2->fetch(PDO::FETCH_ASSOC);
        return $results2['rank_name'];
    }
    public static function get_div($userid=0) {
        global $conn;
        $records = $conn->prepare('SELECT * FROM users WHERE user_id = :userid');
        $records->bindParam(':userid', $userid);
        $records->execute();
        $results = $records->fetch(PDO::FETCH_ASSOC);
        $rankid = $results['rank_id'];
        $records2 = $conn->prepare('SELECT * FROM ranks WHERE rank_id=:rankid');
        $records2->bindParam(':rankid', $rankid);
        $records2->execute();
        $results2 = $records2->fetch(PDO::FETCH_ASSOC);
        $divid = $results2['div_id'];
        $records3 = $conn->prepare('SELECT * FROM divisions WHERE div_id = :divid');
        $records3->bindParam(':divid', $divid);
        $records3->execute();
        $results3 = $records3->fetch(PDO::FETCH_ASSOC);
        return $results3['div_name'];
    }
}
我获取个人数据的测试页面是:

require_once('inc/dbcon.php');
require_once('inc/user.php');
echo "<strong>ALL USERS</strong><br><br>";
$users = User::all_users();
foreach ($users as $user) {
    $rank = User::get_rank($user['user_id']);
    $div = User::get_div($user['user_id']);
    echo "User Name: " . $user['user_name'] . ".<br>";
    echo "Character Name: " . $user['char_name'] . ".<br>";
    echo "Rank: " . $rank . ".<br>";
    echo "Division: " . $div . ".<br>";
    echo "<br><br>";
}
echo "<strong>USER 1</strong><br><br>";
$singleuser = User::by_id(1);
$rank = User::get_rank($singleuser['user_id']);
$div = User::get_div($singleuser['user_id']);
echo "User Name: " . $singleuser['user_name'] . ".<br>";
echo "Character Name: " . $singleuser['char_name'] . ".<br>";
echo "Rank: " . $rank . ".<br>";
echo "Division: " . $div . ".<br>";
DB.CLASS.PHP

USER.CLASS.PHP

我已经在一个测试文件中测试了上述内容

TEST.PHP

根据其中一条评论的要求,以下是表格和一些示例数据。同样,一切都按预期进行。我只是想回答问题1和2,看看这个设置是否正确。这是有限的测试数据。大约有100个等级,将有大约100个用户


根据用户的排名id,他们将拥有适当的排名名称,并进入相应的部门。

请全球用户不要插手……谢谢,我想?我将研究为什么不应该使用globals。除此之外。。。关于如何压缩/使其更好,还有其他帮助吗?我使用测试数据将SQL转储添加到编辑中,以便您可以根据需要查看它。我主要只需要回答新的问题1和2,以确保这个系统是合理的,并且结构正确,因为原始代码已经过时了。DDL还可以,mysql没有什么可以做的(数据规范化似乎是正确的)。但是你的代码还是一团糟。使用常量更改其状态的类与全局变量一样糟糕。看看依赖倒置原理。数据库有一个状态(已连接、已断开连接等)。使用连接的类也有状态。静态方法应该是无状态的(通常是无状态的,有一些例外)。在codereview.stackexchange.com上你可能会更走运