Pregunta

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

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

¿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 ya. Simplemente no veo cómo hacer que PHP cree el archivo CSV y les permita descargar un archivo con la extensión .csv.

¿Fue útil?

Solución

Prueba:

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

Editar: 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;
}

Otros consejos

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

php: // salida
fputcsv

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 de MySQL (i) / PDO.

download_csv_results($results, 'your_name_here.csv');

Recuerde salir () después de llamar a esto si ha terminado con la página.

Además de todo lo que ya se dijo, es posible que deba agregar:

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

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

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 debes vincular 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 el resultado:

<a href="my_csv_creator.php?user=23&amp;othervariable=true">Get CSV</a>

my_csv_creator.php puede trabajar con las variables proporcionadas 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

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

Aquí hay un ejemplo completo de trabajo que usa PDO 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);
}

Primero crea los datos como 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);
*/

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 = 

Hey funciona muy bien .... !!!! Gracias Peter Mortensen y Connor Burton

<*>

? >

GET["start"]; $end =

Hey funciona muy bien .... !!!! Gracias Peter Mortensen y Connor Burton

<*>

? >

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.

Puede simplemente escribir sus datos en CSV utilizando la función fputcsv . Veamos el siguiente ejemplo. Escriba 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);

La forma más fácil es usar un clase CSV así:

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

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

Uso:

$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";
}

Ya vino muy buena solución. Solo estoy ingresando el código total para que un novato obtenga ayuda total

<?php
extract(

Ya vino muy buena solución. Solo estoy ingresando el código total para que un novato obtenga ayuda total

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

He guardado este código en csv-download.php

Ahora vea cómo he usado estos datos para descargar el archivo csv

<*>

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

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

<*>

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

Para que lo envíe como un CSV y le dé el nombre del archivo, use header ():

http://us2.php.net/header

header('Content-type: text/csv');
header('Content-disposition: attachment; filename="myfile.csv"');

En cuanto a la creación del propio CSV, solo deberías recorrer el conjunto de resultados, formatear la salida y enviarla, como lo harías con cualquier otro contenido.

Escribir tu propio código CSV es probablemente una pérdida de tiempo, solo usa un paquete como league / csv - se ocupa de todas las cosas difíciles para ti, la documentación es buena y es muy estable / confiable:

http://csv.thephpleague.com/

Necesitarás usar el compositor. Si no sabes qué es el compositor, te recomiendo que veas: https://getcomposer.org/

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

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

Aquí hay uno que he hecho antes, que recoge datos entre ciertas fechas. Espero que 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 = mysql_real_escape_string(

Aquí hay uno que he hecho antes, que recoge datos entre ciertas fechas. Espero que ayude.

<*>GET["start"]); $end = mysql_real_escape_string(

Aquí hay uno que he hecho antes, que recoge datos entre ciertas fechas. Espero que ayude.

<*>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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top