【问题标题】:CSV Export reaches 500 lines then stopsCSV 导出达到 500 行然后停止
【发布时间】:2018-08-23 08:34:19
【问题描述】:

我有一个导出功能,可以将从表单发布的数据转换为 CSV 文件。问题是当行数超过 500 时,它会停止 CSV。

我的 php.ini 文件显示我的 upload_max_filesizepost_max_size 等于 0。所以它应该是无限的,所以我的假设是问题不是表单大小。

我当前的代码如下所示:

$data = $_POST['ids'];

$ebayMmlSql = 'SELECT `UKM_Make`, `UKM_Model`, `UKM_CCM`, `UKM_Submodel`, `Year`, `UKM_StreetName`
               FROM `ebay_mml`
               WHERE `ePID` = :epid';

$aiSql = 'INSERT INTO `model_epid_matches` (`epid`, `model_id`) VALUES (:epid, :model);';

$rows = array();

$i = 0;

foreach ($data as $key => $ids)
{
    foreach ($ids as $id)
    {
        if (isset($id['epid']) && $id['epid'] !== '') {
            # run select
            $ebayMmlQry = $handler->prepare($ebayMmlSql);
            $ebayMmlQry->execute(array(':epid' => $id['epid']));

            # if insert is true, run insert
            if (isset($_POST['insert']) && $_POST['insert'] == true) {
                if (isset($id['new']) && $id['new'] == true) {
                    $aiQry = $handler->prepare($aiSql);
                    $aiQry->execute(array(':epid' => $id['epid'], ':model' => $id['mod_id']));
                }
            }

            $rows[$key][$i]['action'] = ($i == 0 ? 'Revise' : '');
            $rows[$key][$i]['item_id'] = ($i == 0 ? 'Insert ItemID for '. $key : '');
            $rows[$key][$i]['relationship'] = ($i == 0 ? '' : 'Compatibility');
            $rows[$key][$i]['relationship_details'] = '';

            foreach ($ebayMmlQry->fetchAll(PDO::FETCH_ASSOC) as $k => $value)
            {
                $rows[$key][$i]['relationship_details'] = 'UKM_Make='. $value['UKM_Make'] .'|';
                $rows[$key][$i]['relationship_details'] .= 'UKM_Model='. $value['UKM_Model'] .'|';
                $rows[$key][$i]['relationship_details'] .= 'UKM_CCM='. $value['UKM_CCM'] .'|';
                $rows[$key][$i]['relationship_details'] .= 'UKM_Submodel='. $value['UKM_Submodel'] .'|';
                $rows[$key][$i]['relationship_details'] .= 'Year='. $value['Year'] .'|';
                $rows[$key][$i]['relationship_details'] .= 'UKM_StreetName='. $value['UKM_StreetName'];
            }

            $i++;
        }
    }

    $i = 0;
}


# testing count of rows before gen_csv_file on screen
# $total = 0;

# foreach ($rows as $key => $row)
# {
#    echo '<pre>';
#    var_dump($key. ': ' .count($row));
#    echo '</pre>';

#    $total += count($row);
# }

# var_dump($total);

gen_csv_file($rows, 'ebay.csv');

function gen_csv_file($data, $file)
{
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='. $file);
    header('Pragma: no-cache');
    header('Expires: 0');

    $output = fopen('php://output', 'w');

    fputcsv(
        $output,
        array(
            'Action(SiteID=UK|Country=GB|Currency=GBP|Version=941)',
            'ItemID',
            'Relationship',
            'RelationshipDetails'
        )
    );

    foreach ($data as $key => $row)
    {
        foreach ($row as $item)
        {
            fputcsv($output, $item);
        }
    }

    fclose($output);
}

我似乎无法找到问题的根源——也许是内存问题?

更新

@AymDev 链接了这个问题:Warning: Input variables exceeded 1000

不过是一本不错的读物:

1) 投票率最高的答案让我 var_dump 返回 1 的 $_POST 的计数(虽然不超过 1000,所以不知道为什么它不起作用?)

2) 接受的答案建议在我已经完成的标题中设置Content-Type

我总是可以通过ini_set/.htaccess 设置max_input_vars 以避免在服务器上进行更改...

谢谢,

【问题讨论】:

  • 你有日志错误吗?根据您的信息,我认为您的脚本达到了最大时间限制。尝试升级您的 max_timelimit 或在循环中使用 set_time_limit(0) 函数以无限时间
  • @Inazo 这不是超时限制 - 但我什至不认为这是一个 PHP 错误 - 但在那里查看确实显示 Input variables exceeded 1000 - 将设置它并查看它是否有效跨度>
  • 也许this question 能帮上忙?
  • @AymDev 它在某种程度上确实如此-尽管var_dumping 计数 $_POST 显示计数为 1,因此不超过 1000 :S 并且接受的答案使用 Content-Type 修复我的代码中已经存在
  • @AymDev 将使用找到的有用信息更新问题

标签: php export-to-csv


【解决方案1】:

答案是创建一个 .htaccess 文件。在@Inazo 发表评论后,我检查了我的日志并看到了这个:

PHP 警告:未知:输入变量超过 1000。增加限制更改 php.ini 中的 max_input_vars

我首先将 .ini 文件中的限制增加到 25000 并测试了代码。一切正常,但是将其设置为过多确实感觉不对。在@AymDev 链接另一个问题后,我看到有人建议ini_set 或使用 .htaccess 文件。

在我的脚本顶部使用 ini_set('max_input_vars', 25000) 改变了 nada,但是像这样使用 .htaccess:

php_value max_input_vars 25000

它起作用了——所以它不是在脚本级别,而是在服务器级别。虽然仍然没有解释为什么 $_POST 的计数返回 1 但仍然超过 1000。

【讨论】:

  • 是的,有些值不能被 ini_set 函数编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2016-10-18
  • 2019-11-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多