2012-09-24 22 views
-1

我有一個功能,在一個PHP的遊戲,那裏是一個for循環檢查室IDS使用。基本上,for循環只運行一次,當它運行兩次。下面的代碼塊說明了(第一與$ i循環):PHP:對於僅環遍歷一次

// successful sql login & $player is correctly set with '', and all below sql 
// statements execute correctly. $count is 2 
function setMonstersLocation($player,$rooms_id){ 
if (mysql_result(mysql_query("SELECT state FROM present WHERE player = $player AND items_id IS NULL AND monsters_id IS NULL AND quantity IS NULL AND rooms_id IS NOT NULL"),0) == 0){ 
    $sql = mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id > 100 AND monsters_id < 300"); 
    $count = mysql_result($sql,0); 
    $sql = mysql_query("SELECT monsters_id FROM present WHERE player = $player AND items_id IS NULL AND monsters_id > 100 AND monsters_id < 300 ORDER BY monsters_id"); 
    for ($i = 0; $i < $count; $i+= 1) { 
     $sql = mysql_query("SELECT monsters_id FROM present WHERE player = $player AND items_id IS NULL AND monsters_id > 100 AND monsters_id < 300 ORDER BY monsters_id"); 
     $result = mysql_result($sql,$i); 
     if (mysql_result(mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id=$result AND quantity = 1"),0) == 1){ 
      $final = -1; 
      $array[1] = $rooms_id - 1; 
      $array[2] = $rooms_id + 1; 
      $array[3] = $rooms_id - 100; 
      $array[4] = $rooms_id + 100; 
      $array[5] = $rooms_id - 200; 
      $array[6] = $rooms_id - 101; 
      $array[7] = $rooms_id - 99; 
      $array[8] = $rooms_id - 2; 
      $array[9] = $rooms_id + 200; 
      $array[10] = $rooms_id + 101; 
      $array[11] = $rooms_id + 99; 
      $array[12] = $rooms_id + 2; 
      if ($result < 200){ 
       for ($j = 1; $j < 5; $j+=1){ 
        $sql = mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id IS NOT NULL AND rooms_id={$array[$j]}"); 
        $count = mysql_result($sql,0); 
        $sql = mysql_query("SELECT COUNT(*) FROM rooms WHERE (rooms_id={$array[$j]})"); 
        $roompresent = mysql_result($sql,0); 
        if ($count == 0 and $final == -1 and $roompresent == 1){ 
         $final = $array[$j]; 
        } 
       } 
      } else if ($result > 200){ 
       for ($k = 1; $k < 13; $k+=1){ 
        $sql = mysql_query("SELECT COUNT(*) FROM present WHERE (player = $player AND items_id IS NULL AND monsters_id IS NOT NULL AND rooms_id={$array[$k]})"); 
        $count = mysql_result($sql,0); 
        $sql = mysql_query("SELECT COUNT(*) FROM rooms WHERE (rooms_id={$array[$k]})"); 
        $roompresent = mysql_result($sql,0); 
        if ($count == 0 and $final == -1 and $roompresent == 1){ $final = $array[$k]; } 
       } 
       if ($final == -1){ 
        $sql = mysql_query("SELECT COUNT(*) FROM rooms"); 
        $count = mysql_result($sql,0); 
        $sql = mysql_query("SELECT rooms_id FROM rooms"); 
        for ($l = 0; $l < $count; $l+=1){ 
         $rooms = mysql_query($sql,$l); 
         $sql = mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id IS NOT NULL AND rooms_id=$rooms"); 
         if (mysql_result($sql,0) == 0 and $final == -1){ $final = $rooms; } 
        } 
       } 
      } 
      if ($final != -1){ $sql = mysql_query("UPDATE present SET rooms_id=$final WHERE player = $player AND items_id IS NULL AND monsters_id=$result;"); } 
      else { $sql = mysql_query("UPDATE present SET rooms_id=-1 WHERE player = $player AND items_id IS NULL AND monsters_id=$result");} 
     } 
    } 
    $sql = mysql_query("UPDATE present SET state = 1 WHERE player = $player AND items_id IS NULL AND monsters_id IS NULL AND quantity IS NULL AND rooms_id IS NOT NULL"); 
} else { 
    $sql = mysql_query("UPDATE present SET state = 0 WHERE player = $player AND items_id IS NULL AND monsters_id IS NULL AND quantity IS NULL AND rooms_id IS NOT NULL"); 
} 

}

而$計數爲2,for循環僅運行一次。我已經通過在每次運行for循環時將1添加到mysql表中的值來驗證此問題。該值只增加一次。

if語句在頂部,是運行功能每隔打勾。

+0

會發生什麼whwn $ I <=算什麼? – gks

+3

您已經使用$算上裏面的變量作爲主迴路控制器以及內部變量值計數循環。交叉檢查它。 –

+0

不要使用'mysql_ *'函數。它們已經過時。使用PDO並使用預準備語句執行查詢。 – Hammerite

回答

2

的for循環的條件部分地基於所述循環的每次迭代進行評價,這樣可以不改變主循環內的$count值。您需要將變量名稱更改爲更有意義的內容。

試試這個:

// successful sql login & $player is correctly set with '', and all below sql 
// statements execute correctly. $count is 2 
function setMonstersLocation($player,$rooms_id){ 
if (mysql_result(mysql_query("SELECT state FROM present WHERE player = $player AND items_id IS NULL AND monsters_id IS NULL AND quantity IS NULL AND rooms_id IS NOT NULL"),0) == 0){ 
    $sql = mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id > 100 AND monsters_id < 300"); 
    // Note here I've changed $count to $playerCount, because it is a count of the 
    // number of players. 
    $playerCount = mysql_result($sql,0); 
    $sql = mysql_query("SELECT monsters_id FROM present WHERE player = $player AND items_id IS NULL AND monsters_id > 100 AND monsters_id < 300 ORDER BY monsters_id"); 
    for ($i = 0; $i < $playerCount; $i+= 1) { 
     $sql = mysql_query("SELECT monsters_id FROM present WHERE player = $player AND items_id IS NULL AND monsters_id > 100 AND monsters_id < 300 ORDER BY monsters_id"); 
     $result = mysql_result($sql,$i); 
     if (mysql_result(mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id=$result AND quantity = 1"),0) == 1){ 
      $final = -1; 
      $array[1] = $rooms_id - 1; 
      $array[2] = $rooms_id + 1; 
      $array[3] = $rooms_id - 100; 
      $array[4] = $rooms_id + 100; 
      $array[5] = $rooms_id - 200; 
      $array[6] = $rooms_id - 101; 
      $array[7] = $rooms_id - 99; 
      $array[8] = $rooms_id - 2; 
      $array[9] = $rooms_id + 200; 
      $array[10] = $rooms_id + 101; 
      $array[11] = $rooms_id + 99; 
      $array[12] = $rooms_id + 2; 
      if ($result < 200){ 
       for ($j = 1; $j < 5; $j+=1){ 
        $sql = mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id IS NOT NULL AND rooms_id={$array[$j]}"); 
        // Note here I've change $count to $presentCount, because you're 
        // counting the number of presents? (Whatever presents are) 
        $presentCount = mysql_result($sql,0); 
        $sql = mysql_query("SELECT COUNT(*) FROM rooms WHERE (rooms_id={$array[$j]})"); 
        $roompresent = mysql_result($sql,0); 
        if ($presentCount == 0 and $final == -1 and $roompresent == 1){ 
         $final = $array[$j]; 
        } 
       } 
      } else if ($result > 200){ 
       for ($k = 1; $k < 13; $k+=1){ 
        $sql = mysql_query("SELECT COUNT(*) FROM present WHERE (player = $player AND items_id IS NULL AND monsters_id IS NOT NULL AND rooms_id={$array[$k]})"); 
        // You can use $presentCount again here, because it's a 
        // different code block to the previous one. 
        // This doesn't mean its in a different SCOPE, however. 
        $presentCount = mysql_result($sql,0); 
        $sql = mysql_query("SELECT COUNT(*) FROM rooms WHERE (rooms_id={$array[$k]})"); 
        $roompresent = mysql_result($sql,0); 
        if ($presentCount == 0 and $final == -1 and $roompresent == 1){ $final = $array[$k]; } 
       } 
       if ($final == -1){ 
        $sql = mysql_query("SELECT COUNT(*) FROM rooms"); 
        // Note here I've change $count to $roomsCount, because you're 
        // counting the number of rooms. 
        $roomsCount = mysql_result($sql,0); 
        $sql = mysql_query("SELECT rooms_id FROM rooms"); 
        for ($l = 0; $l < $roomsCount; $l+=1){ 
         $rooms = mysql_query($sql,$l); 
         $sql = mysql_query("SELECT COUNT(*) FROM present WHERE player = $player AND items_id IS NULL AND monsters_id IS NOT NULL AND rooms_id=$rooms"); 
         if (mysql_result($sql,0) == 0 and $final == -1){ $final = $rooms; } 
        } 
       } 
      } 
      if ($final != -1){ $sql = mysql_query("UPDATE present SET rooms_id=$final WHERE player = $player AND items_id IS NULL AND monsters_id=$result;"); } 
      else { $sql = mysql_query("UPDATE present SET rooms_id=-1 WHERE player = $player AND items_id IS NULL AND monsters_id=$result");} 
     } 
    } 
    $sql = mysql_query("UPDATE present SET state = 1 WHERE player = $player AND items_id IS NULL AND monsters_id IS NULL AND quantity IS NULL AND rooms_id IS NOT NULL"); 
} else { 
    $sql = mysql_query("UPDATE present SET state = 0 WHERE player = $player AND items_id IS NULL AND monsters_id IS NULL AND quantity IS NULL AND rooms_id IS NOT NULL"); 
}