我对此相当陌生,所以我可能错过了一些非常基本的东西,但我正在尝试编写一些PHP脚本。我想规范化我的主数据表,它是关于二手车、制造商、型号、价格等的信息。因此,我有另一个表,其中包含所有唯一的汽车制造商,它存储具有唯一idmakeId
的makeName
。在我的脚本中,我连接到数据库,从主表中读取所有数据,将其作为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列。您可以稍后删除该列。