代码如下,如果我在数组中运行一个值,结果是正确的,如果我运行多个值,结果是价格是不正确的,就像它已经弄乱了某些值?帮助赞赏
$dido=array('42204131','22204131'); foreach($dido as $did): $query = "select * from dispatch,link where lid=dlid and did=$did"; $result = mysql_query($query) or die(mysql_error()); while($row = mysql_fetch_array($result)){ $vanc1=$row['vanc1']; $vanc2=$row['vanc2']; $vanc3=$row['vanc3']; $vanc4=$row['vanc4']; $vanc5=$row['vanc5']; $anc1=$row['anc1']; $anc2=$row['anc2']; $anc3=$row['anc3']; $anc4=$row['anc4']; $anc5=$row['anc5']; // price anc1 $querypanc1 = "select pprice from products where pid=$anc1"; $resultpanc1 = mysql_query($querypanc1); while($row = mysql_fetch_array($resultpanc1)) { $priceanc1=$row[pprice]; $tpriceanc1=$vanc1*$priceanc1; } // price anc2 $querypanc2 = "select pprice from products where pid=$anc2"; $resultpanc2 = mysql_query($querypanc2); while($row = mysql_fetch_array($resultpanc2)) { $priceanc2=$row[pprice]; $tpriceanc2=$vanc2*$priceanc2; } // price anc3 $querypanc3 = "select pprice from products where pid=$anc3"; $resultpanc3 = mysql_query($querypanc3); while($row = mysql_fetch_array($resultpanc3)) { $priceanc3=$row[pprice]; $tpriceanc3=$vanc3*$priceanc3; } // price anc4 $querypanc4 = "select pprice from products where pid=$anc4"; $resultpanc4 = mysql_query($querypanc4); while($row = mysql_fetch_array($resultpanc4)) { $priceanc4=$row[pprice]; $tpriceanc4=$vanc4*$priceanc4; } // price anc5 $querypanc5 = "select pprice from products where pid=$anc5"; $resultpanc5 = mysql_query($querypanc5); while($row = mysql_fetch_array($resultpanc5)) { $priceanc5=$row[pprice]; $tpriceanc5=$vanc5*$priceanc5; } $gtprice=$tpriceanc1+$tpriceanc2+$tpriceanc3+$tpriceanc4+$tpriceanc5; $qrygt="UPDATE dispatch SET gtprice=$gtprice WHERE did=$did"; $resultgt=@mysql_query($qrygt); } endforeach;
答案 0 :(得分:1)
您的第一个也是最大的问题是您的代码的复制面食性质。让我们试着打破你正在做的事情:
你也在使用一些非常笨拙的语法。 (即foreach($foo as $bar):
)。
将这些事情分解为方法。什么是方法?它需要输入并将其转换为输出。
//returns an array of price information
public function getPrices($idArray) { //note the good method and parameter names!
//do stuff
}
既然我们知道自己在做什么,我们就可以开始填写实施细节了:
public function getPrices($idArray) {
foreach($idArray as $id) {
//somehow get the gross-scale information
//then put it in a data object
//then call a function to get specific information
}
}
该子方法应该做什么?让我们看看你当前的代码片段:
// price anc1
$querypanc1 = "select pprice from products where pid=$anc1";//sets up sql query
$resultpanc1 = mysql_query($querypanc1); //runs the query
while($row = mysql_fetch_array($resultpanc1)) { //for each result
$priceanc1=$row[pprice]; //gets the price
$tpriceanc1=$vanc1*$priceanc1; //calculates some other price
}
最后两行确实暗示了一个对象,但也许这对你来说太重了。前两行是锅炉板,你无休止地重复。让我们写一个函数!
public function getPrices($name, $pid, $multiplier) {
$sqlQuery = "SELECT pprice FROM products WHERE pid=$pid";
$result = mysql_query($sqlQuery);
$prices = array();
while ($row = mysql_fetch_array($result) {
$key = "price".$name;//$key will be something like 'priceanc1'
$prices[$key] = $row[pprice];
$tkey = "tprice".$name;
$prices[$tkey] = $prices[$key] * $multiplier;
}
}
现在,这个函数有点不干净,因为它试图一次做两件事(查询数据库,然后将数据按摩成一个可用的数组),但我希望它类似于你正在做的事情。写完这个函数后,我们可以回到我们的高级函数调用它:
public function getPrices($idArray) {
foreach($idArray as $id) {
$sqlQuery = "SELECT * from dispatch, link WHERE lid=dlid and did=$id";
$prices = array();
while ($row = mysql_fetch_array($result) {
for ($idx = 1; $idx <= 5; $idx++) {
$name = "anc".$idx;
$pid = $row[$name];
$multiplier = $row["vanc".$idx];
$priceArray = getPrices($name, $pid, $multiplier);
$prices = array_merge($prices, $priceArray);
}
}
}
//put a var_dump here to check to see if you're getting good results!
return $prices;//Should be the aggregated prices you've gotten from the db
}
现在,这就是您尝试做的事情,但我承认我不了解您的数据库是如何设置的,或者您的变量实际意味着什么。按下!我们还注意到,不必要的数据按摩就会消失。
您可以这样称呼:
$ids = array();
$ids[] = 42204131;
$ids[] = 22204131;
$prices = getPrices($ids);
var_dump($prices);//shows the result of your work
现在你有了价格,你可以将它们传递给另一个函数来运行更新:
updatePrices($prices);
我会让你自己写那部分。但要记住;打破你正在做的事情,并通过相同的功能处理重复的元素。这里要学到的真正教训是编程实际上是在沟通:你的代码没有任何通信,因为有太多重复的噪音。使用好的变量名称。通过单个任务加强您正在进行的功能。这样,任何阅读你的代码的人(包括你!)都会知道你要做什么以及你哪里出错了。
答案 1 :(得分:1)
1)我可以在您的代码中发现的唯一可能问题是,当您的某些select pprice from products where pid ...
查询未返回任何数据时,您保留前一次迭代的$tpriceancX
值。
2)另外(超出主题)你可以用for
循环替换5块重复的代码。
$gtprice = 0;
for ($i = 1; $i <= 5; $i++)
{
$querypanc = "select pprice from products where pid=".$row["anc$i"];
$resultpanc = mysql_query($querypanc);
while($pancrow = mysql_fetch_array($resultpanc))
{
$priceanc=$pancrow[pprice];
$tpriceanc=$row["vanc$i"]*$priceanc;
$gtprice += $tpriceanc;
}
}