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



我对此相当陌生,所以我可能错过了一些非常基本的东西,但我正在尝试编写一些PHP脚本。我想规范化我的主数据表,它是关于二手车、制造商、型号、价格等的信息。因此,我有另一个表,其中包含所有唯一的汽车制造商,它存储具有唯一idmakeIdmakeName。在我的脚本中,我连接到数据库,从主表中读取所有数据,将其作为SQL查询运行,然后将其存储为变量。我对make表做同样的处理。

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

<?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();
}
}
}
?>

大约10分钟后,我发布了这个问题,盯着这个一整天后,我意识到我根本不需要一个嵌套循环,并写了下面的代码,这是笨拙的,但它解决了问题,但我更喜欢你的解决方案@ tangentially…谢谢你们的帮助……

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();
}
}

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

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"
}

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

最新更新