0

参考までに、現在のコード(それほど多くはありません)をこのページに配置しました(もちろん、実際のパスワードを差し引いたものです):http: //mafgiftshop.org/MAF/queue/MP/for-reference.php

    $delimiter = ',';
$db = new mysqli('localhost', 'mafgifts_mp', '******', 'mafgifts_mp');

if (($handle = fopen("mpdata.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
        foreach($data as $i => $content) {
            $data[$i] = $db->real_escape_string($content);
        }
        echo $data[$i]."";
        $db->query("INSERT INTO `MP` 
                      (GiftAmount,GoalAmount,GiftDate,FundID,FundDescription) 
                      VALUES('" . implode("','", $data) . "');");
    }
    fclose($handle);
}

//THE ABOVE CODE PROPERLY PUTS ALL THE DATA INTO THE MySQL DATABASE, BUT I'M NOT 
//ABLE TO DO THE CALCULATIONS I WANT AND INSERT ONLY THE RESULTING DATA.

したがって、5列の情報を含むCSVファイルがあります。空白の値はありません。例えば:

GiftAmount、GoalAmount、GiftDate、FundID、FundDescription(この行はCSVに含まれていません。参照用です)

  • "$ 10"、 "$ 500"、 "1/1/2012"、 "8008"、"8008ファンドの説明"
  • "$ 20"、 "$ 500"、 "2012年2月10日"、 "8008"、"8008ファンドの説明"
  • "$ 62"、 "$ 500"、 "1/12/2012"、 "8008"、"8008ファンドの説明"
  • "$ 38"、 "$ 1,000"、 "3/31/2012"、 "9102"、"9102ファンドの説明"
  • "$ 21"、 "$ 1,000"、 "4/6/2012"、 "9102"、"9102ファンドの説明"

私がする必要があるのは、FundIDが同じである間に「GiftAmount」列を追加し、その結果をMySQLデータベースに配置することです。したがって、上記のデータの場合、結果のMySQLテーブルは次のようになります。

  • "$ 92" | 「$500」| 「8008」| 「8008ファンドの説明」(GiftDateは不要になりました)
  • "$ 59" | 「$1,000」| 「9102」| 「9102基金の説明」

私はこれを達成するためにPHPを使用していますが、CSVファイルはさまざまなファンドへの新しい贈り物に基づいて毎日変更されるため、PHPファイルは毎日Cronジョブで実行されます。

ちなみに、CSVファイルには現在8,794行と多くのFundIDがあります。

4

1 に答える 1

1

FundIDをMYSQLの一意のキーにしてから、INSERT INTO ... ON DUPLICATEKEYUPDATEクエリを使用します。

    $db->query("INSERT INTO `MP` (GiftAmount,GoalAmount,GiftDate,FundID,FundDescription) VALUES('" . implode("','", $data) . "') ON DUPLICATE KEY UPDATE GiftAmount=GiftAmount+".intval($data[0]).";");

これは、GiftAmountが数値列であり、それを文字列として保存していないことを前提としています。

于 2013-02-04T16:36:33.947 に答える