0

送信されたすべての電子メールをパイプ区切りの csv ファイルに投稿するフォームメール スクリプト用の php スクリプトを作成しています。次に、php 配列を介して csv ファイルを表示します。以下に示すように、リストの行の最後または22番目のフィールドであるリストのID /請求書番号を削除関数に渡すことで、ユーザーがエントリを削除できるようにする必要がありますが、csvファイル内のすべてを削除しています。その線だけではありません。これが私のコードです。請求書番号に渡されたIDを比較すると、一致する場合はその行を削除して残りを元に戻す必要がありますが、すべてのエントリが削除されています。

次のように修正しましたが、まだすべてのエントリが消去されています。

if ($_POST['action'] == "Delete")
{
    $id = $_GET['id'];
    $fptemp = fopen('data-temp.csv', "a+");
    if (($handle = fopen($dataFile, "r")) !== FALSE)
    {
        while (($data= fgetcsv($handle)) !== FALSE)
        {
            if ($id != $data[22])
            {
                fputcsv($data);
            }
        }
        fclose($handle);
        fclose($fptemp);
        unlink($dataFile);
        rename('data-temp.csv',$dataFile);
    }
}

だから私は私のcsvファイルに次のエントリを持っています

1346785585|Martha|Stewart|karen@someplace.com|555-444-2222|578 dude rd|dude|TN|57660|usa|Do it Yourself Cooking Book||389|12|||360|12|Credit Card|www.something.com||98.143.4.228|6c67b98 
1346785588|Karen|b|karen@someplace.com|555-444-2222|578 dude rd|dude|TN|57660|usa|Do it Yourself WebSite||389|12|||360|12|Credit Card|www.something.com||98.143.4.228|464b4ec

行の最後のフィールドである請求書番号を見つけたいので、「464b4ec」を見つけて、で構成されるエントリ全体を削除するとします。

1346785588|Karen|b|karen@someplace.com|555-444-2222|578 dude rd|dude|TN|57660|usa|Do it Yourself WebSite||389|12|||360|12|Credit Card|www.something.com||98.143.4.228|464b4ec 

他のすべてのエントリをそのままにしておきたいのですが、どうすればよいですか?

4

2 に答える 2

1

2つの修正。他の人が指摘しているように、あなたは$id2つのことに使用しています。変化する:

$id= fgetcsv($handle)

に:

$data = fgetcsv($handle, 0, '|')

また、出力ファイルを作成するときは、配列を別の配列でラップしているため、これは必要ありません。変化する:

$list = array($data);
fputcsv($fptemp, $list);

に:

fputcsv($data);
于 2012-09-03T16:44:12.073 に答える
0

いくつかのこと

a) fgetcsv() は、読み取った csv データの行からフィールドの配列を返します。その配列全体を (単一の?) 項目と比較します$data[22]。data[22] 自体が配列でない限り、期待どおりに動作しません。

$data が配列でない場合、文字列として扱われ、$id を文字列の 22 番目の文字と比較しています。

b) $data は既に配列であり、それを別の配列でラップします - array($data). だから... $data は実際には文字列だと思います。

c) ID とデータの比較が一致しない場合にのみ fputcsv を実行するため、フィールドだけを削除するのではなく、行全体をスキップします。配列の 22 番目の項目のみを削除するには、次のようにする必要があります。

if ($id == $data[22) {
   unset($data[22]);
}
fputcsv($fptemp, $data);

d) ジャックがコメントで指摘しているように、ループで $id を上書きしているため、csv データの最初の行を読み取った瞬間に $_POST 値が破棄されます。

于 2012-09-03T16:27:08.080 に答える