【发布时间】:2018-08-23 08:34:19
【问题描述】:
我有一个导出功能,可以将从表单发布的数据转换为 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 返回 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