foreach循环中的Php mysql while循环重复

foreach循环中的Php mysql while循环重复,php,Php,我有一个数据结构如下的字符串 $string=“2,3,4,5”; 我想从数据库中选择以获取所有ID,然后突出显示分解的字符串值(如果等于数据库ID) $string = "2,3,4,5"; $exp = explode(",",$string); foreach($exp as $e) { $query = $conn->query("select * from tbl"); while($row = $query->fetch_assoc()) {

我有一个数据结构如下的字符串 $string=“2,3,4,5”; 我想从数据库中选择以获取所有ID,然后突出显示分解的字符串值(如果等于数据库ID)

$string = "2,3,4,5";
$exp = explode(",",$string);

foreach($exp as $e) {
    $query = $conn->query("select * from tbl");
    while($row = $query->fetch_assoc()) {

        $result .= '<option value="" ';
        if($e === $row['id']):
            $result .= ' selected';
        endif;                                      
        $result .= '>';
        $result .= $row['id'];
        $result .= '</option>';

    }
}
$string=“2,3,4,5”;
$exp=分解(“,”,$string);
foreach($exp作为$e){
$query=$conn->query(“从tbl中选择*);
而($row=$query->fetch\u assoc()){
$result.='';
$result.=$row['id'];
$result.='';
}
}
但我不断地得到像这样的复制品
12346781234567881234567812345678请帮助…

不确定您想做什么,但请尝试下面的代码。在您的代码中,您正在for循环中运行数据库查询,这对性能有很大影响

    $string = "2,3,4,5";
    $exp = explode(",",$string);

    $query = $conn->query("select * from tbl");
    while($row = $query->fetch_assoc()) {
     $result .= '<option value="" ';
        foreach($exp as $e){
         if($e === $row['id']){
           $result .= ' selected';
           break;
         }
        }

        $result .= '>';
        $result .= $row['id'];
        $result .= '</option>';

    }
$string=“2,3,4,5”;
$exp=分解(“,”,$string);
$query=$conn->query(“从tbl中选择*);
而($row=$query->fetch\u assoc()){
$result.='';
$result.=$row['id'];
$result.='';
}

您应该更改foreach和的位置,就像:

$query = $conn->query("select * from tbl");
while($row = $query->fetch_assoc()) {    
    $result .= '<option value="" ';
    foreach($exp as $e) {
      if($e === $row['id']) {
        $result .= ' selected';
      }
    }                                  
    $result .= '>';
    $result .= $row['id'];
    $result .= '</option>';
}
$query=$conn->query(“从tbl中选择*);
而($row=$query->fetch_assoc()){
$result.='';
$result.=$row['id'];
$result.='';
}

您的逻辑绝对正确,但将循环放置在错误的位置

因为foreach每次都在运行,而且每次都是SQL查询,每次都返回第一行,foreach每次都匹配并打印相同的结果。如此简单,您需要将SQL查询放在foreach之外,并按如下方式运行它

$query = $conn->query("select * from tbl");
while($row = $query->fetch_assoc()) {    
  $result .= '<option value="" ';
  foreach($exp as $e) {
    if($e === $row['id']) {
      $result .= ' selected';
    }
  }                                  
 $result .= '>';
 $result .= $row['id'];
 $result .= '</option>';
}
$query=$conn->query(“从tbl中选择*);
而($row=$query->fetch_assoc()){
$result.='';
$result.=$row['id'];
$result.='';
}

您肯定会得到所需的输出。谢谢

看起来您想将id用户标记为选中。我将执行以下两个步骤:

  • 获取所有ID
  • 检查是否选择了每个id
$query=$con->query(“从配置中选择id”);
$datas=[];
$result='';
而($row=$query->fetch_assoc()){
$result.='';
$result.=$row['id'];
$result.='';
}
回声$结果;
结果如下:

<option value="1"  selected>1</option><option value="2"  selected>2</option>
12

根据嵌套循环的工作情况,输出似乎正确。您的错误到底是什么?foreach运行4次,我的while循环也是如此。。。下面提供的答案都解决了我的问题。。多亏了大家,王艳龙的解决方案通过删除foreach循环为我节省了一个额外的循环。。。endif和
{}
符号使您的代码很难阅读。它来自Okoro的初始代码,不需要修改。谢谢你指出这一点。现在变了,原来是。。。很抱歉批评你。我很感激这个解决方案,它非常有效。。。上帝保佑你#PandurangIt运作完美。。非常感谢。。上帝保佑你,我很感激这个解决方案,它非常有效。。。谢谢你,上帝保佑你#牛顿·辛格你的代码是完美的,提高了速度和更快的性能。。。非常感谢。
<option value="1"  selected>1</option><option value="2"  selected>2</option>