0

我正在为我的表单邮件脚本编写一个 php 脚本,以将所有发送到管道分隔的 csv 文件的电子邮件发布,然后通过 php 数组显示 csv 文件。我需要允许用户通过将列表的 ID/发票号(该列表中的最后一个或第 22 个字段)传递给删除函数来删除条目,如下所示,但它正在删除 csv 文件中的所有内容,不只是那条线。这是我的代码。我比较传递给 invoicenumber 的 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

两个修复。正如其他人指出的那样,您正在使用$id两件事。改变:

$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 ,因此您在其中的 $_POST 值在您读取第一行 csv 数据的那一刻就被破坏了。

于 2012-09-03T16:27:08.080 回答