嵌套 while 循环在第一次迭代 PHP 后停止

时间:2021-02-24 22:39:03

标签: php mysql loops while-loop nested

我对此很陌生,所以我可能缺少一些非常基本的东西,但我正在尝试编写一些 PHP 脚本。我想标准化我的主数据表,它是关于二手车、品牌、型号、价格等的信息。所以我有另一个表,其中包含所有独特的汽车制造商,它存储了具有唯一性的 makeName id makeId 在我的脚本中,我连接到数据库,从主表中读取所有数据,将其作为 SQL 查询运行,然后将其存储为变量。我对 make 表也是如此。

然后我尝试运行嵌套的 while 循环,用 Manufacturer 表中的 makeId 替换 make 列中主表中的所有字符串,以便我可以链接这两个表。它适用于一次迭代然后停止,我尝试在任一和两个 while 循环中的 !==FALSE 之后添加 fetch_assoc,但我认为这给了我无限循环。这是我的代码...

<?php

include("conn.php");

$sqlAll= "SELECT * FROM carData";

$carDataResult = $conn->query($sqlAll);

if(!$carDataResult){
    echo $conn->error;
    die();
}

$sqlMake = "SELECT * FROM 000make";
$makeResult = $conn->query($sqlMake);  

if(!$makeResult){
    echo $conn->error;
    die();
}  

while ( $make =$makeResult-> fetch_assoc()){

    $makeID = $make['makeId'];
    $makeName = $make['makeName'];

    while ($row = $carDataResult->fetch_assoc()){
    
        $sqlUpdate="UPDATE carData SET Manufacturer = '$makeID'
           WHERE Manufacturer='$makeName' AND Manufacturer IS NOT NULL";
        
        $res = $conn->query($sqlUpdate);
 
        if(!$res){
            echo $conn->error;
            die();
        }
    }
}

?>

2 个答案:

答案 0 :(得分:1)

在我发布问题大约 10 分钟后,在盯着这个一整天之后,我意识到我根本不需要嵌套循环并编写了下面的代码,虽然笨拙但解决了问题,但我喜欢您的解决方案更好@TangentiallyPerpendicular...感谢您的帮助...

while ($make =$makeResult-> fetch_assoc()){

     $makeID = $make['makeId'];
     $makeName = $make['makeName'];

      $sqlUpdate="UPDATE carData SET Manufacturer = '$makeID'
      WHERE Manufacturer='$makeName' AND Manufacturer IS NOT NULL";
        
      $res = $conn->query($sqlUpdate);
 
      if(!$res){
          echo $conn->error;
          die();
      }
 }

答案 1 :(得分:-1)

作为一般规则,读取结果集并循环遍历它以运行连续查询是处理此类问题的错误方法。您可以在一个查询中完成所有操作:

update carData set `Manufacturer` = (select `makeId` from `000make` where 000make.makeName=carData.Manufacturer) 

你的整个程序变成:

<?php

include("conn.php");

$sqlAll= "update carData set `Manufacturer` = (select `makeId` from `000make` where 000make.makeName=models.Manufacturer) ";

$carDataResult = $conn->query($sqlAll);

if(!$carDataResult){
    echo $conn->error;
    die();
} else {
    echo "Update Successful"
}

顺便说一句,我会在您的 makeId 表中创建一个新列(可能称为 carData)并在那里插入数据而不是覆盖 Manufacturer 列。这样,如果出现问题,您可以保留制造商列。您可以稍后删除该列。