Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么赢了';这不是我的工作吗?_Php_Arrays_Fputcsv - Fatal编程技术网

Php 为什么赢了';这不是我的工作吗?

Php 为什么赢了';这不是我的工作吗?,php,arrays,fputcsv,Php,Arrays,Fputcsv,我无法让PHP内置函数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 expor

我无法让PHP内置函数
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);
更新

以下是我打印标题时的输出:

Array
(
    [0] => Id
    [1] => QSRC
    [2] => QNAME
    [3] => QDEF
    [4] => ISACTIVE
    [5] => RUNREPORT
    [6] => FILEPATH
    [7] => TSQL
)
这是我打印
$modRow
时的一行:

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

I
print\r
fputcsv
应该将它们打印到文件中之后。这些是文件中唯一的内容。

我删除了我的第一个答案,因为它不正确

*******************编辑*******************

您需要将以下内容添加到文件末尾:

exit();

这会告诉浏览器您已完成对文件的写入,并确保不会出于安全原因向浏览器发送额外内容。

您不能使用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;

@chris85
$modRow
不是字符串。这是一个从
$row=$query->fetch(PDO::fetch_ASSOC)
创建的数组,然后更新以删除不需要的字符。你看,不查看错误日志文件的问题正是我们看到的。除了使用这些信息,还有一个巨大的猜谜游戏正在进行中。这毫无意义。如果不监视http服务器错误日志文件,则无法开发或操作网站。@Mike添加一个
exit()在末尾。并改回使用
$openFile=fopen('php://output","w",用于$openFile@CodyBrown成功了!正在添加
exit()
!把这个作为答案,我就结束这个问题!我不想要任何东西发送到浏览器,我想要一个导出到CSV的文件。好的,你发送的标题让我这么想。那你就不需要了。我看到的另一件事是你在写标准输出,而不是文件。你想使用“wr”标志或类似的标志,而不是“a+b”。写到stdout是我在复制粘贴中犯的一个错误。我已经在上面的代码中修复了这个问题。我还更新了我的代码(包括问题中的内容),以显示我现在正在写入一个使用
w
标志打开的文件。如果我删除这三行
标题
,那么当我单击导出按钮时,只会得到一个空白屏幕,没有文件或任何东西。就是这样!谢谢我们已经为此奋斗了好几个星期了!
$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;