在循环内查询数据库

时间:2013-10-06 10:27:08

标签: php mysqli

我有多个下拉菜单。当用户单击“提交”按钮时。触发if子句中的isset函数并执行以下代码

 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时,数组只包含值&#34; Burger&#34;

我怀疑问题出现在foreach循环中以及我查询数据库的方式。如果有人能指出我正确的方向,我将不胜感激。 提前谢谢。

5 个答案:

答案 0 :(得分:2)

使用力量,卢克! 对于像safeMysql这样的抽象库,它将是两行代码行

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

并且,与您的不同 - 注射时安全

答案 1 :(得分:0)

删除for循环,它应该有效。您想要使用foreach迭代每个玩家ID。

答案 2 :(得分:0)

你实际上是在运行两次相同的循环。拿出

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

答案 3 :(得分: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']等。

另一件事就是过度使用你的数据库。您可以对IN运算符使用一个查询,而不是为每个ID创建单独的查询,右侧是逗号连接的所有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);
}

答案 4 :(得分:-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!"; } } 都不需要迭代。

试试这样:

{{1}}