2017-02-17 144 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