【问题标题】:Logical order of PHP queriesPHP 查询的逻辑顺序
【发布时间】:2011-05-12 06:17:38
【问题描述】:

我刚刚为页面的基本轮廓编写了一些代码。它适用于我运行的游戏,但查看代码时我觉得我写错了顺序,而且我执行的查询比我需要的要多。

$query = mysql_query("SELECT * FROM 保镖 WHERE username='$u'"); if($bg = mysql_fetch_assoc($query)) { // 如果你有一个 bg if($bg[status] == "活跃") { echo "你的保镖是$bg[保镖],踢他?"; } 别的 { echo "邀请背景?"; } } 别的 { $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='active'"); if($bg = mysql_fetch_assoc($query)) { // 如果你是 bg echo "你是 $bg[username] 的保镖"; } 别的 { //否则检查是否有人邀请你 $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='invited'"); 而($temp = mysql_fetch_assoc($query)){ echo "$temp[username] 邀请你做他们的保镖,接受还是拒绝?"; } } }

我只使用一个数据库表。如果 player1 有已确认的保镖 (player2),则该行将如下所示:

用户名 => player1, 保镖 => player2, 状态 => 活动。

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

【问题讨论】:

    标签: php mysql logic


    【解决方案1】:

    我会在一个查询中完成:

    $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?";
            }
        }
    }
    

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

    【讨论】:

    • 我仍然需要循环来显示玩家是否有多个邀请。
    • $u 是浏览页面的玩家的用户名,抱歉我忘了说。是的,我最近移动了服务器,新的 PHP conf 开始显示大量通知,因为我习惯于从不引用我的数组键:/
    • @Juddling:抱歉,我没有看到最后一个循环。但是,您仍然可以在单个查询中完成,因为整个结果已经加载到 $query 中。您只需要继续执行mysql_fetch_assoc 即可获取下一行,依此类推。
    • 太棒了!非常感谢。只是想知道,为什么要将 {} 放在变量周围?
    • 这是一种习惯。您可以像以前一样在字符串中传递数组(不带 {})。但是,如果您有多个级别(即:$array['foo']['bar']),您将必须放入 {} 否则 ['bar'] 不会得到评估并最终在输出中作为 ['bar'] (字面意思)。因此,如果我想添加另一个关卡,我不必稍后再更改它,我只需在第一次进行。
    【解决方案2】:

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

    我的 BodyGuardRelations 表可能看起来像

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

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多