2013-10-06 92 views
0

我有多個下拉菜單。當用戶點擊提交按鈕時。 if子句中的isset功能triggerd和下面的代碼被執行查詢循環內的數據庫

if(isset($_POST["submit"])) 
    { 
    $player_id = $_REQUEST['players']; 
    var_dump ($player_id); 
      for($i=0; $i < sizeof($player_id); $i++) //query database with different player_id each time 
      { 
       foreach ($player_id as $id){ 
        $query = 'SELECT `name` FROM `player_info` 
        WHERE `player_id` = '.$id; 
        $return_names = mysql_query($query) or die(mysql_error()); 
              } 
         while($row = mysql_fetch_array($return_names)) 
         { 
          $selected[] = $row['name'];  
         }     
         var_dump($selected); 
        } 
       } 

什麼上面的代碼應該做的是返回的名稱,球員,選擇的用戶。然而,當我打開它,我得到這個:

enter image description here

注意,我在第一的var_dump使用$ player_id數組保存不同player_id值。

然而,當我做的var_dump第二陣列$選定的數組只包含值「漢堡」

我懷疑問題是在foreach循環中,我查詢數據庫的方式。如果有人能指出我正確的方向,將不勝感激。 在此先感謝。

+0

爲什麼ü同時使用'for'和'foreach'循環? –

+0

我想提一下,這個腳本對於SQL注入非常脆弱。 http://en.wikipedia.org/wiki/SQL_injection –

回答

0

循環for($i=0; $i < sizeof($player_id); $i++)是過度的循環。您沒有使用此循環中的$i,因此您不需要它。試想一下,如果你的$ player_id數組有3個項目,你將循環它,並且在循環的每一步中,你還會使用foreach循環再循環整個$ player_id數組。

另外,您正在使用不安全的方法在查詢中傳遞變量。我認爲最佳做法是習慣將收入$ _POST變量轉換爲int,如果它們被建議爲數字。這只是一個字符串$player_ids = array_map('intval', $_REQUEST['players']);$id = (int)$_POST['id']$number = (int)$_GET['number']等。

另一件事是過量查詢數據庫。與其爲每個ID創建單獨的查詢,您可以使用IN運算符使用一個查詢,右側是所有使用逗號連接的ID。

你的代碼的另一個安全的變體是:

if (isset($_POST['submit'])) { 
    $player_ids = array_map('intval', $_REQUEST['players']); 

    //var_dump($player_ids); 

    $query = 'SELECT `name` 
     FROM `player_info` 
     WHERE `player_id` IN (' . implode(',', $player_ids) . ')'; 

    $return_names = mysql_query($query) or die(mysql_error()); 

    while ($row = mysql_fetch_assoc($return_names)) { 
     $selected[] = $row['name']; 
    } 

    //var_dump($selected); 
} 
+1

最佳做法是使用*佔位符*。 –

+0

是的,你是對的,我已經爲使用佔位符的答案添加了一票。但是* native * PHP沒有給出使用佔位符的機會。 :) 另外,我會重寫你的答案爲:'$ names = $ db-> getCol('SELECT name FROM player_info WHERE player_id in(?a)',$ _POST ['players']);'。這個變體將會使用更多的力量。 )))) –

+1

當然,本地PHP允許使用佔位符,即使是使用舊的mysql分機。用戶定義的函數不能少於* native *。單行變體的可讀性會降低* - 這就是爲什麼它應該避免。 –

0

刪除for循環,它應該工作。你想迭代每個玩家ID,你正在使用foreach。外面的for是不需要的。

2

使用武力,盧克! 隨着抽象庫像safeMysql這將是行代碼

$sql = 'SELECT name FROM player_info WHERE player_id in (?a)'; 
$names = $db->getCol($sql,$_POST['players']); 

而且,不像你的 - 它是從注射安全

0

你基本上運行兩次相同的循環。取出

for($i=0; $i < sizeof($player_id); $i++){} 
-1

你沒有理由雙循環。

此外,當您爲每個玩家ID執行一個SELECT時,您試圖迭代foreach以外的結果,這意味着您最終只會迭代最後一個。

此外,您的SELECT都不需要迭代,只要它們最多產生一行。

試試這樣說:

if(isset($_POST["submit"])) 
    { 
    $player_id = $_REQUEST['players']; 
    var_dump ($player_id); 
    foreach ($player_id as $id) 
    { 
    $query = 'SELECT `name` FROM `player_info` WHERE `player_id` = '.$id; 
    $return_names = mysql_query($query) or die(mysql_error()); 
    $row=mysql_fetch_array($return_names); // at most one -- or not? 
    if($row) 
     { 
     $selected=$row['name'];  
     var_dump($selected); 
     } 
    else 
     echo "Player with id $id not found in DB!"; 
    } 
    } 
+0

爲什麼downvote? – geomagas