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

Tengo el e-mail del enlace, consulta de MySQL, etc. cubierto.

¿Cómo puedo yo, cuando se haga clic en el enlace, tiene un pop-up para descargar un CVS con el registro de MySQL?

Tengo toda la información para obtener el registro ya. Simplemente no veo cómo han PHP crear el archivo CSV y dejar que se descargue un archivo con una .extensión csv.

InformationsquelleAutor | 2008-10-20

20 Comentarios

  1. 279

    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

    Edit: he Aquí un fragmento de código que utilizo la opción de codificar los campos CSV:

    function maybeEncodeCSVField($string) {
        if(strpos($string, ',') !== false || strpos($string, '"') !== false || strpos($string, "\n") !== false) {
            $string = '"' . str_replace('"', '""', $string) . '"';
        }
        return $string;
    }
    • nota las reglas de los CSVs son importantes. Para asegurar una buena pantalla, poner comillas dobles alrededor de sus campos, y no se olvide de reemplazar comillas dobles dentro de campos a doble comillas dobles: «echo»»‘.str_replace(‘»‘,'»»‘,$record1).'»,»‘.str_replace….
    • Solo para aclarar, la correcta encabezado HTTP Content-Type para el CSV de texto/csv, no de la aplicación/csv. Dudo que cualquier navegador moderno va a cuidar bien de forma, pero ya no son las normas que bien podría usarlos.
    • En general, por favor, siga RFC 4180 a la hora de generar archivos CSV. tools.ietf.org/html/rfc4180
    • Barshay: OMG, que el RFC es una obra maestra: «Si entre comillas dobles se utilizan para delimitar los campos, a continuación, una doble cita que aparece en el interior de un campo debe ser escapado de los anteriores con otro doble de la oferta.». OTRO DOBLE-OFERTA!
  2. 460
    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://output

    fputcsv

    • Más gente necesita para ver este y voto de seguridad. Esto es fácilmente la mejor respuesta en esta página. PHP ya se ha incorporado en las funciones para dar formato CSV contenido. Todo el mundo debería utilizar los mismos. Gran respuesta, @Andrei 🙂
    • Lástima que fputcsv() no funciona correctamente a pesar de que 🙁 bugs.php.net/bug.php?id=50686
    • Bonito, pero la outputCSV función es innecesariamente complicado. Usted puede simplemente foreach más de $array, el envío de sus valores directamente en fputcsv. No hay necesidad de que __outputCSV y la array_walk 🙂 foreach($data as $vals) {fputcsv($filehandler,$vals);}
    • Gracias, he actualizado la respuesta.
    • Estoy teniendo algunos problemas con el francés caracteres en la matriz debido a que finalmente la necesidad .csv para ser abierto en Excel. Se ahoga en los caracteres acentuados. Cosas como "Prévalence","age 1","city 1" Alguna idea? Jugar con UTF-8 no ha servido hasta ahora.
    • ¿Cómo abrirlo? La forma correcta es Data -> Get External Data -> From Text (Excel 2010, las otras versiones deben tener iguales opción).
    • También usted no necesita Unicode como ANSI contiene el acento de los personajes. Y Excel debe abrir incluso sin importar. Que versión de Excel que utilizan?
    • No sé por qué, pero no su trabajo en mi caso. Estoy recuperación de filas de la base de datos como while($row as mysql_fetch_array($res)){$data[] = $row;}. También, no me voy a conseguir lo que php://output utilizado para
    • No su trabajo en localhost pero el trabajo en el servidor de hosting. Cualquier motivo? También, como he mencionado código anterior, los valores que se añaden dos veces en una fila
    • Funciona muy bien en mi instalación. El único cambio que he tenido que hacer es definir el delimitador a «;» para excel para abrir correctamente
    • Delimitador depende OS o Excel ajustes de exportación. He añadido una nota sobre delimitador.
    • Usted debe utilizar «en lugar de» para sus cadenas. Es más seguro y tiene un infinitesimal de mejora del rendimiento.
    • La forma en que es más seguro?
    • El uso de comillas simples primaria protege contra el error humano. Por ejemplo yo quiero a la salida de «un montón de dinero $$» y se olvidan de que tengo una variable en el ámbito llamado dinero$. Las comillas dobles que son, simplemente, no se necesita ahora son una garantía de responsabilidad si $el dinero pasa a tener la entrada del usuario en el mismo. Hay un montón de secuencias de escape en comillas dobles así que a menos que intencionalmente se están aprovechando de ellos es más seguro usar comillas simples para proteger contra el error humano, que es la más común de error en la programación del proyecto.
    • en caso de laravel en el archivo csv que estoy recibiendo twi adicional líneas en blanco en el inicio

  3. 18

    Aquí es una versión mejorada de la función de php.net que @Andrew publicado.

    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 MySQL(i)/DOP conjuntos de resultados.

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

    Recuerde exit() después de llamar a este si se hace con la página.

    • ¿Cómo se puede cambiar el separador de , a ; ?
    • ¿cómo debemos agregar un botón para activar este evento, por lo que el usuario será capaz de descargar el archivo CSV en la demanda ?
    • href=»http://php.net/manual/en/function.fputcsv.php» >RTM.
    • Voy a tener «SyntaxError: testigo Inesperado ILEGAL de error» con la línea «fopen(«php://output», «w»);» Cuando lo cambio a «$fp = fopen(‘estadísticas.csv’, ‘w’);» no mostrar mensaje de error. Pero luego, por supuesto, no funciona. ¿Cómo debo resolverlo ?
    • Esa es una pregunta por derecho propio y necesito más detalles para resolverlo.
    • Para simplificar la primera, en lugar de llamar con botón y javascript. Acabo de llamar a la download_csv_results función. Sin embargo, no escribir todo el contenido en una pantalla, no descargar cualquier tipo de archivo ?
    • Agregar fputcsv($outstream, array_keys($results[0])); justo antes de su foreach para incluir también los encabezados de columna.

  4. 16

    Además a todos ya se dijo, es posible que deba agregar:

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

    Es muy útil cuando el manejo de archivos con varios idiomas, tales como los nombres de personas o ciudades.

  5. 9

    El hilo es un poco antiguo, lo sé, pero para referencia en el futuro y para los noobs como yo:

    Todos los demás aquí se explica cómo crear el CSV, pero echo de menos una parte básica de la pregunta: ¿cómo vincular. Con el fin de enlace para la descarga del archivo CSV -, que acaba de enlace para el .archivo php, que a su vez responde como un .csv-archivo. El PHP encabezados de hacer eso. Esto permite cosas interesantes, como la posibilidad de agregar variables a la cadena de consulta y personalizar la salida:

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

    my_csv_creator.php puede trabajar con las variables dadas en el querystring y para ejemplo de uso diferentes o personalizada las consultas de base de datos, cambiar las columnas de la CSV, personalizar el nombre del archivo y así sucesivamente, por ejemplo:

    User_John_Doe_10_Dec_11.csv
    • Uh – alguien que esta leyendo esto ser MUY cautelosos a la hora de este enfoque. Yo apostaría a que las entradas no se escapó correctamente y esto puede llevar a grandes agujeros de seguridad en su aplicación.
    • Su método es muy seguro, y funciona muy bien. Usted puede fácilmente controlar el acceso a la sesión, y también puede almacenar toda la información que usted quiere poner en un archivo csv en una sesión en la var. A continuación, sólo unset que como parte del proceso de la conversión de un archivo csv. Me acaba de sugerir el uso de la sesión de vars, en lugar de una cadena de consulta.
    • No hay agujeros de seguridad de por sí con este método. Mientras el archivo php que se hace referencia está haciendo su trabajo de saneamiento y el acceso de cheques. Pero en realidad no tiene sentido para mostrar todos los de aquí. El punto del post es que se puede vincular a cualquier url que genera el csv.
  6. 7

    Crear su archivo, a continuación, devolver una referencia a él con el encabezado correcto para activar la opción Guardar Como – editar el siguiente según sea necesario. Pon tus 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 uso de «en línea» Content-Disposition significa que el navegador debe tratar de mostrar sin descarga (es decir, tienden a integrar una instancia de Excel para eso). «apego» es lo que se necesita para forzar una descarga.
  7. 5

    Aquí hay un ejemplo de trabajo utilizando PDO e incluyendo los 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);
    }
  8. 4

    Hacer primero 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);
    */
  9. 3

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

    ?>

    • Cualquier posibilidad de que usted podría explicar un poco más acerca de por qué funciona?
    • Hacer NO utilice este código en producción, es vulnerable a inyecciones SQL
  10. 2

    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 que cada línea de la $data matriz irá a una nueva línea de su recién creado archivo CSV. Solo funciona para PHP 5 y versiones posteriores.

  11. 2

    Usted puede simplemente escribir los datos en formato CSV mediante fputcsv función. vamos a echar un vistazo en el siguiente ejemplo. Escribir la lista de la matriz a un 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);
  12. 1

    La forma más fácil es usar un dedicado CSV clase como este:

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

    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";
    }
  14. 1

    Ya muy buena solución vino. Sólo estoy puting el total código para que un novato obtener el total de ayuda

    <?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 a ver cómo me han utilizado 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/>

    Así que cuando me han hecho clic en el enlace de descargar el archivo sin llevarme a la csv-download.php la página en el navegador.

  15. 0

    Para enviar como un archivo CSV y tienen que dar el nombre de archivo, usar header():

    http://us2.php.net/header

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

    Tan lejos como para hacer que el CSV en sí, sólo tendría que recorrer el conjunto de resultados, el formato de la salida y el envío, al igual que lo haría con cualquier otro tipo de contenido.

  16. 0

    Escribir su propio código CSV es probablemente una pérdida de tiempo, sólo tiene que utilizar un paquete, tales como la liga/csv – se ocupa de todas las cosas difíciles para usted, la documentación es buena y es muy estable y fiable:

    http://csv.thephpleague.com/

    Tendrá que ser mediante compositor. Si usted no sabe qué compositor es que le recomiendo que eche un vistazo: https://getcomposer.org/

  17. 0
    <?
        //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 );
    ?>
  18. 0

    Cómo escribir en el archivo CSV con PHP script? En realidad, yo estaba buscando, que también. Es un tipo de tarea fácil con PHP.
    fputs(manejador de contenido) – esta función funciona de manera eficiente para mí. En primer lugar usted necesita para abrir el archivo en el que usted necesita para 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);
    }
    • Siempre es favorecido para agregar el código para sí mismo, en lugar de la vinculación, como enlaces tiende a cambiar o desaparecer con el tiempo.
    • Su respuesta es un hilo muy antiguo. Mientras que en 2008, era una práctica común para construir su propia separada por comas de las líneas, el método correcto a partir de PHP 5.1.0 sería utilizar el construido en el fputcsv (función, php.net/fputcsv). Tenga cuidado al leer los antiguos hilos para asegurar que la información contenida en los mismos es todavía relevante.
  19. 0

    Aquí es uno que he hecho antes, el acaparamiento de datos entre determinadas 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($_GET["start"]);
        $end = mysql_real_escape_string($_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;
        }
    ?>
    • Hacer NO este código se utilice en la producción, es vulnerable a Inyección SQL
    • Esto está resuelto, sin embargo esto es muy viejo código y no debería utilizarse en todos modos.
  20. -1

    Poner en el $output variable de los datos CSV y echo con la correcta encabezados

    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;

Dejar respuesta

Please enter your comment!
Please enter your name here