2013-10-06 69 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