PHP查询的逻辑顺序

时间:2010-11-18 19:55:59

标签: php mysql logic

我刚刚为页面的基本轮廓编写了一些代码。它适用于我运行的游戏,但是查看代码我觉得我已经按错误的顺序编写了代码,而且我执行的查询次数超出了我的需要。


    $query = mysql_query("SELECT * FROM bodyguards WHERE username='$u'");

    if($bg = mysql_fetch_assoc($query)) { // if you have a bg
        if($bg[status] == "active") {
            echo "your bodyguard is $bg[bodyguard], kick him?";
        } else {
            echo "invite a bg?";
        }
    } else {
        $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='active'");

        if($bg = mysql_fetch_assoc($query)) { // if you are a bg
            echo "you are the bodyguard of $bg[username]";
        } else {
            //otherwise check if anyone has invited you

            $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='invited'");

            while($temp = mysql_fetch_assoc($query)) {
                echo "$temp[username] has invited you to be their bodyguard, accept or decline?";
            }
        }
    }

我只使用一个数据库表。如果一个玩家1有一个确认的保镖(玩家2),那么该行看起来像是:

username => PLAYER1, bodyguard => player2, status =>活性

这里的任何人都会以不同的方式编写代码吗?

2 个答案:

答案 0 :(得分:3)

我会在一个查询中完成它:

$query = mysql_query("SELECT * FROM bodyguards WHERE username='$u' OR (bodyguard='$u' AND (status='active' OR status='invited')");

$bg = mysql_fetch_assoc($query);

if ($bg) { // check for empty result first, to prevent E_NOTICE
    if ($bg['username'] == $u) {
        if($bg['status'] == "active") {
            echo "your bodyguard is {$bg['bodyguard']}, kick him?";
        } else {
            echo "invite a bg?";
        }
    } else if ($bg['bodyguard'] == $u) {
        if ($bg['status'] == "active") {
            echo "you are the bodyguard of {$bg['username']}";
        } else if ($bg['status'] == "invited") {
            echo "{$bg['username']} has invited you to be their bodyguard, accept or decline?";
        }
    }
}

注意:如果数据是由用户使用$u提供的,请确保您转义mysql_real_escape_string。另外,请确保引用数组索引以防止PHP通知(即:使用$bg['username']而不是$bg[username])。

答案 1 :(得分:0)

每当我在一个表中的两个实体之间存在关联时,我通常会创建另一个表来保持这种关系。

我的 BodyGuardRelations 表可能看起来像

[id] [userId] [bodyGuardUserId] [status]
1    27       55                Active
2    43       89                Invited