Corsi on-line

Eseguire le istruzioni contenute in un file SQL con PHP

Come sappiamo PHP dispone della funzione mysql_query() per eseguire delle istruzioni SQL all’interno del DBMS. Purtroppo questa funzione non può eseguire più di un’istruzione alla volta e, pertanto, non gli possono essere passati dei listati di SQL contenenti diverse query da eseguire.

Questa limitazione, purtroppo, può risultare davvero scomoda in talune circostanze: si pensi, ad esempio, alla necessità di dover eseguire una serie di istruzioni presenti all’interno di un file .sql come questo:

CREATE TABLE clienti (
  id int(20) NOT NULL auto_increment,
  nome varchar(50) NOT NULL,
  cognome varchar(50) NOT NULL,
  email varchar(50) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

CREATE TABLE ordini (
  id int(20) NOT NULL auto_increment,
  id_cliente int(520) NOT NULL,
  prodotto varchar(50) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

...

Fortunatamente con un po’ di fantasia è possibile creare una funzioncina ad hoc per l’esecuzione di istruzioni SQL multiple. Vediamo il codice:

<?php
function importa_file_sql($sqlfile)
{
  // estraggo il contenuto del file
  $queries = file_get_contents($sqlfile);
  // Rimuovo eventuali commenti
  $queries = preg_replace(array('/\/\*.*(\n)*.*(\*\/)?/', '/\s*--.*\n/', '/\s*#.*\n/'), "\n", $queries);
  // recupero le singole istruzioni
  $statements = explode(";\n", $queries);
  $statements = preg_replace("/\s/", ' ', $statements);
  // ciclo le istruzioni
  foreach ($statements as $query) {
   $query = trim($query);
   if ($query) {
      // eseguo la singola istruzione
      $result = mysql_query($query);
      // e stampo eventuali errori
      if (!$result) echo 'Impossibile eseguire la query ' . $query . ': ' . mysql_error();
   }
}
?>

Per utilizzare la funzione sarà sufficiente richiamarla utilizzando, come parametro, il nome del file .sql da eseguire.

<?php importa_file_sql("backup.sql"); ?>

Personalmente vi consiglio di salvare tra i bookmark questa funzione in quanto potrebbe tornarvi utile in più di una circostanza.

Post correlati
  • Kevin

    Ottimo!
    Davvero molto utile!! ^_^

    Grazie.

  • Nella riga 18 del codice sql:

    $query = trim($query)

    manca il punto e virgola ” ; ”

    Ecco la riga:
    $query = trim($query);

    Per il resto OTTIMO!!

  • Massimiliano Bossi

    Grzie per la segnalazione Pedro,
    Ho corretto l’errore…

  • alfonso

    con il preg_replace così impostato mi taglia fuori gli INSERT… perchè?
    comunque ottimo lavoro 😉

I più letti del mese
Tematiche