2012-03-08 190 views
0

當然經過幾個小時的思考這個問題,我的問題的第一個評論讓我立即解決它。PHP fopen包含不需要的內容

問題是,儘管我在頁面頂部的自己的函數中包含了這段代碼,但我只是在$ _POST數組中設置了某個標誌時才調用它。我直到PHP文件結束時才檢查標誌。我在該功能之前移動了該檢查,並且它工作正常。

原來的問題是如下:


我試圖使用則fopen()函數在PHP輸出CSV文件,雖然它包含了我想要的數據,它也包含了整個在我真正想要輸出的內容之前,頁面的HTML結構以及內聯樣式表。我使用此代碼(從here)幾乎沒有改變。我很熟悉PHP流和輸出,所以我從我的希望是一個堅實的基礎開始:

$fileName = 'somefile.csv'; 

header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header('Content-Description: File Transfer'); 
header("Content-type: text/csv"); 
header("Content-Disposition: attachment; filename={$fileName}"); 
header("Expires: 0"); 
header("Pragma: public"); 

$fh = @fopen('php://output', 'w'); 

global $wpdb; 
$query = "SELECT * FROM `{$wpdb->prefix}my_table`"; 
$results = $wpdb->get_results($query, ARRAY_A); 

$headerDisplayed = false; 

foreach ($results as $data) { 
    // Add a header row if it hasn't been added yet 
    if (!$headerDisplayed) { 
     // Use the keys from $data as the titles 
     fputcsv($fh, array_keys($data)); 
     $headerDisplayed = true; 
    } 

    // Put the data into the stream 
    fputcsv($fh, $data); 
} 
// Close the file 
fclose($fh); 
// Make sure nothing else is sent, our file is done 
exit; 

我的假設是,這個例子的目的是要被包含在其自己的外部PHP文件,但由於對於我正在處理的約束,我試圖將其包含在內聯中。我用輸出緩衝了一下,但沒有獲得積極的結果,但是這些PHP文檔相當稀少,所以可能會丟失一些東西。

+0

內聯如何?你能告訴我們這個代碼是如何包含在你的其他代碼中的嗎? – webbiedave 2012-03-08 17:35:47

+0

相信與否,你的問題實際上解決了這個問題:) 問題是,儘管我在頁面的頂部包含了它自己的函數中的這段代碼,但我只是在設置了某個標誌$ _POST數組。我直到PHP文件結束時才檢查標誌。我在該功能之前移動了該檢查,並且它工作正常。 非常感謝! – Peter 2012-03-08 17:44:09

回答

0

當然,經過幾個小時的思考這個問題,我的問題的第一個評論讓我立即解決它。

問題是,儘管我在頁面頂部的自己的函數中包含了這段代碼,但我只是在$ _POST數組中設置了某個標誌時才調用它。我直到PHP文件結束時才檢查標誌。我在該功能之前移動了該檢查,並且它工作正常。

0

問題似乎是,同時您嘗試從相同的PHP文件,CSV文件和一些html內容輸出。你必須將它們分開,以擁有2個不同的URL。

我猜你的PHP代碼被你正在討論的html代碼(和css內聯)所包圍。

你有什麼做的是:

  • 有一個PHP腳本,只輸出CSV內容(僅包含您向我們展示代碼,當然是有開幕PHP標籤)

  • 有另一個生成html代碼的PHP腳本,並提供了一個鏈接到前面的腳本(例如)。

+0

我試圖避免這樣做,因爲我在一個平臺上工作,使得使用多個腳本非常困難。謝天謝地,我想出了一種方法可以在一個文件中完成這一切。如果你有興趣,我編輯了我的問題來解釋我做了什麼。 – Peter 2012-03-08 17:52:05

0

您在「包含內聯」原因的正確軌道上,爲什麼您要在數據前獲取所有其他信息。

這個腳本需要是它自己的直接調用的單獨文件,而不是將它內聯地包含在另一個腳本中。我知道你有其他的數據庫連接,並且必須先設置。您必須從標準頁面中提取這些頁面,並將其包含在此頁面上。