Digamos que tengo una base de datos ... ¿hay alguna manera de exportar lo que tengo de la base de datos a un archivo CSV (y un archivo de texto [si es posible]) a través de PHP?
en el servidor local está funcionando, pero en uno distante muestra una nueva página con contenido y sin ventana de descarga (perdón por mi inglés)
khaled_webdev
2
Puede haber varias razones para los errores, la forma más sencilla de encontrarlos es mirar su archivo apache error.log.
Alain Tiemblo
77
Necesitas hacer una die();llamada justo después echo array2csv();, editará mi respuesta. Asegúrese de generar su csv antes de mostrar algo en su página.
Alain Tiemblo
1
@ ring0 Supongo que poner la fecha pasada en el encabezado deshabilita el almacenamiento en caché de la página, mira el segundo ejemplo php.net/manual/en/function.header.php
Abhishek Madhani
2
Da tipos mime a su navegador para que obtenga un modal de descarga en lugar del csv representado en la ventana actual.
O bien, puede hacer el fputcsv () dentro de un bucle de asociación de búsqueda estándar y dejarlo caer directamente de los resultados devueltos.
DampeS8N
10
@ DampeS8N, +1 por el uso de "dejarlo caer" en una oración.
AnchovyLegend
esto se copia sin atribución del manual de PHP para fputcsv
BenK
14
Solo para que conste, la concatenación es muuuucho más rápida (lo digo en serio) que fputcsvo incluso implode; Y el tamaño del archivo es más pequeño:
// The data from Eternal Oblivion is an object, always
$values =(array) fetchDataFromEternalOblivion($userId, $limit =1000);// ----- fputcsv (slow)// The code of @Alain Tiemblo is the best implementation
ob_start();
$csv = fopen("php://output",'w');
fputcsv($csv, array_keys(reset($values)));foreach($values as $row){
fputcsv($csv, $row);}
fclose($csv);return ob_get_clean();// ----- implode (slow, but file size is smaller)
$csv = implode(",", array_keys(reset($values))). PHP_EOL;foreach($values as $row){
$csv .='"'. implode('","', $row).'"'. PHP_EOL;}return $csv;// ----- concatenation (fast, file size is smaller)// We can use one implode for the headers =D
$csv = implode(",", array_keys(reset($values))). PHP_EOL;
$i =1;// This is less flexible, but we have more control over the formattingforeach($values as $row){
$csv .='"'. $row['id'].'",';
$csv .='"'. $row['name'].'",';
$csv .='"'. date('d-m-Y', strtotime($row['date'])).'",';
$csv .='"'.($row['pet_name']?:'-').'",';
$csv .= PHP_EOL;}return $csv;
Esta es la conclusión de la optimización de varios informes, de diez a miles de filas. Los tres ejemplos funcionaron bien en 1000 filas, pero falla cuando los datos eran más grandes.
Respuestas:
Personalmente uso esta función para crear contenido CSV desde cualquier matriz.
Luego puede hacer que su usuario descargue ese archivo usando algo como:
Ejemplo de uso:
fuente
die();
llamada justo despuésecho array2csv();
, editará mi respuesta. Asegúrese de generar su csv antes de mostrar algo en su página.Puede exportar la fecha con este comando.
Primero debe cargar los datos del servidor mysql en una matriz
fuente
Solo para que conste, la concatenación es muuuucho más rápida (lo digo en serio) que
fputcsv
o inclusoimplode
; Y el tamaño del archivo es más pequeño:Esta es la conclusión de la optimización de varios informes, de diez a miles de filas. Los tres ejemplos funcionaron bien en 1000 filas, pero falla cuando los datos eran más grandes.
fuente
Recomiendo parsecsv-for-php para solucionar un número de problemas con líneas nuevas y comillas anidadas.
fuente
Funciona con más de 100 líneas, si especifica el tamaño del archivo en los encabezados, simplemente llame al método get () en su propia clase
fuente
código prefabricado adjunto aquí. puede usarlo simplemente copiando y pegando su código:
https://gist.github.com/umairidrees/8952054#file-php-save-db-table-as-csv
fuente
Al igual que @ Dampes8N dijo:
Espero que esto ayude.
fuente