Código PHP para convertir una consulta MySQL a CSV [cerrado]
128
¿Cuál es la forma más eficiente de convertir una consulta MySQL a CSV en PHP, por favor?
Sería mejor evitar los archivos temporales, ya que esto reduce la portabilidad (se requieren rutas de directorio y configuración de permisos del sistema de archivos).
El CSV también debe incluir una línea superior de nombres de campo.
técnicamente, esto está separado por tabuladores;)
John Douthat
5
Tenga en cuenta el uso de barras inclinadas SELECT INTO OUTFILEincluso en Windows.
Johan
1
Hola, esto funciona bien para el formato xls, pero si trato de guardar como archivo CSV, muestra todos los resultados en 1 columna. Quiero guardar esto como archivo csv.
vinod reddy
Entre los dos anteriores, ¿cuál es mejor, más seguro y por qué?
Chella
1
Yo tendería a sugerir que la segunda opción es más segura ya que `SELECT INTO OUTFILE requiere que el usuario de mysql tenga acceso al sistema de archivos para cambiar archivos, lo cual es un riesgo potencialmente grande.
Jeepstone
91
Mira esta pregunta / respuesta . Es más conciso que el de @ Geoff y también usa la función fputcsv incorporada.
En caso de que alguien más sea tan estúpido como yo, no lo reemplace php://outputcon un nombre de archivo real ni intente cerrarlo con un fcloseal final: no es un archivo real, solo un alias para el flujo de salida. De todos modos, esta respuesta funcionó perfectamente para mí, ¡gracias Jrgns!
Para MySQL moderno, puede usar: $ encabezados [] = mysqli_fetch_field_direct ($ resultado, $ i) -> nombre;
Ben en CA
Y cambie las otras funciones mysql_ por funciones mysqli_.
Ben en CA
6
Si desea que la descarga se ofrezca como una descarga que se pueda abrir directamente en Excel, esto puede funcionar para usted: (copiado de un antiguo proyecto mío inédito)
Estas funciones configuran los encabezados:
function setExcelContentType(){if(headers_sent())returnfalse;
header('Content-type: application/vnd.ms-excel');returntrue;}function setDownloadAsHeader($filename){if(headers_sent())returnfalse;
header('Content-disposition: attachment; filename='. $filename);returntrue;}
Este envía un CSV a una secuencia usando un resultado de mysql
Gracias john código muy útil. Tuve que modificar una línea para la función csvFromResult. en lugar de while ($ fila = mysql_fetch_row ($ resultado)) {fputcsv ($ flujo, $ fila); $ filas ++; }, tuve que usar while ($ fila = mysql_fetch_row ($ resultado)) {$ datos [] = $ fila; // fputcsv ($ flujo, $ fila); // $ filas ++; } foreach ($ datos como $ d) {fputcsv ($ flujo, $ d); }. gracias de nuevo por un código tan maravilloso.
codingbbq
3
// Export to CSVif($_GET['action']=='export'){
$rsSearchResults = mysql_query($sql, $db)ordie(mysql_error());
$out ='';
$fields = mysql_list_fields('database','table',$db);
$columns = mysql_num_fields($fields);// Put the name of all fieldsfor($i =0; $i < $columns; $i++){
$l=mysql_field_name($fields, $i);
$out .='"'.$l.'",';}
$out .="\n";// Add all values in the tablewhile($l = mysql_fetch_array($rsSearchResults)){for($i =0; $i < $columns; $i++){
$out .='"'.$l["$i"].'",';}
$out .="\n";}// Output to browser with appropriate mime type, you choose ;)
header("Content-type: text/x-csv");//header("Content-type: text/csv");//header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=search_results.csv");
echo $out;exit;}
Respuestas:
( la documentación para esto está aquí: http://dev.mysql.com/doc/refman/5.0/en/select.html )
o:
fuente
SELECT INTO OUTFILE
incluso en Windows.Mira esta pregunta / respuesta . Es más conciso que el de @ Geoff y también usa la función fputcsv incorporada.
fuente
php://output
con un nombre de archivo real ni intente cerrarlo con unfclose
al final: no es un archivo real, solo un alias para el flujo de salida. De todos modos, esta respuesta funcionó perfectamente para mí, ¡gracias Jrgns!Mire la documentación sobre la sintaxis SELECT ... INTO OUTFILE.
fuente
Una actualización de la solución @jrgns (con algunas ligeras diferencias de sintaxis).
fuente
Si desea que la descarga se ofrezca como una descarga que se pueda abrir directamente en Excel, esto puede funcionar para usted: (copiado de un antiguo proyecto mío inédito)
Estas funciones configuran los encabezados:
Este envía un CSV a una secuencia usando un resultado de mysql
Este usa la función anterior para escribir un CSV en un archivo, dado por $ filename
Y aquí es donde ocurre la magia;)
Por ejemplo:
fuente
fuente