2013-05-06 23 views
6

Ho mysqq db con tabelle diverse. I dati tra le tabelle sono collegati e li recupero e li visualizzo usando l'id utente. Ho utilizzato il riferimento da PHP MYSQLi Displaying all tables in a databaseInterrogare mysql ed esportare i dati come CSV in PHP

Ma come esportare queste informazioni come file csv? Ho provato invece di echo cambiato in una stringa e stampare la stringa in un file CSV ma non funziona.

Ho provato anche l'esempio da: http://sudobash.net/php-export-mysql-query-to-csv-file/

ma posso vedere i dati, ma in cima c'è anche spazzatura (come "<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>"
ecc) all'interno del file CSV.

C'è un altro modo per farlo?

risposta

12

Se si vuole scrivere ogni riga di MySQL in un file CSV, è possibile utilizzare il costruito in funzione di PHP5 fputcsv

$result = mysqli_query($con, 'SELECT * FROM table'); 
$row = mysqli_fetch_array($result, MYSQLI_ASSOC); 

$fp = fopen('file.csv', 'w'); 

foreach ($row as $val) { 
    fputcsv($fp, $val); 
} 

fclose($fp); 

che dovrebbe restituire una stringa separato da virgole per ogni riga scritta file.csv:

row1 val1, row1 val2 
row2 val1, row2 val2 
etc.. 

Assicurarsi inoltre di controllare le autorizzazioni per la directory in cui si sta scrivendo.

+0

@ dcd08 Grazie Io in realtà ho provato questo ma il problema è in fondo al file csv ci sono anche junk stampati come "

" ecc. Qualche idea di cosa lo sta causando? – aandroidtest

+0

Ok fatto, devo mettere ob_start() in alto e questo è risolto. – aandroidtest

+0

Qualcuno può pubblicare un esempio/collegamento su come gestire la query della casella di ricerca insieme all'esportazione csv/xls? Vorrei utilizzare la casella di ricerca come variabile e variabile $ _GET ["ricerca"], quindi recuperare i dati da mysql, visualizzarli nella tabella e quindi esportarli in xls/csv. Per quanto ne so, dovrebbe esserci un input per la casella di ricerca e due pulsanti di invio ... –

4

Si può provare a utilizzare MySql INTO OUTFILE clausola:

SELECT * 
    INTO OUTFILE '/tmp/tablename.csv' 
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
     LINES TERMINATED BY '\n' 
    FROM tablename 
    WHERE userid = 1 
+0

È davvero fantastico! Grazie mille! – nrubin29

9

Si tratta di una soluzione che incorpora le intestazioni o nomi di campo utilizzando MySQLi'sfetch_fields funzione -

$query = "SELECT * FROM table"; 
$result = $db->query($query); 
if (!$result) die('Couldn\'t fetch records'); 
$headers = $result->fetch_fields(); 
foreach($headers as $header) { 
    $head[] = $header->name; 
} 
$fp = fopen('php://output', 'w'); 

if ($fp && $result) { 
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="export.csv"'); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    fputcsv($fp, array_values($head)); 
    while ($row = $result->fetch_array(MYSQLI_NUM)) { 
     fputcsv($fp, array_values($row)); 
    } 
    die; 
} 

Questa è anche una variante of a different answer dove è stata suggerita una soluzione simile ma la parte delle intestazioni non ha funzionato per me, quindi ho cambiato il metodo di recuperarle. Il credito è dovuto a @Jrgns

+0

Ha funzionato bene per me ... grazie! – user2662680

1

per la creazione e il download di un file csv da una query mysqli (utilizzando object oriented) Penso che questo sarebbe di aiuto.

Questa è una classe che si collega al database e le funzioni faranno quello che vuoi usando mysqli e PHP. In questo caso, chiamando questa classe (require o include), usa semplicemente la funzione "downloadCsv()".

A titolo di esempio, questo sarebbe il file "class.php":

<?php 
class DB{ 

private $con; 

//this constructor connects with the database 
public function __construct(){ 
$this->con = new mysqli("Your_Host","Your_User","Your_Pass","Your_DatabaseName"); 

if($this->con->connect_errno > 0){ 
    die('There was a problem [' . $con->connect_error . ']'); 
    } 
} 

//create the function that will download a csv file from a mysqli query 

public function downloadCsv(){ 

$count = 0; 
$header = ""; 
$data = ""; 
//query 
$result = $this->con->query("SELECT * FROM Your_TableName"); 
//count fields 
$count = $result->field_count; 
//columns names 
$names = $result->fetch_fields(); 
//put column names into header 
foreach($names as $value) { 
    $header .= $value->name.";"; 
    } 
} 
//put rows from your query 
while($row = $result->fetch_row()) { 
    $line = ''; 
    foreach($row as $value)  { 
     if(!isset($value) || $value == "") { 
      $value = ";"; //in this case, ";" separates columns 
    } else { 
      $value = str_replace('"', '""', $value); 
      $value = '"' . $value . '"' . ";"; //if you change the separator before, change this ";" too 
     } 
     $line .= $value; 
    } //end foreach 
    $data .= trim($line)."\n"; 
} //end while 
//avoiding problems with data that includes "\r" 
$data = str_replace("\r", "", $data); 
//if empty query 
if ($data == "") { 
    $data = "\nno matching records found\n"; 
} 
$count = $result->field_count; 

//Download csv file 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=FILENAME.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
echo $header."\n".$data."\n"; 

} 
?> 

Dopo aver creato il file "class.php", in questo esempio, utilizzare tale funzione file "download.php" :

<?php 
//call the "class.php" file 
require_once 'class.php'; 
//instantiate DB class 
$export = new DB(); 
//call function 
$export->downloadCsv(); 
?> 

Dopo il download, aprire il file con MS Excel.

Spero che questo ti aiuti, penso di averlo scritto bene, non mi sentivo a mio agio con il testo e il campo del codice.

1

Prova questo.

function addRowToCsv(& $csvString, $cols) { 
    $csvString .= implode(',', $cols) . PHP_EOL; //Edits must be 6 characters - all I added was a "." before the =. :-) 
} 

$csvString = ''; 
$first = true; 

while ($row = mysqli_fetch_assoc($query)) { 
    if ($first === true) { 
     $first = false; 
     addRowToCsv($csvString, array_keys($row)); 
    } 
    addRowToCsv($csvString, $row); 
} 

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

echo $csvString; 

Si noti che il primo argomento di addRowToCsv è passato per riferimento. Questo non è richiesto e potresti facilmente utilizzare un valore di ritorno, ma questo è esattamente come lo farei.

Se si desidera salvare l'output in un file piuttosto che servire come download quindi utilizzare il precedente, ma sostituire

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

echo $csvString; 

Con ..

file_put_contents('MyCsvFile.csv', $csvString); 
Problemi correlati