CSV导出达到500行然后停止

时间:2018-08-23 08:34:19

标签: php export-to-csv

我具有导出功能,可以将表单中发布的数据转换为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 $ _POST的计数返回了1(尽管不超过1000,所以不确定为什么它不起作用?)

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

答案是创建一个.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。