2013-01-14 2 views
1

컨텍스트 : 간단한 웹 기반 RPG 내에서 싸울 때 사용할 특정 수의 몬스터를 반환하는 데이터베이스를 쿼리하고 있습니다.PHP 루프를 사용하여 MYSQL 데이터베이스를 여러 번 쿼리하십시오.

문제점 : 나는 WHERE 절이 포함 된 간단한 MYSQL 쿼리를 사용하여 몬스터의 "레벨"을 결정합니다. 이전 함수에서 반환해야하는 해당 몬스터의 레벨을 포함하는 배열을 만들고 있습니다. 예 :

$levels = Array([0] => 3 [1] => 1 [2] => 1) 

그래서 위의 배열에서 값은 레벨에 해당합니다. 레벨 3, 레벨 1, 레벨 1의 3 마리의 몬스터를 되 찾으려합니다.

충분히 간단합니다. 이제 MYSQL을 다음과 같이 쿼리하고 아마도 3 회 몬스터를 얻기 위해 쿼리를 3 회 반복하는 루프를 사용하고 싶습니다. 예 :

$query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP"; 
$query .= " FROM Cards"; 
$query .= " WHERE CardTypeId = 1 AND CardRarity = {$level}"; 
$query .= " ORDER BY RAND() LIMIT 1"; 

위 쿼리에서 변수 {$ level}은 이전 배열의 몬스터 레벨입니다. 루프 서식은 내가 고심하고있는 곳이다. 내가 좋아하는 뭔가를 시도하고있다 :이 가까운 생각

while ($i = $levels) { 
    $query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP"; 
    $query .= " FROM Cards"; 
    $query .= " WHERE CardTypeId = 1 AND CardRarity = {$i}"; 
    $query .= " ORDER BY RAND() LIMIT 1"; 
$result_set = mysql_query($query, $connection); 
confirm_query($result_set); 
return $result_set;  
} 

을,하지만 난이 궁극적으로 나에게 MYSQL에서 괴물의 단일 배열을주고받을 수있는 방법을 확인할 수 없습니다. 위의 그림과 같이 3 개의 별도 어레이를 구축하고 있습니까? array_merge()를 사용해야합니까, 아니면 좀 더 우아한 방법이 있습니까? 만약 내가 같은 레벨의 몬스터를 모두 얻는다면 나는 단지 1 시간과 3 분의 1의 질의를 할 수 있습니다. 그러나 나는 이전의 배열이 나타내는 것에 대응하기 위해 몬스터가 필요합니다.

의미가 있습니까? 도움말은 항상 높이 평가됩니다.

+1

[** 새 코드 **에서 mysql_ * 함수를 사용하지 마십시오 (http://bit.ly/phpmsql). 더 이상 유지 관리되지 않으며 공식적으로 사용되지 않습니다 (https://wiki.php.net/rfc/mysql_deprecation). [** 빨간색 상자 **] (http://j.mp/Te9zIL)를 참조하십시오. 대신 [* prepared statements *] (http://j.mp/T9hLWi)에 대해 알아보고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용하십시오. mysqli) - [이 기사] (http://j.mp/QEx8IB)는 어떤 결정을 내리는 데 도움이 될 것입니다. PDO를 선택하면 [여기 좋은 자습서입니다] (http://j.mp/PoWehJ) – vanneto

+0

고마워. 이 프로젝트는 주변에 있었기 때문에 업그레이드하기 위해 드래그했습니다. 그러나 나는 그 변화를 배우기위한 일을 할 것입니다. 감사. –

답변

0

실제로 생각보다 훨씬 쉬웠습니다. 어쩌면 나는 그 문제에 대해 지나치게 설명했다. 여기 내가 한 일이있다.

1) 나는이처럼 보였다 내 배열 $ 수준 반환되면 : 나는 $의 RESULT_SET 2라는 빈 배열)을 생성

$levels = Array([0] => 3 [1] => 1 [2] => 2) 

2) 그런 다음 foreach 루프로 $ 수준의 배열을 통해 루프와 $ levels 배열에서 첫 번째 $ 수준으로 쿼리를 실행했습니다. 그러나 첫 번째 행이 리턴 된 $ result_set를 리턴하는 것이 아니라 2 단계에서 작성한 빈 배열에 첫 번째 행을 삽입했습니다. 각 루프가 끝나면 MYSQL의 새 행이 채워진 $ result_set 배열에 삽입되었습니다.여기

은 결국 어떻게 생겼는지입니다 :

$result_set = array(); 
foreach ($levels as $level) { 
    $query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP"; 
    $query .= " FROM Cards"; 
    $query .= " WHERE CardTypeId = 1 AND CardRarity = {$level}"; 
    $query .= " ORDER BY RAND() LIMIT 1"; 
    $result = mysqli_query($query, $connection); 
    $result_set[] = mysqli_fetch_array($result);  
    confirm_query($result_set); 
} 
return $result_set;  

내 $의 RESULT_SET 이제 각각의 데이터베이스에서 무작위로 선택이 3 괴물, 레벨 3, 레벨 1 및 레벨 2, 다있다 수평.

모든 도움에 감사드립니다.

2

내가 생각하는대로 WHERE IN이 필요합니다.

$query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP"; 
$query .= " FROM Cards"; 
$query .= " WHERE CardTypeId = 1 AND CardRarity IN (".implode(',', $levels).")"; 
$query .= " ORDER BY RAND() LIMIT 1"; 
2

나는 완전히 당신이 뭘하려는 건지 이해하지 않지만,이 루프해야하고 당신에게 당신의 배열을 얻을 : 첫 번째 키가 같은 곳

foreach ($levels as $key => $value) { 
    $query = "SELECT *, CardHP as EncounterCardHP, CardAP as EncounterCardAP FROM Cards WHERE WHERE CardTypeId = 1 AND CardRarity = {$value} ORDER BY RAND() LIMIT 1"; 
    $results = mysqli_query($connection, $query); 
    while($row = $result->fetch_array(MYSQLI_BOTH)) { 
     $monsters[$key]['HP'] = $row['CardHP']; 
     //Add as needed 
    } 
} 

그것은 다차원 배열을 생성 레벨 및 후속 키의 값은 SQL 쿼리의 결과입니다. 객체 지향로서뿐만 아니라 절차 적 스타일을 지원하고 대부분의 기능 대신 mysqli 접두어이기는하지만, 정확히 동일하기 때문에

$monsters = array(
    [0] => array(
     ['HP'] => 10 
     ['AP'] => 5 
    ) 
    [1] => array(
     ['HP'] => 5 
     ['AP'] => 7 
    ) 
) 

또한 모듈, MySQLi 사용하기에 아마 더 낫다.

관련 문제