2010-11-18 120 views
0

我剛剛爲一個頁面的基本輪廓寫了一些代碼。它用於我運行的遊戲,但是看着代碼,我覺得我已經寫錯了順序,而且我執行的查詢比我需要的還要多。PHP查詢的邏輯順序

 

    $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 => active。

這裏有人會用不同的方式編寫代碼嗎?

回答

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])。

+0

我還需要循環顯示,如果玩家有一個以上的邀請。 – Juddling 2010-11-18 20:16:46

+0

$ u是查看該頁面的玩家的用戶名,對不起,我忘了提及。是的,我最近移動的服務器和新的PHP conf開始顯示負載的通知,因爲我習慣於從未引用我的數組鍵:// – Juddling 2010-11-18 20:18:15

+0

@Juddling:對不起,我沒有看到那裏的最後一個循環。但是,您仍然可以在單個查詢中完成該操作,因爲整個結果已經在$ query中加載。你只需要繼續執行'mysql_fetch_assoc'來獲取下一行,依此類推。 – netcoder 2010-11-18 20:27:28

0

每當我在表中的兩個實體之間有一個關聯時,我通常會創建另一個表來保存關係。

BodyGuardRelations表可能看起來像

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