简体   繁体   中英

Using PHP to generate CSV file from MySQLi is saving but not asking to download

So my following code generated a CSV based on specified tables and generates file and saves to downloads/filename.csv however its not asking the user to download once its generated. Any ideas why?

Here is the code:

PHP

    header("Content-type: text/csv"); 

        // Connect to the database
        $mysqli = new mysqli(DATABASE_HOST, DATABASE_USER, DATABASE_PASS, DATABASE_NAME);

        // output any connection error
        if ($mysqli->connect_error) {
            die('Error : ('.$mysqli->connect_errno .') '. $mysqli->connect_error);
        }

        $tables = array('invoices', 'customers', 'invoice_items'); // array of tables need to export

        $file_name = 'invoice-export-'.date('d-m-Y').'.csv';   // file name
        $file_path = 'downloads/'.$file_name; // file path

        $file = fopen($file_path, "w"); // open a file in write mode
        chmod($file_path, 0777);    // set the file permission

        // loop for tables
        foreach($tables as $table) {
            $table_column = array();
            $query_table_columns = "SHOW COLUMNS FROM $table";

            // fetch table field names
            if ($result_column = mysqli_query($mysqli, $query_table_columns)) {
                while ($column = $result_column->fetch_row()) {
                    $table_column[] = $column[0];
                }
            }

            // Format array as CSV and write to file pointer
            fputcsv($file, $table_column, ",", '"');

            $query_table_columns_data = "SELECT * FROM $table";

            if ($result_column_data = mysqli_query($mysqli, $query_table_columns_data)) {

                // fetch table fields data
                while ($column_data = $result_column_data->fetch_row()) {
                    $table_column_data = array();
                    foreach($column_data as $data) {
                        $table_column_data[] = $data;
                    }

                    // Format array as CSV and write to file pointer
                    fputcsv($file, $table_column_data, ",", '"');
                }
            }
}

    // close file pointer
    fclose($file);

    // ask either save or open
    header("Pragma: public");
    header("Expires: 0");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename='{$file_name}';" );
    header("Content-Transfer-Encoding: binary");

    // open a saved file to read data
    $fhandle = fopen($file_path, 'r');
    fpassthru($fhandle);
    fclose($fhandle);
    $mysqli->close();
    die;

This should allow you to select the field you want to write to the CSV file, and their order.

// loop over the rows, outputting them
while($row = $results->fetch_assoc()) {
    $data = [
       $row["myfirstfield]",
       $row["mysecondfield"],
       ....
       ];
    fputcsv($output, $data);
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM