2017-02-17 146 views
0

我無法使PHP內置函數fputcsv()正常工作。這是我試過的:爲什麼我的fputcsv不能工作?

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

include('DBConn.php');    //My SQL server connection information 
include 'Helper/LogReport.php';  //Keeps a count of how many times reports are exported 


$query = $conn->query("SELECT QName, tsql from pmdb.QDefs WHERE QName = '" .$TableName. "'"); 
$query->execute(); 
$qdef = $query->fetch(PDO::FETCH_ASSOC); 


// Create and open file for writing 
$filepath = 'exports/'; 
$filename = $qdef['QName'] . '.csv'; 
try 
{ 
    header('Content-Encoding: UTF-8'); 
    header('Content-Type: text/csv; charset:UTF-8'); 
    header('Content-Disposition: attachment; filename="' . $filename . '"'); 
    //$openFile = fopen('php://output','w'); 
    $openFile = fopen($filepath . $filename,'w'); 
} 
catch(Exception $e) 
{ 
    echo "Something went wrong<br>"; 
    die(print_r($e->getMessage())); 
} 

//define separators 
$sep = ",";  //separator 
$br = "\r\n"; //line break 

// Use returned tsql field as query for dataset 
$tsql = $qdef['tsql']; 
if(isset($DataReturn)) 
{ 
    if(strpos($DataReturn['Order'],'EDIT')) 
    { 
     $DataReturn['Order'] = str_replace('EDIT','Id',$DataReturn['Order']); 
    } 
    $tsql = $tsql . $DataReturn['WhereClause'] . $DataReturn['Order'] . $DataReturn['Limit']; 
} 

$query = $conn->query($tsql); 
$query->execute(); 

// Output data to CSV file 
$headers = NULL; 
while ($row = $query->fetch(PDO::FETCH_ASSOC)) 
{ 
    //Write column headings to file 
    if (is_null($headers)) 
    { 
     $headers = array_keys((array)$row); 
     if ($headers[0] == 'ID') 
      $headers[0] = 'Id'; 
     fputcsv($openFile, $headers, ',','"'); 

    } 
    //Write data 
    $modRow = preg_replace('/ \d{2}:\d{2}:\d{2}\.\d{3}/', '', array_values($row)); 
    $modRow = preg_replace("/\r|\n/", "", $modRow); 
    /* 
    $modRow = str_replace('\r\n', " ", $modRow); 
    $modRow = str_replace('\n\r', " ", $modRow); 
    $modRow = str_replace('\n', " ", $modRow); 
    $modRow = str_replace('\r', " ", $modRow); 
    $modRow = str_replace(' ', " ", $modRow); 
    $modRow = str_replace('Â ', " ", $modRow); 
    $modRow = str_replace('"', '', $modRow); 
    $modRow = str_replace("'", "", $modRow); 
    */ 
    fputcsv($openFile, $modRow, ',','"'); 
} 

// Close file 
fclose($openFile); 

但是沒有任何東西會被打印到文件中,它只是空白。我是否設置了錯誤?

編輯

我已經試過了fopen每一個變化,我能找到this page,但他們都用fputcsv時給我一個空白文件。我只在文件中獲取數據時,我的數組爲echo。編輯

END你可以看到頭陣列安裝在數組鍵從查詢到DB返回。我可以echo他們並得到正確的標題。

然後有自己的數據行。我刪除了不需要的字符,但它們仍然是數據陣列,應該使用fputcsv進行打印。再次,我可以echo數組的內容通過循環它。這就是我現在正在使出口產品正常工作的原因,但我知道這只是一種解決方法,並且希望能夠使fputcsv正常工作。

這是我應得的行打印:

foreach($modRow as $RowPrint) 
{ 
    echo '"' .trim(unserialize(serialize($RowPrint))). '"' .$sep; 
} 
echo $br; 

UPDATE

這裏的輸出,當我print_r標題:

Array 
(
    [0] => Id 
    [1] => QSRC 
    [2] => QNAME 
    [3] => QDEF 
    [4] => ISACTIVE 
    [5] => RUNREPORT 
    [6] => FILEPATH 
    [7] => TSQL 
) 

,這裏是從一條線當我print_r$modRow

Array 
(
    [Id] => 60 
    [QSRC] => bau 
    [QNAME] => Oops I deleted this! 
    [QDEF] => SELECT REGION 
    [ISACTIVE] => 0 
    [RUNREPORT] => 0 
    [FILEPATH] => 
    [TSQL] => 
) 

print_rfputcsv應該已經打印到文件中。這些是文件中唯一的東西。

+0

您的http服務器錯誤日誌文件顯示什麼? – arkascha

+0

@arkascha我不知道。我無法在服務器上找到它,但我不確定在哪裏看。我已經檢查過與該網站相同的目錄,但它不在那裏。我還檢查了每個有我能找到的名稱中有'Log'的文件夾。 – Mike

+0

標題是否在csv中打印?另外$ modRow不是一個字符串。它的對象 –

回答

1

我刪除了我的第一個答案,因爲它是不正確的。

*******************編輯*******************

您需要添加到您的文件的末尾:

exit(); 

這告訴你寫完的文件瀏覽器,並確保沒有額外的內容發送到瀏覽器出於安全原因。

+0

這樣做!謝謝!一直在爭取這個星期! – Mike

0

您不能使用php:// stdout將輸出發送到瀏覽器。您可以使用php:// memory來存儲字符串,然後再讀取它。

$fd = fopen('php://memory','rw'); 
fwrite($fd, 'hey there'); //This would be your fputcsv stuff 
fseek($fd, 0); //Reset the file pointer 
$content = fread($fd, 4096); //This will read 4096 bytes maximum 
echo $content; 
+0

我不希望發送到瀏覽器的任何內容,我想將文件導出爲CSV。 – Mike

+0

好吧,你發送標題讓我覺得。那麼你不需要它們。我看到的另一件事是,你正在寫入標準輸出,而不是文件。而你想使用'wr'標誌或類似的,而不是'a + b' – pepe

+0

寫入標準輸出是我在複製和粘貼時犯的一個錯誤。我已經在上面的代碼中解決了這個問題。我還更新了我的代碼(包括問題中的內容),以表明我現在正在寫入使用'w'標誌打開的文件。 – Mike