Crear un archivo CSV para un usuario en PHP


Answers

header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");

function outputCSV($data) {
  $output = fopen("php://output", "w");
  foreach ($data as $row)
    fputcsv($output, $row); // here you can change delimiter/enclosure
  fclose($output);
}

outputCSV(array(
  array("name 1", "age 1", "city 1"),
  array("name 2", "age 2", "city 2"),
  array("name 3", "age 3", "city 3")
));

php://output
fputcsv

Question

Tengo datos en una base de datos MySQL. Estoy enviando al usuario una URL para obtener sus datos como un archivo CSV.

Tengo el correo electrónico del enlace, consulta de MySQL, etc. cubierto.

¿Cómo puedo, cuando hacen clic en el enlace, tener una ventana emergente para descargar un CVS con el registro de MySQL?

Tengo toda la información para obtener el registro. Simplemente no veo cómo hacer que PHP cree el archivo CSV y les permita descargar un archivo con la extensión .csv.




Primero, haga que los datos sean una cadena con una coma como delimitador (separados por ","). Algo como esto

$CSV_string="No,Date,Email,Sender Name,Sender Email \n"; //making string, So "\n" is used for newLine

$rand = rand(1,50); //Make a random int number between 1 to 50.
$file ="export/export".$rand.".csv"; //For avoiding cache in the client and on the server 
                                     //side it is recommended that the file name be different.

file_put_contents($file,$CSV_string);

/* Or try this code if $CSV_string is an array
    fh =fopen($file, 'w');
    fputcsv($fh , $CSV_string , ","  , "\n" ); // "," is delimiter // "\n" is new line.
    fclose($fh);
*/



<?
    // Connect to database
    $result = mysql_query("select id
    from tablename
    where shid=3");
    list($DBshid) = mysql_fetch_row($result);

    /***********************************
    Write date to CSV file
    ***********************************/

    $_file = 'show.csv';
    $_fp = @fopen( $_file, 'w' );

    $result = mysql_query("select name,compname,job_title,email_add,phone,url from UserTables where id=3");

    while (list( $Username, $Useremail_add, $Userphone, $Userurl) = mysql_fetch_row($result))
    {
        $_csv_data = $Username.','.$Useremail_add.','.$Userphone.','.$Userurl . "\n";
        @fwrite( $_fp, $_csv_data);
    }
    @fclose( $_fp );
?>



La forma más fácil es usar una clase de CSV dedicada como esta:

$csv = new csv();
$csv->load_data(array(
    array('name'=>'John', 'age'=>35),
    array('name'=>'Adrian', 'age'=>23), 
    array('name'=>'William', 'age'=>57) 
));
$csv->send_file('age.csv'); 



Coloque en la variable $output los datos CSV y echo con los encabezados correctos

header("Content-type: application/download\r\n");
header("Content-disposition: filename=filename.csv\r\n\r\n");
header("Content-Transfer-Encoding: ASCII\r\n");
header("Content-length: ".strlen($output)."\r\n");
echo $output;



Ya llegó una muy buena solución. Solo pongo el código total para que un novato reciba ayuda total

<?php
extract($_GET); //you can send some parameter by query variable. I have sent table name in *table* variable

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$table.csv");
header("Pragma: no-cache");
header("Expires: 0");

require_once("includes/functions.php"); //necessary mysql connection functions here

//first of all I'll get the column name to put title of csv file.
$query = "SHOW columns FROM $table";
$headers = mysql_query($query) or die(mysql_error());
$csv_head = array();
while ($row = mysql_fetch_array($headers, MYSQL_ASSOC))
{
    $csv_head[] =  $row['Field'];
}
echo implode(",", $csv_head)."\n";

//now I'll bring the data.
$query = "SELECT * FROM $table";
$select_c = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
    foreach ($row as $key => $value) {
            //there may be separator (here I have used comma) inside data. So need to put double quote around such data.
        if(strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) {
            $row[$key] = '"' . str_replace('"', '""', $value) . '"';
        }
    }
    echo implode(",", $row)."\n";
}

?>

Guarde este código en csv-download.php

Ahora mira cómo he usado esta información para descargar el archivo csv

<a href="csv-download.php?table=tbl_vfm"><img title="Download as Excel" src="images/Excel-logo.gif" alt="Download as Excel" /><a/>

Entonces, cuando hago clic en el enlace, descargo el archivo sin llevarme a la página csv-download.php en el navegador.




¿Cómo escribir en un archivo CSV usando un script PHP? En realidad, yo también estaba buscando eso también. Es una tarea fácil con PHP. fputs (controlador, contenido): esta función funciona de manera eficiente para mí. Primero necesita abrir el archivo en el que necesita escribir el contenido usando fopen ($ CSVFileName, 'w').

$CSVFileName = “test.csv”;
$fp = fopen($CSVFileName, ‘w’);

//Multiple iterations to append the data using function fputs()
foreach ($csv_post as $temp)
{
    $line = “”;
    $line .= “Content 1″ . $comma . “$temp” . $comma . “Content 2″ . $comma . “16/10/2012″.$comma;
    $line .= “\n”;
    fputs($fp, $line);
}



Método simple -

$data = array (
    'aaa,bbb,ccc,dddd',
    '123,456,789',
    '"aaa","bbb"');

$fp = fopen('data.csv', 'w');
foreach($data as $line){
    $val = explode(",",$line);
    fputcsv($fp, $val);
}
fclose($fp);

Entonces, cada línea de la matriz $data irá a una nueva línea de su archivo CSV recién creado. Solo funciona solo para PHP 5 y posteriores.




Cree su archivo y luego devuelva una referencia con el encabezado correcto para activar Guardar como - edite lo siguiente según sea necesario. Coloque sus datos CSV en $ csvdata.

$fname = 'myCSV.csv';
$fp = fopen($fname,'w');
fwrite($fp,$csvdata);
fclose($fp);

header('Content-type: application/csv');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);



Además de todo lo dicho, es posible que deba agregar:

header("Content-Transfer-Encoding: UTF-8");

Es muy útil cuando maneja archivos con múltiples idiomas, como nombres de personas o ciudades.






Related