2017-02-17 10 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); 

아무 것도 파일에 인쇄되지 않으며 단지 비어 있습니다. 내가 잘못한 게있어?

내가 this page에서 찾을 수있는 fopen에 대한 모든 변화를 시도

편집 할 수 있지만 fputcsv를 사용할 때 그들은 모두 나에게 빈 파일을 제공합니다. 내가 파일 echo 배열에서만 데이터를 얻을. 편집

END 당신은 배열의 키는 DB에 쿼리에서 반환에서 헤더 배열이 설정되어 볼 수 있습니다. 나는 그들 echo을 할 수 있고 정확한 헤더를 얻는다.

그런 다음 데이터 행 자체가 있습니다. 원하지 않는 문자는 제거하지만 여전히 데이터 배열이므로 fputcsv으로 인쇄해야합니다. 다시 루프를 통해 배열 내용을 echo 수 있습니다. 이것이 수출을 지금 당장 얻는 방법이지만, 그게 해결 방법 일 뿐이며 fputcsv을 얻고 싶습니다. 내가 헤더 print_r

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

UPDATE 여기

출력을 것 :

내가 행이 인쇄 얻고 어떻게

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] => 
) 

l print_rfputcsv이 모두 파일에 인쇄되어 있어야합니다. 이것들은 파일의 유일한 것입니다.

+0

http 서버 오류 로그 파일에 표시되는 내용은 무엇입니까? – arkascha

+0

@arkascha 잘 모르겠습니다. 서버에서 찾을 수는 없지만 어디서 볼지는 모르겠습니다. 같은 디렉토리에서 웹 사이트가 있는지 확인했지만 거기에 없습니다.나는 또한 찾을 수 있었던 이름에'Log'를 가진 모든 폴더를 체크했습니다. – Mike

+0

헤더가 csv로 인쇄됩니까? 또한 $ modRow는 문자열이 아닙니다. 그것의 객체 –

답변

1

내가 틀린 첫 번째 답변을 삭제했습니다.

******************* 편집 *******************

당신이 필요 파일의 끝이 추가 :이 파일에 쓰기 완료 브라우저에 지시하고 불필요한 내용은 보안상의 이유로 브라우저로 전송되지 않습니다 보장

exit(); 

.

+0

그랬어! 감사! 몇 주 동안이 싸우고있어! – Mike

0

출력을 브라우저에 보내려면 php : // stdout을 사용할 수 없습니다. 대신 php : // 메모리를 사용하여 문자열을 저장 한 다음 다시 읽을 수 있습니다.

$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

좋아, 헤더를 보내는 것은 나에게 그렇게 생각하게했다. 당신은 그 때 그 (것)들을 필요로하지 않는다. 내가보기에 다른 것은 파일이 아닌 stdout에 쓰는 것입니다. 그리고 당신은 'wr'플래그를 사용하고 싶습니다. 'a + b'가 아닙니다. – pepe

+0

stdout에 쓰는 것은 실수로 복사해서 붙여 넣습니다. 위의 코드에서이를 수정했습니다. 나는 또한'w' 플래그로 열린 파일에 지금 쓰고 있음을 보여주기 위해 (질문에 포함 된 것을 포함하여) 제 코드를 업데이트했습니다. – Mike