logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

Lezioni di PHP - Lezione 3.5 - Lavorare con il database MySQL. L’operatore JOIN. Caricamento di file sul server.

09/10/2025, by Ivan

Prima di iniziare a scrivere questa lezione, ho pensato a lungo su come spiegare al meglio le query con gli operatori JOIN. Il fatto è che l’operatore JOIN serve per selezionare dati da più tabelle contemporaneamente. E poiché ci serve un’altra tabella, la creeremo. Ti propongo di creare una tabella per i file che caricheremo tramite un modulo in questa lezione. In questo modo la lezione coprirà due argomenti diversi: lavoro con il database e lavoro con i moduli.

Cominciamo con l’aggiunta di un campo per il caricamento del file. Affinché il modulo possa caricare file, dobbiamo aggiungere un tipo di form ai suoi parametri:

$content .=	'<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">'; 

In questo modo, tramite il parametro enctype, indichiamo al browser che attraverso questo modulo caricheremo file. Ora che il modulo è pronto, aggiungiamo il campo per il caricamento del file:

  public function display_admin() { // metodo di inserimento del messaggio
	$content = '';
	
	$content .=	'<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">'; 
	$content .=	  '<label for="title">Nome:</label><br />';
	$content .=	  '<input name="title" id="title" type="text" maxlength="150" />';
	$content .=	  '<div class="clear"></div>';
	$content .=	  '<label for="bodytext">Messaggio:</label><br />';
	$content .=	  '<textarea name="bodytext" id="bodytext"></textarea>';
	$content .=        '<input type="file" name="filename">'; // campo di caricamento del file
	$content .=	  '<div class="clear"></div>';
	$content .=	  '<input type="submit" value="Aggiungi messaggio" />';
	$content .=	'</form>';	
	$content .=	'<p><a href="/index.php">Torna alla home</a></p>';

    return $content;
  }

Attraverso l’input di tipo file caricheremo il nostro file. Se salvi i file e aggiorni la pagina di aggiunta del messaggio, dovresti vedere il campo per il caricamento del file.

Ora vediamo in che modo il file viene trasmesso nella richiesta POST.

  public function write($p) { 
	print_r($p); // stampa l’array del modulo
	print_r($_FILES); // stampa l’array dei file
    $sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')';
    return mysql_query($sql);
  } 

Ora carichiamo un file qualsiasi e salviamo il messaggio. Tutti i file caricati tramite il modulo saranno disponibili nella variabile superglobale $_FILES. Ho caricato un file e ottenuto i seguenti array:

Array ( 
  [title] => asfasdf 
  [bodytext] => asfasdf 
) 
Array ( 
  [filename] => Array ( 
    [name] => ip.txt 
    [type] => text/plain 
    [tmp_name] => Y:\tmp\phpAA.tmp 
    [error] => 0 
    [size] => 13 
   ) 
) 

Ora che abbiamo un array con i dati e il file, creiamo una tabella dei file per salvare quelli caricati. Iniziamo creando una cartella files nella root del nostro sito; se utilizzi un sistema operativo Linux o lavori su un hosting, assegna i permessi 777 alla cartella in modo che lo script possa salvare i file al suo interno.

Modifichiamo la query di creazione delle tabelle nel metodo buildDB():

$sql = "CREATE TABLE Messages
(
mid int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(mid),
title varchar(15),
bodytext text,
created  int(11),
file int(11),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE Files
(
fid int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(fid),
filename varchar(255),
filepath varchar(255),
filemime varchar(255),
filesize int(10),
timestamp int(10),
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";

Oltre ad aggiungere una nuova tabella, aggiungeremo anche il campo fid, che sarà una chiave esterna per la tabella dei file. La nuova tabella Files avrà i seguenti campi:

fid – chiave primaria della tabella, identificatore del file.

filename – nome del file.

filepath – percorso del file dalla root del sito.

filemime – tipo MIME del file, utile per identificare l’estensione e il suo utilizzo (ad esempio per i file di testo è text/plain, per le immagini può essere image/jpg o image/png).

filesize – dimensione del file in byte.

timestamp – data e ora di caricamento del file.

Ora salviamo il file e scriviamo una query per inserirlo nel database. Puoi creare i campi necessari tramite phpMyAdmin.

 if($_FILES["filename"]["size"] > 1024*3*1024)
   {
     echo ("La dimensione del file supera i tre megabyte");
     exit;
   }
   // Controlliamo se il file è stato caricato
   if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
   {
     // Se il file è stato caricato con successo, lo spostiamo
     // dalla directory temporanea a quella finale
     move_uploaded_file($_FILES["filename"]["tmp_name"], "/files/".$_FILES["filename"]["name"]);
   } else {
      echo("Errore nel caricamento del file");
   }

In questo modo salviamo il file nella cartella files. Ora, dopo un caricamento riuscito, inseriamo il record nel database nella tabella Files:

$sql = 'INSERT INTO Files (filename, filepath, filemime, filesize, timestamp) 
VALUES ("'. $_FILES['filename']['name'] . '",
"files/' . $_FILES['filename']['name'] . '",
"'. $_FILES['filename']['type'] .'",
'. $_FILES['filename']['size'] .',
'. time() . ')';  

mysql_query($sql);   

Ora che abbiamo inserito il record del file nel database, dobbiamo inserire anche il messaggio. Modifichiamo leggermente anche la query di inserimento del messaggio per aggiungere il campo fid:

   $sql = 'INSERT INTO Messages (title, bodytext, created, fid) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ',LAST_INSERT_ID())';

Nota la funzione last_insert_id(): è una funzione MySQL che restituisce l’ultimo ID inserito in una qualsiasi tabella del database. Nel nostro caso, l’ultimo record è stato inserito nella tabella dei file, quindi l’ID restituito proviene da quella tabella.

Ora i record vengono inseriti nelle tabelle, ci resta solo visualizzarli utilizzando l’operatore JOIN. Modifichiamo la query per visualizzare i messaggi in modo da mostrare anche il nome del file:

  public function display_public() { // metodo per visualizzare i messaggi
    $content = '';
	$sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC';
	$result = mysql_query($sql) or die(mysql_error());  
...

L’operatore JOIN in questo caso è stato usato con LEFT. L’unione delle tabelle per la selezione può essere eseguita in diversi modi; in una delle prossime lezioni vedremo più in dettaglio l’uso di JOIN. Per ora, ricordiamo che LEFT JOIN mostra tutti i record, inclusi quelli in cui il campo fid non è presente.

Ora, se stampiamo l’array della query:

  public function display_public() { // metodo per visualizzare i messaggi
    $content = '';
	$sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC';
	$result = mysql_query($sql) or die(mysql_error());  
	while($row = mysql_fetch_array($result)){ // l’array dei risultati deve essere elaborato con mysql_fetch_array()
	  print_r($row);

Vedremo che vengono mostrati dati sia dalla tabella dei messaggi sia da quella dei file. Se il file corrispondente non esiste, i campi saranno vuoti. Pertanto, è necessario verificare il contenuto di questi campi.

	  if(!empty($row['filename'])){
	    $content .= '<p>Allegato: <a target="_blank" href="/'. $row['filepath'] .'">'. $row['filename'] .'</a></p>';
	  }

Ora, insieme al messaggio, verrà mostrato anche l’allegato come link al file caricato. Nella prossima lezione analizzeremo più dettagliatamente il potente operatore JOIN, che consente di visualizzare dati da più tabelle contemporaneamente. Nell’appendice aggiungerò il dump aggiornato del database creato tramite phpMyAdmin.