array - php download csv
Crear un archivo CSV para un usuario en PHP (20)
¿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 debe abrir el archivo en el que necesita escribir contenido usando fopen ($ CSVFileName, ''wb'').
$CSVFileName = “test.csv”;
$fp = fopen($CSVFileName, ‘wb’);
//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);
}
Tengo datos en una base de datos MySQL. Estoy enviando al usuario una URL para obtener sus datos como un archivo CSV.
Tengo la dirección de correo del enlace, consulta MySQL, etc. cubierto.
¿Cómo puedo, al hacer clic en el enlace, tener un pop-up para descargar un CVS con el registro de MySQL?
Tengo toda la información para obtener el registro ya. Simplemente no ver cómo tener PHP crear el archivo CSV y dejar que descarga un archivo con la extensión .csv.
Además de todo lo que ya se dijo, es posible que necesite agregar:
header("Content-Transfer-Encoding: UTF-8");
Es muy útil cuando se manejan archivos con varios idiomas, como los nombres de personas o ciudades.
Aquí hay un ejemplo completo de trabajo que usa DOP e incluye encabezados de columna:
$query = $pdo->prepare(''SELECT * FROM test WHERE id=?'');
$query->execute(array($id));
$results = $query->fetchAll(PDO::FETCH_ASSOC);
download_csv_results($results, ''test.csv'');
exit();
function download_csv_results($results, $name)
{
header(''Content-Type: text/csv'');
header(''Content-Disposition: attachment; filename=''. $name);
header(''Pragma: no-cache'');
header("Expires: 0");
$outstream = fopen("php://output", "wb");
fputcsv($outstream, array_keys($results[0]));
foreach($results as $result)
{
fputcsv($outstream, $result);
}
fclose($outstream);
}
Aquí hay una versión mejorada de la función de php.net que @Andrew publicó.
function download_csv_results($results, $name = NULL)
{
if( ! $name)
{
$name = md5(uniqid() . microtime(TRUE) . mt_rand()). ''.csv'';
}
header(''Content-Type: text/csv'');
header(''Content-Disposition: attachment; filename=''. $name);
header(''Pragma: no-cache'');
header("Expires: 0");
$outstream = fopen("php://output", "wb");
foreach($results as $result)
{
fputcsv($outstream, $result);
}
fclose($outstream);
}
Es realmente fácil de usar y funciona muy bien con los conjuntos de resultados MySQL (i) / PDO.
download_csv_results($results, ''your_name_here.csv'');
Recuerde exit()
después de llamar a esto si ha terminado con la página.
Aquí hay uno que he hecho antes, que recoge datos entre ciertas fechas. Espero eso ayude.
<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
ini_set(''display_errors'',1);
$private=1;
error_reporting(E_ALL ^ E_NOTICE);
mysql_connect("localhost", "user", "pass") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());
$start = $_GET["start"];
$end = $_GET["end"];
$query = "SELECT * FROM customers WHERE created>=''{$start} 00:00:00'' AND created<=''{$end} 23:59:59'' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
$result.="{$row[''email'']},";
$result.="/n";
echo $result;
}
?>
Coloque en la variable $output
los datos CSV y haga eco 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;
Cree su archivo y luego devuélvale una referencia con el encabezado correcto para activar Guardar como: edite lo siguiente según sea necesario. Ponga sus datos CSV en $ csvdata.
$fname = ''myCSV.csv'';
$fp = fopen($fname,''wb'');
fwrite($fp,$csvdata);
fclose($fp);
header(''Content-type: application/csv'');
header("Content-Disposition: inline; filename=".$fname);
readfile($fname);
El hilo es un poco viejo, lo sé, pero para futuras referencias y para noobs como yo:
Todos los demás aquí explican cómo crear el CSV, pero se pierden una parte básica de la pregunta: cómo vincular. Para enlazar a la descarga del archivo CSV, solo se vincula al archivo .php, que a su vez responde como un archivo .csv. Los encabezados de PHP hacen eso. Esto permite cosas interesantes, como agregar variables a la cadena de consulta y personalizar la salida:
<a href="my_csv_creator.php?user=23&othervariable=true">Get CSV</a>
my_csv_creator.php puede trabajar con las variables dadas en la cadena de consulta y, por ejemplo, usar consultas de bases de datos diferentes o personalizadas, cambiar las columnas del CSV, personalizar el nombre de archivo, etc., por ejemplo:
User_John_Doe_10_Dec_11.csv
En lugar de:
$query = "SELECT * FROM customers WHERE created>=''{$start} 00:00:00'' AND created<=''{$end} 23:59:59'' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
$result.="{$row[''email'']},";
$result.="/n";
echo $result;
}
Utilizar:
$query = "SELECT * FROM customers WHERE created>=''{$start} 00:00:00'' AND created<=''{$end} 23:59:59'' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
echo implode(",", $row)."/n";
}
Escribir su propio código CSV es probablemente una pérdida de tiempo, solo use un paquete como league / csv - se ocupa de todas las cosas difíciles para usted, la documentación es buena y es muy estable / confiable:
Tendrás que estar usando el compositor. Si no sabes qué es el compositor, te recomiendo que veas: https://getcomposer.org/
Hey funciona muy bien .... !!!! Gracias Peter Mortensen y Connor Burton
<?php
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
ini_set(''display_errors'',1);
$private=1;
error_reporting(E_ALL ^ E_NOTICE);
mysql_connect("localhost", "user", "pass") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());
$start = $_GET["start"];
$end = $_GET["end"];
$query = "SELECT * FROM customers WHERE created>=''{$start} 00:00:00'' AND created<=''{$end} 23:59:59'' ORDER BY id";
$select_c = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($select_c, MYSQL_ASSOC))
{
$result.="{$row[''email'']},";
$result.="/n";
echo $result;
}
?>
Método simple -
$data = array (
''aaa,bbb,ccc,dddd'',
''123,456,789'',
''"aaa","bbb"'');
$fp = fopen(''data.csv'', ''wb'');
foreach($data as $line){
$val = explode(",",$line);
fputcsv($fp, $val);
}
fclose($fp);
Por lo tanto, cada línea de la matriz $data
irá a una nueva línea de su archivo CSV recién creado. Solo funciona para PHP 5 y versiones posteriores.
Para que lo envíe como un CSV y le dé el nombre del archivo, use header ():
header(''Content-type: text/csv'');
header(''Content-disposition: attachment; filename="myfile.csv"'');
En lo que respecta a la creación del propio CSV, solo debe recorrer el conjunto de resultados, formatear la salida y enviarla, como lo haría con cualquier otro contenido.
Primero haga los datos como una cadena con una coma como delimitador (separado con ","). 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);
*/
Simplemente puede escribir sus datos en CSV usando la función fputcsv . Veamos el siguiente ejemplo. Escribir la matriz de la lista en el archivo CSV
$list[] = array("Cars", "Planes", "Ships");
$list[] = array("Car''s2", "Planes2", "Ships2");
//define headers for CSV
header(''Content-Type: text/csv; charset=utf-8'');
header(''Content-Disposition: attachment; filename=file_name.csv'');
//write data into CSV
$fp = fopen(''php://output'', ''wb'');
//convert data to UTF-8
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($list as $line) {
fputcsv($fp, $line);
}
fclose($fp);
Tratar:
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo "record1,record2,record3/n";
die;
etc
Edición: aquí hay un fragmento de código que utilizo para codificar opcionalmente campos CSV:
function maybeEncodeCSVField($string) {
if(strpos($string, '','') !== false || strpos($string, ''"'') !== false || strpos($string, "/n") !== false) {
$string = ''"'' . str_replace(''"'', ''""'', $string) . ''"'';
}
return $string;
}
Ya vino muy buena solución. Solo estoy poniendo el código total para que un novato obtenga 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";
}
?>
He guardado este código en csv-download.php
Ahora vea cómo he usado estos datos 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 hice clic en el enlace, descargo el archivo sin llevarme a la página csv-download.php en el navegador.
<?
// 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, ''wb'' );
$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 );
?>
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
function outputCSV($data) {
$output = fopen("php://output", "wb");
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")
));