2013-04-16 74 views
0

如果我在數組中運行一個值,那麼結果是正確的,如果我運行多個值,結果是價格是不正確的,就像它已經與值的地方弄亂了代碼? ?幫助讚賞陣列和每個迴路問題

 

    $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"; 
     [email protected]_query($qrygt); 

     } 
     endforeach; 

回答

1

您的第一個也是最大的問題是您的代碼的複製麪食性質。讓我們試着打破你在做什麼:

  • 設置IDS
  • 這些IDS運行查詢
  • 把結果放到一個數組
  • 運行在每個單獨的查詢列表這些結果

你也使用一些非常janky的語法。 (即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); 

我會讓你寫那部分是你自己的。但要記住;打破你正在做的事情,並讓重複的元素由同一個函數處理。在這裏學習的真正教訓是編程是真正的溝通:你的代碼不會溝通任何東西,因爲有太多重複的噪音。使用好的變量名稱。用單個任務加強你正在做的功能。這樣,任何人閱讀你的代碼(包括你!)都會知道你想要做什麼以及出錯的地方。

+0

不能相信沒有人調升該O-O –

+0

感謝...沒想到做一個函數 – user2288221

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; 
    } 
} 
+0

許多感謝的話。當時pid正在返回空數據。尚未創建子循環。 – user2288221

+1

不客氣。請注意,我的答案(以及由@Nathaniel Ford提供的解決方案)的循環既解決了您的問題,又使代碼更好。此外,請不要忘記接受和/或upvote幫助你的答案:) –