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

しかし、ファイルには何も印刷されません。ただ空白です。私は間違って何かを設定していますか?

EDIT

私はthis pageに見つけることができるfopenごとにバリエーションを試してみましたが、fputcsvを使用している場合、それらはすべて私に空のファイルを与えます。私はechoの配列のときにのみ、ファイル内のデータを取得します。 EDIT

OF

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 
) 

、ここから1行ですときprint_r$modRow

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

I print_rfputcsvの後に両方ともファイルに印刷する必要があります。これらはファイル内の唯一のものです。

+0

httpサーバのエラーログファイルには何が表示されますか? – arkascha

+0

@arkascha私は分かりません。私はサーバー上でそれを見つけることができませんが、私はどちらを見てもわかりません。私は同じディレクトリにウェブサイトがあることを確認しましたが、そこにはありません。また、私が見つけた名前の 'Log'を持つすべてのフォルダをチェックしました。 – Mike

+0

ヘッダーはcsvで印刷されますか?また、$ modRowは文字列ではありません。そのオブジェクト –

答えて

1

私の最初の答えは間違っていたので削除しました。

******************* EDIT *******************

あなたがする必要がありますファイルの末尾にこれを追加します。これは、あなたがファイルへの書き込みを終了しているブラウザに指示し、余分なコンテンツは、セキュリティ上の理由から、ブラウザに送信されませんが保証

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

さて、ヘッダーを送信すると、私はそれを考えるようになりました。あなたはそれらを必要としません。私が見ているもう一つのことは、あなたがファイルではなく標準出力に書いていることです。そして、 'a + b'ではなく 'wr'フラグなどを使用したい – pepe

+0

stdoutへの書き込みは、私がコピーアンドペーストで行った間違いでした。私は上記のコードでそれを修正しました。また、私は 'w'フラグで開かれたファイルに書いていることを示すために、私のコード(質問に含まれるものを含む)を更新しました。 – Mike

関連する問題