2012-08-17 59 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