0

コードは次のとおりです。配列内の 1 つの値を実行した場合、結果は正しいです。複数の値を実行した場合、結果は価格が正しくありません。どこかで値をいじったようです ?? 助けて感謝

    $dido=array('42204131','22204131');
    foreach($did as $did):

    $query = "select * from dispatch,link where lid=dlid and did=$did";
    $result = mysql_query($query) または 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'];

    // 価格 anc1
    $querypanc1 = "pid=$anc1 の製品から価格を選択";
    $resultpanc1 = mysql_query($querypanc1);
    while($row = mysql_fetch_array($resultpanc1))
    {
        $priceanc1=$行[価格];
        $tpriceanc1=$vanc1*$priceanc1;

    }
    //価格 anc2
    $querypanc2 = "pid=$anc2 の製品から価格を選択";
    $resultpanc2 = mysql_query($querypanc2);
    while($row = mysql_fetch_array($resultpanc2))
    {
        $priceanc2=$行[価格];
        $tpriceanc2=$vanc2*$priceanc2;

    }
    // 価格 anc3
    $querypanc3 = "pid=$anc3 の製品から価格を選択";
    $resultpanc3 = mysql_query($querypanc3);
    while($row = mysql_fetch_array($resultpanc3))
    {
        $priceanc3=$行[価格];
        $tpriceanc3=$vanc3*$priceanc3;

    }
    // 価格 anc4
    $querypanc4 = "pid=$anc4 の製品から価格を選択";
    $resultpanc4 = mysql_query($querypanc4);
    while($row = mysql_fetch_array($resultpanc4))
    {
        $priceanc4=$行[価格];
        $tpriceanc4=$vanc4*$priceanc4;

    }
    // 価格 anc5
    $querypanc5 = "pid=$anc5 の製品から価格を選択";
    $resultpanc5 = mysql_query($querypanc5);
    while($row = mysql_fetch_array($resultpanc5))
    {
        $priceanc5=$行[価格];
        $tpriceanc5=$vanc5*$priceanc5;

    }


    $gtprice=$tpriceanc1+$tpriceanc2+$tpriceanc3+$tpriceanc4+$tpriceanc5;

        $qrygt="UPDATE ディスパッチ SET gtprice=$gtprice WHERE did=$did";
        $resultgt=@mysql_query($qrygt);

        }
        endforeach;

4

2 に答える 2

1

最初の最大の問題は、コードのコピーパスタの性質です。あなたがやっていることを分解してみましょう:

  • ID リストの設定
  • これらの ID に対してクエリを実行する
  • 結果を配列に入れる
  • これらの結果ごとに個別のクエリを実行する

また、非常にぎこちない構文を使用しています。(つまり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
 }

これらの最後の 2 行は実際にはオブジェクトを示唆していますが、目的には重すぎるかもしれません。最初の 2 行は、無限に繰り返すボイラー プレートです。関数を書いてみよう!

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

さて、この関数は一度に 2 つのこと (データベースにクエリを実行し、データを使用可能な配列に変換する) を実行しようとするため、少し汚れていますが、私はあなたがしていたことに似せたかったのです。この関数を作成すると、より高いレベルの関数に戻って呼び出すことができます。

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

その部分は自分で書いてみましょう。でも覚えておいて; あなたがしていることを分解し、繰り返される要素を同じ関数で処理してください。ここで学ぶべき本当の教訓は、プログラミングは実際にはコミュニケーションをとっているということです。繰り返しノイズが非常に多いため、コードは何も伝えません。適切な変数名を使用してください。実行していることを単一のタスクで機能に絞り込みます。このようにして、あなたのコードを読んでいる人 (あなたを含む!) は、あなたが何をしようとしているのか、どこが間違っているのかを知ることができます。

于 2013-04-16T22:04:50.360 に答える
1

1)あなたのコードで見つけた唯一の問題は、select pprice from products where pid ...クエリの一部がデータを返さない場合、$tpriceancX前の反復からの値を保持することです。

2) また、(トピック外に) 繰り返されるコードの 5 つのブロックをforループに置き換えることができます。

$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;
    }
}
于 2013-04-16T22:08:41.843 に答える