【问题标题】:using fopen on uploaded file with php使用 php 对上传的文件使用 fopen
【发布时间】:2010-04-11 02:05:22
【问题描述】:

我正在上传一个文件,然后尝试使用 fgetcsv 对其进行处理。

这是我下面的脚本。在我添加文件上传部分之前一切正常。现在它没有显示任何错误,只是没有显示上传的数据。

我收到“文件上传”通知,文件保存正确,但条目数计数器显示为 0。

if(isset($_FILES[csvgo])){

    $tmp = $_FILES[csvgo][tmp_name];

    $name = "temp.csv";

    $tempdir = "csvtemp/";

    if(move_uploaded_file($tmp, $tempdir.$name)){ echo "file uploaded<br>"; }

    $csvfile = $tempdir.$name;

    $fh = fopen($csvfile, 'r');
    $headers = fgetcsv($fh);
    $data = array();
    while (! feof($fh))
    {
        $row = fgetcsv($fh);
        if (!empty($row))
        {
            $obj = new stdClass;
            foreach ($row as $i => $value)
            {
                $key = $headers[$i];
                $obj->$key = $value;
            }
            $data[] = $obj;
        }
    }
    fclose($fh);

    $c=0;

    foreach($data AS $key){

            $c++;

            $phone = $key->PHONE;

            $fax = $key->Fax;

            $email = $key->Email;

            // do things with the data here

    }

    echo "$c entries <br>";
}

【问题讨论】:

  • 如果您根本没有收到任何错误,那么您就不会显示所有错误。例如,$_FILES[csvgo] 应该产生一个 E_NOTICE 级别的错误,因为 'csvgo' 不是一个常量,你应该在它周围加上引号。你应该确保你有 error_reporting(E_ALL);和 ini_set('display_errors', '1');在你的代码中的某个地方。

标签: php fgetcsv


【解决方案1】:

您可能需要指定一个绝对服务器路径。

$tempdir = $_SERVER['DOCUMENT_ROOT'] . "/csvtemp/";

编辑:我测试了你的代码,只做了一些小的修改(绝对路径和在你的数组键名中添加引号),它运行良好。它可能超出了您发布的范围。可能是文件权限错误或上传表单出现的问题。

只是一个想法,但您可以尝试提高您的 PHP 错误级别。这可能会发现一些原本被忽视的东西。

ini_set("display_errors", 1);
ini_set("error_reporting", 2147483647);

如果失败了,你总是可以求助于到处扔一堆回声,直到找到罪魁祸首。

【讨论】:

  • 发现了这个问题,结果发现它在 CSV 文件中有些古怪。我不知道为什么/如何,但是当我打开它并将其保存在 OpenOffice Calc 中并保存时(数据相同,在记事本++中检查)它可以工作。不知道发生了什么。
  • 对我来说最后一次尝试 - 在这种情况下,它可能是行尾问题。大多数编码编辑器都会有一种机制来检查正在使用的行尾样式。确保将其保存为 Unix 或 Windows 行结尾,否则 PHP 可能无法正确读取文件。您也可以尝试使用 ini_set('auto_detect_line_endings',TRUE); 开启 auto_detect_line_endings;
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 2015-01-04
  • 1970-01-01
  • 2016-09-14
  • 2016-05-17
相关资源
最近更新 更多