PHP 查询的逻辑顺序
Posted
技术标签:
【中文标题】PHP 查询的逻辑顺序【英文标题】:Logical order of PHP queries 【发布时间】: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, 状态 => 活动。
这里有人会以不同的方式编写代码吗?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于PHP 查询的逻辑顺序的主要内容,如果未能解决你的问题,请参考以下文章