2012-08-17 60 views
0

如果点击提交按钮,我在这里有一个代码来生成一个excel文件。该文件填充了来自mysql的数据,当然是基于mysql查询。那就是:生成Excel文件时出错

<?php 
require("aacfs.php"); 

header("Content-type: application/ms-excel"); 
header("Content-Disposition: attachment; filename=Reservation Summary_sortbydate.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

$head1="Ayala Aviation Corporation"; 
$head2="RESERVATION SUMMARY"; 
$head3="For the period ___________"; 


$heads="$head1\n$head2\n$head3\n"; 

$query = "select bdate as 'Date', cliename as 'Client', grpcode as 'Group Code', bperson as 'Contact', reservno as 'Reservation No.', acode as 'Aircraft', fdate as 'Flight Date', itinerary as 'Itinerary', etd as 'ETD', eta as 'ETA', pname as 'Passengers', status as 'Status', cutoff as 'Confirmation Cut-off', adminid as 'Reserved by' from reservation order by bdate"; 

$result = mysql_query($query); 
if($result) { 
    $count = mysql_num_rows($result); 
    for($i=0; $i<$count; $i++) { 
    for ($i = 0; $i < mysql_num_fields($result); $i++) 
    { 
    $schema_insert_rows.=mysql_field_name($result,$i) . "\t"; 
    } 
    $schema_insert_rows.="\n"; 

     while($row = mysql_fetch_row($result)) { 
      $line = ''; 
      foreach($row as $value) { 
       if((!isset($value)) OR ($value == "")) { 
        $value = "\t"; 
       } else { 
        $value = str_replace('"', '""', $value); 
        $value = '"'.$value.'"'."\t"; 
       } 
       $line .= $value; 
      } 
      $data .= trim($line)."\n"; 
     } 
     $data = str_replace("\r", "", $data); 
     if($data == "") { 
      $data = "\n(0) Records Found!\n"; 
     } 
    } 
    print mb_convert_encoding("$heads\n$schema_insert_rows\n$data", 'UTF-16LE', 'UTF-8'); 
} else die(mysql_error()); 
?> 

这需要长的时间才执行,当它终于下载了我的电脑上,该文件显示一条错误消息:“超过60秒的最长执行时间”。我尝试设置像这样的时间限制:set_time_limit(0),但是在我下载文件之前还需要很长时间,并且当我打开下载的文件时,文件本身又会显示另一个错误:'134217728字节的允许内存大小已耗尽(试图分配133693422字节)'

我有这个确切的代码,但在另一个php文件上运行不同的mysql_query,所以我非常沮丧,为什么这不起作用。前几天我的工作很顺利,但今天我再次检查时发现了这个错误。我究竟做错了什么?任何帮助,将不胜感激。先谢谢你!上帝保佑!

+0

使用fputcsv(),而不是建立自己的制表符分隔字符串。内置功能比您自制的方法更快。 – 2012-08-17 06:27:05

+0

将数据一次写入一个临时文件,而不是将其全部写入内存,然后将该文件传输到您的php://输出,然后将其删除 – 2012-08-17 06:28:48

回答

0

您是否尝试抓取10个数据并查看它们是否具有相同的结果或错误?我认为你试图导出的数据有点沉重,这就是你遇到执行超时的原因。

用此更新您的查询。

$query = " 
select 
    bdate as 'Date', 
    cliename as 'Client', 
    grpcode as 'Group Code', 
    bperson as 'Contact', 
    reservno as 'Reservation No.', 
    acode as 'Aircraft', 
    fdate as 'Flight Date', 
    itinerary as 'Itinerary', 
    etd as 'ETD', 
    eta as 'ETA', 
    pname as 'Passengers', 
    status as 'Status', 
    cutoff as 'Confirmation Cut-off', 
    adminid as 'Reserved by' 
from 
    reservation 
group by 
    bdate 
LIMIT 10"; 

更新你的php.ini

 post_max_size = 8M 
    default_socket_timeout = 60 
+0

我试过改变它,但仍然无效。 :((我试图检索到的数据现在仅包含20行,加上我在查询中调用的列) – xjshiya 2012-08-17 05:58:28

+0

我试图将数据限制为只有10个,正如你所说的那样,是的,它确实工作正常。 ?我真的需要获取这些数据,应该怎么办 – xjshiya 2012-08-17 06:02:06

+0

转到您的mysql.ini和更改配置:试试这个:[myisamchk的] 的key_buffer_size = 20M sort_buffer_size的值= 20M 的read_buffer = 2M write_buffer = 2M – 2012-08-17 07:15:44