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!
Se ti è piaciuto questo post
Rimani sempre aggiornato:






Commenti (23)
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
Grazie mille!! Mi è stato molto utile!
Sono contento tu lo abbia apprezzato
Ciao, a me da questi errore:
Warning: Cannot modify header information – headers already sent by (output started at /home/../public_html/mysql_to_csv.php:31) in /home/../public_html/mysql_to_csv.php on line 63
Warning: Cannot modify header information – headers already sent by (output started at /home/../public_html/mysql_to_csv.php:31) in /home/../public_html/mysql_to_csv.php on line 64
Warning: Cannot modify header information – headers already sent by (output started at /home/../public_html/mysql_to_csv.php:31) in /home/../public_html/mysql_to_csv.php on line 65
Mi sai dire dov’è il problema?
Grazie in anticipo, molto utile questo script!
Ho lo stesso identico errore.
Il codice funziona benissimo.Hai per caso caricato anche il codice riguardante il modo per importare in un database mysql tramite script php.
Per esempio lo stesso file che ora si crea esportato,vorrei modificarlo e caricarlo nel database.
grazie
Grazie
Si è quello che ho scritto e che uso personalmente per questo tipo di operazione.
Non ho fatto lo script per l’operazione opposta, ma ora che mi ci fai pensare lo pubblicherò a breve.
Molto bene..bravissimo..aspetto allora..
più che altro volevo farti notare come sia difficile reperire in web uno script per importare da un file da caricare in real time.
E’ per questo che questo sito è più bello degli altri
Ciao scusa,
funziona tutto perfettamente ma ho un problema io con gli accenti.
Per caricare i dati su db ho usato htmlenties() per cui sul server me li ritrovo messi in codice html.
Per leggere i file, su un’altra pagina, ho usato il decode e funziona perfetto, ma se provo ad usarlo qui le parole accentate le inventa.
Come posso risolvere?
specifica la codifica utf-8
Si ma dove lo devo specificare?
Sopra il resto del codice. Online ci sono molte risorse a riguardo.
salve, volevo chiedere ma dove viene salvato il file csv?
Grazie
sul pc, in alternativa si può modificare lo script usando la funzione fwrite e indirizzare l’output all’interno di un file residente sul server remoto.
grazie per la risposta! Sto utilizzando questa soluzione, però avrei anche la necessità di salvare il file direttamente sul pc locale, siccome esporto giornalmente i dati dal db mysql per passarli ad un software che gira sulla macchina locale. Andare via ftp ogni volta è un pò macchinoso. C’è modo di salvare automaticamente il file sul pc locale che esegue lo script? Grazie.
Di nulla.
Per quanto riguarda la tua richiesta, beh, dovresti avere sul pc una cartella aperta alla scrittura dall’esterno. Potresti installare filezilla server sul tuo pc e creare una cartella ftp pubblica sul tuo pc, in modo da poterti collegare in ftp via php e salvare il file creato lì…
quindi salverei prima il file in remoto e poi con la funzione php lo scarico in locale? Oppure posso salvarlo direttamente nella cartella pubblica (locale) con fwrite?
non puoi devi stabilire una connessione ftp (http://www.php.net/manual/en/ftp.examples-basic.php) con php ed esportare il file lì (sul server ftp sul tuo pc).