簡體   English   中英

PHP導出為CSV不會將所有數據發送到文件

[英]PHP Export to CSV does not send all data to the file

我正在從我的PHP報告網站導出為CSV。 我有超過80k行的報告。 當我導出其中之一時,不會導出整個數據集。 我已經嘗試過幾次報告為88k +行,並且它導出87k +行,然后在導出的最后一行中停下來。

到底是怎么回事? 從MSSQL中提取數據的查詢是正確的(我已經檢查過)。

這是我的導出文件:

error_reporting(E_ALL);
ini_set('display_errors', 1);
include('DBConn.php');
include 'Helper/LogReport.php';
if(isset($_GET['Id']))
{
    $id = $_GET['Id'];
    $query = $conn->prepare('SELECT QName, tsql from pmdb.QDefs WHERE Id = ' . $id);
    $query->execute();
    $qdef = $query->fetch(PDO::FETCH_ASSOC);
}
else
{        
    $query = $conn->prepare("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 . '"');
}
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->prepare($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($row);
        if ($headers[0] == 'ID')
            $headers[0] = 'Id';
        foreach($headers as $Header)
        {
            echo $Header. ",";
        }
        echo $br;
    }
    //Write data
    $modRow = preg_replace('/ \d{2}:\d{2}:\d{2}\.\d{3}/', '', $row);
    $modRow = preg_replace( "/\r|\n/", "", $modRow );

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

我看不到會阻止數據流完成導出的任何內容。

編輯

我已經嘗試過像這樣的fputcsv()方法:

error_reporting(E_ALL);
ini_set('display_errors', 1);
include('DBConn.php');
include 'Helper/LogReport.php';
//print_r($_GET);
if(isset($_GET['Id']))
{
    $id = $_GET['Id'];
    $query = $conn->prepare('SELECT QName, tsql from pmdb.QDefs WHERE Id = ' . $id);
    $query->execute();
    $qdef = $query->fetch(PDO::FETCH_ASSOC);
}
else
{        
    $query = $conn->prepare("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
{
    $openFile = fopen($filepath . $filename,'a');
    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset:UTF-8');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
}
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->prepare($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($row);
        if ($headers[0] == 'ID')
            $headers[0] = 'Id';
        fputcsv($openFile, $headers);
    }
    //Write data
    $modRow = preg_replace('/ \d{2}:\d{2}:\d{2}\.\d{3}/', '', $row);
    $modRow = preg_replace( "/\r|\n/", "", $modRow );

    fputcsv($openFile, $modRow, ',','"');//print_r($modRow);
    foreach($modRow as $RowPrint)
    {
        error_log(date("Y/m/d h:i:sa "). ' RowPrint: ' .$RowPrint. '\n',3,'C:\Temp\LogPHP.txt');
    }
    echo $br;
}

// Close file
fclose($openFile);

這只會創建一個空文件。

UPDATE

我為應該有103k +行的報告運行了兩個報告。 他們都停止在61000到62000行之間。 我做了一個角色統計,他們倆都有大約4000萬。 關於4000萬個字符的限制,我什么都看不到。

我了解了它,並弄清楚了如何使fputcsv起作用。

我需要在exit()的末尾添加一個exit() 現在,它不僅發送所有數據, fputcsv可以正常工作。 我從另一個有關使fputcsv正常工作的問題中得到了答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM