Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在循环中查询数据库_Php_Mysqli - Fatal编程技术网

Php 在循环中查询数据库

Php 在循环中查询数据库,php,mysqli,Php,Mysqli,我有多个下拉菜单。当用户单击提交按钮时。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 e

我有多个下拉菜单。当用户单击提交按钮时。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);
                    }
                }
if(设置($\u POST[“提交”]))
{
$player_id=$_请求['players'];
变量转储($player\u id);
对于($i=0;$i
上面的代码应该做的是返回玩家的名字和用户选择。但是,当我打开它时,我会看到:

注意,我在第一个var_转储中使用的$player_id数组包含不同的player_id值

但是,当我对第二个数组$selected执行var_转储时,该数组只包含值“Burger”

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

删除
for
循环,它应该可以工作。您希望迭代每个玩家id,您正在使用
foreach
执行此操作。不需要外部的

使用原力,卢克! 有了抽象库,它将是两行代码

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

而且,与您的不同,它是安全的,不需要注射。

您实际上是在运行同一个循环两次。取出

for($i=0; $i < sizeof($player_id); $i++){} 
for($i=0;$i
你在无缘无故地重复循环

另外,当您为每个玩家id执行一个
SELECT
时,您试图在
foreach
之外迭代结果,这意味着您只迭代最后一个

此外,如果您的
SELECT
s最多生成一行,则它们都不需要迭代

试着这样做:

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!";
    }
  }
($i=0;$i
的循环
是一个过度循环。您没有使用此循环中的
$i
,因此不需要它。想象一下,如果$player\u id数组有3个项目,您将循环它,在循环的每一步中,您还将使用
foreach
loop再次循环整个$player\u id数组

此外,您正在使用不安全的方法在查询中传递变量。我认为最好的做法是养成一种习惯,将收入$\u POST变量转换为
int
,如果建议它们是数字的话。它只是一个字符串
$player\u id=array\u map('intval',$请求['players')
,或
$id=(int)$\u POST['id']
,或
$number=(int)$\u GET['number']
,等等

另一件事是过度查询数据库。与为每个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);
}

为什么同时使用
for
foreach
循环?我想指出的是,这个脚本对于SQL注入非常脆弱。最佳做法是使用占位符。是的,你是对的,我对你使用占位符的答案投了一票。但是本机PHP不提供使用占位符的机会。:)另外,我会将您的答案改写为:
$names=$db->getCol('selectname FROM player_info WHERE player_id in(?a),$_POST['players'])。这种变体将使用更大的力。))当然,原生PHP允许占位符,即使使用旧的mysql ext。用户定义的函数也是原生的。一行变量的可读性较差-这就是为什么应该避免使用它。我只是对一个字符串变量开玩笑,没关系。我的变体带有
$query='..'
))