我具有导出功能,可以将表单中发布的数据转换为CSV文件。问题是,当行数超过500时,它将停止CSV。
我的php.ini文件显示我的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);
}
我似乎无法找到问题的根源-也许是内存问题?
@AymDev链接了此问题:Warning: Input variables exceeded 1000
但是很好阅读:
1)投票最高的答案导致我var_dump $ _POST的计数返回了1(尽管不超过1000,所以不确定为什么它不起作用?)
2)可接受的答案建议在我已经完成的标题中设置Content-Type
我总是可以通过max_input_vars
/。htaccess来设置ini_set
,以避免在服务器上进行更改...
谢谢
答案 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。