2013-01-14 45 views
1

上下文:我在查詢數據庫以返回指定數量的怪物,用於在簡單的基於Web的RPG中的戰鬥中使用。使用PHP循環多次查詢MYSQL數據庫

問題:我有一個簡單的MYSQL查詢,它包含一個WHERE子句來確定怪物的「級別」。在前面的函數中,我正在構建一個包含應該返回的相應怪物級別的數組;像這樣:

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

所以在上面的數組中,值對應的級別。所以我期待返回3個怪物 - 等級3,等級1和等級1.

夠簡單。現在我想用下面的語句來查詢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

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](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)當我回到我的數組$水平,這是這樣的:

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

2)我創建)一個名爲$ result_set 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查詢的結果。

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

此外,mysqli的可能是更好的爲你使用,因爲它支持程序風格,以及面向對象和大部分功能是完全一樣的,儘管有mysqli的前綴來代替。