Esportare una tabella da un database MySql in CSV utilizzando PHP
Scritto da Erriko in Php il 22 gennaio 2010
Oggi propongo un piccolo spunto veloce per chi lavora con MySql e magari non riesce ad esportare la copia di una tabella da PhpMyAdmin a causa di un timeout di esecuzione.
Bene, mi sono trovato in questa situazione, e proprio quando sembrava che non avrei avuto mai la mia copia csv di una tabella a meno di chiedere di intervenire in locale all’assistenza del server sul quale risiede il database MySql, ecco che ho trovato una soluzione un po’ “rude” ma efficace.
Si tratta di un piccolo script php che si occupa di connettersi al database in questione, selezionare una tabella ed esportarla riga per riga su di un file CSV.
Ovviamente anche in questo caso si può incorrere in timeout errors dovuti al limite di esecuzione di php (che potete aumentare nel caso aveste accesso al file php.ini) oppure in limiti dovuti all’utilizzo di memoria (sempre dichiarati nel file php.ini), ma ho sperimentato personalmente una maggiore velocità di esecuzione rispetto all’esportazione da PhpMyAdmin e, almeno nel mio caso, mi ha evitato qualche rogna di troppo.
Senza ulteriori indugi, dato che i più smaliziati capiranno di che si tratta semplicemente guardando il codice (e visto che i non esperti di php non troveranno difficoltà dovendo modificare soltanto le variabili relative al proprio databse) ecco lo script necessario a svolgere questa operazione:
<?php
$host = '127.0.0.1'; // <-- inserisci qui l'indirizo ip di MySql
$user = 'utente'; // <-- nome utente del database
$pass = 'password'; // <-- password dell'utente
$db = 'nome_db'; // il database desiderato
$table = 'nome_tabella'; // la tabella da esportare in .csv
$file = 'nome_file'; // il nome del file csv da generare
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error()); /* usa i dati forniti per connetterti a MySql, se impossibile interrompi */
mysql_select_db($db) or die("Can not connect."); // seleziona il db desiderato oppure interrompi
$result = mysql_query("SHOW COLUMNS FROM ".$table.""); // query sql per visualizzare la tabella
$i = 0; // settiamo un contatore i e fecciamolo iniziare da zero
if (mysql_num_rows($result) > 0) { // se il numero di righe della tabella e' maggiore di zero
while ($row = mysql_fetch_assoc($result)) { // fin quando
$csv_output .= $row['Field']."; ";
$i++;
}
}
$csv_output .= "\n"; // e vai a capo
$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) { // settiamo un altro indice j e aumentiamolo di 1 alla volta finche' questo e' minore di i
$csv_output .= $rowr[$j]."; "; // scrivi la riga
}
$csv_output .= "\n"; // e vai a capo
}
$filename = $file."_".date("d-m-Y_H-i",time()); // il nome del file sara' composto da quello scelto all'inizio e la data ed ora oggi
/* setta le specifiche del file csv */
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output; // il file e' pronto e puo' essere scaricato
exit;
?>
Ho reso un minimo più “user friendly” questo script creandone una versione che chiede i dati da immettere in un form e che quindi non necessita modifiche al codice, che può essere scaricata cliccando qui. Per eseguire lo script in questo caso basta caricare i due files contenuti nell’archivio appena scaricato sul proprio spazio web via FTP e recandosi all’indirizzo http://tuoindirizzoweb/esportadb.php.
Spero sia utile a qualche altro disperato come me
Alla prossima!




Ciao ho provato a usare lo script su un virtual server ma mi crea un file csv vuoto. Non compaiono errori di nessun tipo.
Idee? grazie
ciao
Hai utilizzato lo script scaricabile da qui: http://www.mediafire.com/file/ymo4nzemnnl/esportadb.zip?
Io l’ho provato su un server dedicato e su uno condiviso prima di proporlo e non ho incontrato problemi…
Si può fare tutto direttamente con una query:
SELECT a,b,a+b INTO OUTFILE ‘/tmp/result.txt’
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘”‘
LINES TERMINATED BY ‘\n’
FROM test_table;
http://dev.mysql.com/doc/refman/5.0/en/select.html
Finalmente un pezzo di codice che funziona al primo colpo.
Grandi!!!
A bomba!!!
@abomba: spero tu ti riferisca ad altri siti. Quello che pubblico io, non per vantarmi, ma funziona sempre. Viene testato e ritestato prima di essere pubblicato e se ci sono condizioni che ne potrebbero inficiare il funzionamento sono specificate.
Comunque sono felice che tu lo abbia trovato utile