代码之家  ›  专栏  ›  技术社区  ›  treyBake user1850175

CSV导出达到500行,然后停止

  •  0
  • treyBake user1850175  · 技术社区  · 7 年前

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

    upload_max_filesize post_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);
    }
    

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

    @艾姆德夫把这个问题联系起来: Warning: Input variables exceeded 1000

    不过,这本书读得不错:

    2) 公认的答案表明 Content-Type

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   treyBake user1850175    7 年前

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

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

    我首先将.in I文件中的限制增加到25000,并测试了代码。一切都起作用了,但把它定得太多确实感觉不对。在@AymDev提出另一个问题后,我看到有人建议 ini_set 或者使用.htaccess文件。

    使用 ini_set('max_input_vars', 25000) 在我的脚本顶部更改了nada,但是使用.htaccess时如下:

    php_value max_input_vars 25000
    

    $_POST 返回1但仍超过1000。

    推荐文章