HOME - ERRIKO.IT

Erriko dot IT

Esportare una tabella da un database MySql in CSV utilizzando PHP

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 :-P
Alla prossima!

Se ti è piaciuto questo post

Mostra il tuo apprezzamento, condividi!

Rimani sempre aggiornato:

Aggiungi un commento!

Commenti (23)

  1. Tobia 25 gennaio 2010 Rispondi

    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
     

  2. Enrico Deleo
    Erriko 25 gennaio 2010 Rispondi

    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…

  3. Ricky 3 febbraio 2010 Rispondi

    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

  4. abomba 22 marzo 2010 Rispondi

    Finalmente un pezzo di codice che funziona al primo colpo.
    Grandi!!!
    A bomba!!!

  5. Enrico Deleo
    Erriko 22 marzo 2010 Rispondi

    @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 :)

  6. Marco 15 ottobre 2010 Rispondi

    Grazie mille!! Mi è stato molto utile!

    • Enrico Deleo
      Erriko 16 ottobre 2010 Rispondi

      Sono contento tu lo abbia apprezzato ;)

  7. didachos 11 marzo 2011 Rispondi

    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!

  8. ales 21 aprile 2011 Rispondi

    Ho lo stesso identico errore.

  9. roberto 19 dicembre 2011 Rispondi

    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

    • Enrico Deleo
      Enrico Deleo 19 dicembre 2011 Rispondi

      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.

  10. roberto 19 dicembre 2011 Rispondi

    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.

  11. Mattia 25 gennaio 2012 Rispondi

    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?

    • Enrico Deleo
      Enrico Deleo 25 gennaio 2012 Rispondi

      specifica la codifica utf-8 ;)

      • Mattia 25 gennaio 2012 Rispondi

        Si ma dove lo devo specificare?

        • Enrico Deleo
          Enrico Deleo 26 gennaio 2012

          Sopra il resto del codice. Online ci sono molte risorse a riguardo.

  12. unders 16 febbraio 2012 Rispondi

    salve, volevo chiedere ma dove viene salvato il file csv?

    Grazie

    • Enrico Deleo
      Enrico Deleo 16 febbraio 2012 Rispondi

      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.

      • unders 20 febbraio 2012 Rispondi

        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.

        • Enrico Deleo
          Enrico Deleo 21 febbraio 2012

          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ì…

  13. unders 21 febbraio 2012 Rispondi

    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?

Commenta