2013-07-03 46 views
2

我按照給出的解釋here將查詢結果寫入文件。 但在這種情況下,我必須先打開並寫入文件標題。然後繼續爲多個查詢編寫/附加查詢結果。這個附加的部分我已經寫成了一個函數。我的腳本只有頭文件(從第一部分)寫入文件的問題,它不會在調用函數時遵循函數中的fputcsv命令。你能幫我解決這個問題嗎?fputcsv和fwrite不起作用

這裏是我的代碼先打開文件:

<?php 
$fp = fopen('php://output', 'w'); 
$headers = array("Index","Gene_symbol","Gene_Name","Human_entrez","Rat_entrez","Mouse_entrez","DbTF","PMID"); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename="export.txt"'); 
fputcsv($fp, $headers,chr(9)); 
header('Pragma: no-cache'); 
header('Expires: 0'); 
?> 

然後查詢部分有點像這樣(我有這樣的查詢部分的多個每一個調用同一個功能):

<?php 
if (is_numeric($sterm)) 
    { 
     $query="select * from tf where entrez_id_human=$sterm || entrez_id_rat=$sterm || entrez_id_mouse=$sterm"; 
     $result=mysql_query($query) or die(mysql_error()); 
     if (mysql_num_rows($result)==0) 
      {echo "<tr><td align='center' colspan=6> $sterm not found! </td> </tr>";} 
     elseif (mysql_num_rows($result)>0) 
     {result_disp($result);} 
    } 
?> 

然後再將結果通過函數到文件是在這裏:

<?php 
function result_disp($results) 
{ 
if($fp && $results) 
{ 
while ($rows = mysql_fetch_row($results)) 
    { 
     fputcsv($fp, array_values($rows),chr(9)); 
    } die; 
} 
} 

最後關閉在腳本文件的末尾

fclose($fp); 
?> 

感謝

+0

$ fp在您的功能中不可用。將你的error_reporting設置爲一個合理的調試值(E_ALL),然後PHP會告訴你這樣的東西本身。並閱讀變量範圍的基礎知識,http://www.php.net/manual/en/language.variables.scope.php – CBroe

+0

另請注意,csv-headers位於HTTP標頭之間。應該在後者以換行符分隔後放置它們。 – Caramiriel

+0

謝謝,我在代碼的開頭嘗試了error_reporting(E_ALL),但它沒有報告任何錯誤:(。其次在頁面上爲全局變量提供建議我無法找到如果文件句柄$ fp可以聲明爲全局。 $ fp無論是在外部還是在函數內部,但它也沒有幫助。任何建議我怎麼能使它成爲全局的。謝謝 –

回答

0

你的第一個問題是,你的文件句柄不具備的功能範圍之內。在我看來,最好的辦法是將它傳遞給函數:

.... 
    elseif (mysql_num_rows($result)>0) 
    {result_disp($result, $fp);} 
.... 

function result_disp($results, $fp) 
{ 
if($fp && $results) 
{ 
while ($rows = mysql_fetch_row($results)) 
    { 
     fputcsv($fp, array_values($rows),chr(9)); 
    } //DO NOT PUT "die()" HERE 
} 
} 

你的第二個問題是函數內部的「死()」語句。 「die()」的目的是完全停止腳本。這是PHP自殺。因此,如果將其放入,result_disp的第一次調用結束時腳本將暫停。這意味着你不僅不會達到fclose($ fp),你永遠不會接觸任何其他呼叫result_disp。

你的第三個問題是你正在使用mysql_ *函數。由於以下原因,這些已被棄用(不再使用)。我有由它造成的數據庫連接凍結的個人經驗。您應該切換到mysqliPDO