Nie mogę uzyskać wbudowanej funkcji PHP fputcsv() do pracy. Oto, czego próbowałem:

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);

Ale nic nie zostanie wydrukowane do pliku, jest po prostu puste. Czy coś złużyłem?

EDYTUJ

Próbowałem każdej zmienności dla fopen, że mógłbym znaleźć na Ta strona , ale wszystkie dają mi pusty plik podczas korzystania z fputcsv. Dostaję tylko dane w pliku, gdy echo macierze.

KONIEC EDYCJI

Możesz zobaczyć tablicę nagłówka jest konfiguracja z klawiszy tablicowych zwróconych z zapytania do DB. Mogę je echo i uzyskać prawidłowe nagłówki.

Wtedy same są rzędy danych. Usunąłem niechciane postacie, ale są nadal tabłemce danych i powinny drukować za pomocą fputcsv. Ponownie mogę echo zawartość tablicy, zapętlą się przez niego. W ten sposób dostałem eksportu do pracy teraz, ale wiem, że to tylko obejście i chcesz uzyskać pracę fputcsv.

W ten sposób drukowane wiersze:

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

AKTUALIZACJA

Oto wyjście, gdy I print_r Headers:

Array
(
    [0] => Id
    [1] => QSRC
    [2] => QNAME
    [3] => QDEF
    [4] => ISACTIVE
    [5] => RUNREPORT
    [6] => FILEPATH
    [7] => TSQL
)

I oto jedna linia z print_r $modRow:

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

I print_r Oba po fputcsv powinni wydrukować je do pliku. Są to jedyne rzeczy w pliku.

1
Mike 17 luty 2017, 16:22

2 odpowiedzi

Najlepsza odpowiedź

Usunąłem moją pierwszą odpowiedź, ponieważ było nieprawidłowe.

*******************EDYTOWAĆ*******************

Musisz dodać to do końca pliku:

exit();

Dotyczy to przeglądarki, którą zakończyłeś pisanie do pliku i zapewnia, że żadna dodatkowa zawartość jest wysyłana do przeglądarki ze względów bezpieczeństwa.

1
Cody Brown 17 luty 2017, 21:14

Nie można użyć PHP: // Stdout, aby wysłać wyjście do przeglądarki. Możesz użyć pamięci PHP: //, aby zapisać ciąg, a następnie odczytać go z powrotem.

$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
pepe 17 luty 2017, 16:36