Экспорт CSV | Странное поведение - PullRequest
0 голосов
/ 29 января 2012

Итак, я думаю, что задавал этот вопрос и другие, связанные с ним, более двух раз.Но я не могу понять, что происходит.

Я использую эту функцию PHP для экспорта некоторых данных из таблицы в таблицу CSV.Я тестирую на локальном хосте (XAAMP):

// Export CSV By User Level
public function CSVData($path, $level) {

    switch ($level) {
        case 0:
            $filename = $path."/standard_members_".date('Y')."_".date('m')."_".date('d').".csv";
            break;
        case 1:
            $filename = $path."/special_members_".date('Y')."_".date('m')."_".date('d').".csv";
            break;
        case 2:
            $filename = $path."/admin_members_".date('Y')."_".date('m')."_".date('d').".csv";
            break;
        default:
            break;
    }


    $sql = "SELECT user_name, user_username, user_email, user_register_date INTO OUTFILE '$filename' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' FROM users WHERE user_level = '$level'";

    if ($stmt = $this->connect->prepare($sql)) {    
        if(!($stmt->execute())){
            print_r($stmt->error);
        }
        $stmt->close();
    } else {
        $error              = true;
        $message['error']   = true;
        $message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE;
        return json_encode($message);
    }


    if(!is_file($filename)) {
        die('file not found');
    } else {
        header('Content-Type: application/csv');
        header("Content-Disposition: attachment; filename=$filename");
        header('Expires: 0');
        header('Pragma: no-cache');
        readfile($filename);
    }

}

И у меня есть форма, которая выполняет действие, я имею в виду, что она передает действие в файл PHP, который обрабатывает вышеуказанную функцию, и это действиекод:

<?php

    include '../assets/class/login/loginsys.php';

    $extension = new extension; 

    if ($_GET['action'] == 0) {

        $extension->CSVData('exports', 0);

    } elseif ($_GET['action'] == 1) {

        $extension->CSVData('exports', 1);

    } elseif ($_GET['action'] == 2) {

    $extension->CSVData('exports', 2);

    }

    exit();

?>

Что происходит следующим образом:

- когда я нажимаю кнопку отправки в имеющейся форме, она отправляет значение 0, 1 или 2 в код действия;-код действия получает значение и обрабатывает соответственно;-но если бы я не создал папку 'exports' на localhost, если бы дал мне эту ошибку:

Can't create/write to file 'C:xampphtdocsloginadminexports\standard_members_2012_01_28.csv' (Errcode: 2);

-и я создал ее, чтобы она могла работать;-в настоящее время в этой папке создается файл CSV, а данные сбрасываются в таблицу CSV;- но файл, который открывается в моем браузере (вложение, которое загружается так, как если бы вы щелкали файл с какого-либо веб-сайта и загружали его), оно пустое, даже если файл, экспортированный в «export», содержит данные;-и другое дело, что, когда файл уже существует в папке «export», созданная таблица говорит мне:

File 'exports/admin_members_2012_01_29.csv' already exists

Итак, мой вопрос: почему происходит то, что я описал?И есть ли способ заставить запрос MySql перезаписать предыдущий файл CSV?

1 Ответ

1 голос
/ 29 января 2012

Вам не нужен этот временный файл. Как насчет этого:

define('CSV_SEPARATOR', ',');

// CSV download headers
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="my.csv"');

// A file handle to PHP output stream
$fp = fopen('php://output', 'w');

// UTF-8 BOM
echo "\xEF\xBB\xBF";

// Get data from database
$data = ...;

// List of columns
$columns = array(
  'User name',
  'First name',
  'Last name'
);

foreach ($data as $key => $row) {

  // Write columns
  if ($key == 0) {
    fputcsv($fp, $columns, CSV_SEPARATOR);
  }

  // Write data
  fputcsv($fp, $row, CSV_SEPARATOR);
}

fclose($fp);

Красиво, не правда ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...