2013-02-17 1 views
0

여러 개의 방을 동시에 실행할 수있는 게임을 만들고 있습니다. 나는 모든 객실에 관한 정보를 담고있는 MySQL 테이블 "rooms"을 가지고있다.PHP - 데이터베이스의 일부 필드 만 반복하는 모범 사례

이 테이블의 필드에는 "id", 방의 숫자 ID 및 "user1"에서 "user6"까지 방의 사용자의 숫자 ID가 포함됩니다.

//query() is just a function which implements mysqli::query with logging, 
// error handling, etc. It uses the same connection on each call so 
// there is no overhead of opening a new connection. 
$q = query("SELECT id,some_other_fields,user1,user2,user3,...,user6 FROM rooms"); 
while($r = $q->fetch_assoc()){ 
    //some stuff here 

    foreach(array($r['user1'],$r['user2'],...,$r['user6']) as $user) 
     stuff((int)$user); 

    //some more stuff 
} 

당신이 볼 수 있듯이, 내가 명시 적으로에 대한 배열을해야 :

한 페이지에, 나는 모든 객실에 대한 이러한 정보를 몇 가지 물건을 할 필요가, 내 현재 코드는 뭔가처럼 사용자가 그것을 반복합니다.
더 좋은 방법이 있습니까?

$q = query("SELECT id,some_other_fields FROM rooms"); 
while($r = $q->fetch_assoc()){ 
    //some stuff here 

    foreach(query("SELECT user1,user2,user3,...,user6 FROM rooms WHERE id=".$r['id'])->fetch_assoc() as $user) 
     stuff((int)$user); 

    //some more stuff 
} 

객실의 수는 일반적으로 약 10 ~ 20 될 경우,이 적절할 것 :

그리고이 코드를 고려하고? 쿼리를 수행하기 전에 단 한 줄의 코드를 변경하는 동안

+1

가능한 한 적은 양의 SQL 문을 사용하는 것이 가장 이상적입니다. 사용자를 선택하는 유일한 이유가 루프를 통과하는 것이라면 ['CONCAT_WS'] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws)를 사용할 수 있습니다.)를 하나의 변수로 가져온 다음 배열로 [explose] (http://www.php.net/manual/en/function.explode.php)합니다. – Jon

+0

주어진 방에 항상 정확히 6 명의 사용자가 있습니까? 그것도 선수의 수에요? – FoolishSeth

+0

최대 플레이어 수는 6이지만 항상 정확하게 6 일 필요는 없습니다. "0"은 "사용자 없음"을 나타냅니다. (그리고'물건들 '이 이것에 적절하게 반응 할 것입니다) – TwiNight

답변

1

그런 다음 당신이 당신의 쿼리 및 루프를 변경할 수 있습니다이

$fields = array('user1','user2','user3','user4'); 

$q = query("SELECT id,some_other_fields, ". implode($fields, ',') ." FROM rooms"); 
while($r = $q->fetch_assoc()){ 
    //some stuff here 

    foreach($fields as $field) 
     stuff((int)$r[$field]); 

    //some more stuff 
} 

처럼, 필드의 배열을 확인합니다.