back to top

Una calendario/agenda con PHP e MySQL

In questa serie di articoli analizzeremo la procedura necessaria per creare un caledario perpetuo che permetta anche la gestione degli appuntamenti, in pratica lโ€™obiettivo del nostro lavoro sarร  creare unโ€™agenda con PHP e MySQL.

In pratica avremo un calendario virtuale che potrร  essere consultato avanti ed indietro nel tempo (di mese in mese) e un admin per la gestione degli appuntamenti. Quando inseriremo uno o piรน appuntamenti in corrispondenza di una determinata data, questa diventerร  cliccabile e ci permetterร  di consultarli, modificarli o eventualmente di cancellarli.

Pubblicitร 

La nostra applicazione si appoggerร  ad un database, "agenda", in cui sarร  sufficiente inserire una sola tabella, "appuntamenti". Allโ€™interno della tabella avremo 4 campi: un id autoincrementale univoco per ogni appuntamento, un campo per il titolo dellโ€™appuntamento (VARCHAR 255), un campo per il testo che lo descrive (TEXT) e un ultimo campo, di tipo numerico, chiamato str_data destinato ad ospitare la data dellโ€™appuntamento convertita tramite la funzione strtotime() in formato Unix timestamp.

Per maggiore comoditร  da parte del lettore, presentiamo di seguito lโ€™SQL relativo alla nostra tabella:

CREATE TABLE appuntamenti (
  id int(11) NOT NULL auto_increment,
  titolo varchar(255) NOT NULL default '',
  testo text NOT NULL,
  str_data int(10) NOT NULL default '0',
  PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Lo script per il funzionamento del nostro calendario/agenda sarร  costituito da 6 file:

  1. config.php: dati di connessione al DBMS e selezione del database.
  2. index.php: calendario perpetuo con link agli appuntamenti.
  3. appuntamenti.php: elenco degli appuntamenti per una determinata data selezionata sul calendario.
  4. form.php: modulo per lโ€™inserimento degli appuntamenti.
  5. cancella.php: cancellazione degli appuntamenti previsti per una data.
  6. modifica.php: modifica degli appuntamenti e spostamento a date diverse da quella stabilita.

Il primo file di cui mostreremo il codice sarร  quello di configurazione, esso รจ particolarmente importante in quanto verrร  incluso in tutti i restanti file dello script:

<?php
$host = 'localhost';
$user = 'user';
$pass = 'password';
$db = 'agenda';
$con = @mysql_connect($host,$user,$pass) or die (mysql_error());
$sel = @mysql_select_db($db) or die (mysql_error());
?>

Il nostro prossimo passaggio sarร  relativo alla creazione del calendario.

Il calendario

Presentiamo di seguito il codice necessario alla scrittura di un calendario perpetuo, lโ€™applicazione non รจ particolarmente complessa, ma il codice รจ abbastanza lungo:

<?php
function ShowCalendar($m,$y)
{
  if ((!isset($_GET['d']))||($_GET['d'] == ""))
  {
    $m = date('n');
    $y = date('Y');
  }else{
    $m = (int)strftime( "%m" ,(int)$_GET['d']);
    $y = (int)strftime( "%Y" ,(int)$_GET['d']);
    $m = $m;
    $y = $y;
  }
  $precedente = mktime(0, 0, 0, $m -1, 1, $y);
  $successivo = mktime(0, 0, 0, $m +1, 1, $y);
  $nomi_mesi = array(
    "Gen",
    "Feb",
    "Mar",
    "Apr",
    "Mag",
    "Giu", 
    "Lug",
    "Ago",
    "Set",
    "Ott",
    "Nov",
    "Dic"
  );
  $nomi_giorni = array(
    "Lun",
    "Mar",
    "Mer",
    "Gio",
    "Ven",
    "Sab",
    "Dom"
  );
  $cols = 7;
  $days = date("t",mktime(0, 0, 0, $m, 1, $y)); 
  $lunedi= date("w",mktime(0, 0, 0, $m, 1, $y));
  if($lunedi==0) $lunedi = 7;
  echo "<table>\n"; 
  echo "<tr>\n
  <td colspan=\"".$cols."\">
  <a href=\"?d=" . $precedente . "\"><<</a>
  " . $nomi_mesi[$m-1] . " " . $y . " 
  <a href=\"?d=" . $successivo . "\">>></a></td></tr>";
  foreach($nomi_giorni as $v)
  {
    echo "<td><b>".$v."</b></td>\n";
  }
  echo "</tr>";
  for($j = 1; $j<$days+$lunedi; $j++)
  {
    if($j%$cols+1==0)
    {
      echo "<tr>\n";
    }
    if($j<$lunedi)
    {
      echo "<td> </td>\n";
    }else{
      $day= $j-($lunedi-1);
      $data = strtotime(date($y."-".$m."-".$day));
      $oggi = strtotime(date("Y-m-d"));
      include 'config.php';
      $sql = "SELECT str_data FROM appuntamenti";
      $result = mysql_query($sql) or die (mysql_error());
      if(mysql_num_rows($result) > 0)
      {
        while($fetch = mysql_fetch_array($result))
        {
          $str_data = $fetch['str_data'];
          if ($str_data == $data)
          {
            $day = "<a href=\"appuntamenti.php?day=$str_data\">$day</a>";
          }
        }
      }
      if($data != $oggi)
      {
        echo "<td>".$day."</td>";
      }else{
        echo "<td><b>".$day."</b></td>";
      }
    }
    if($j%$cols==0)
    {
      echo "</tr>";
    }
  }
  echo "<tr></tr>";
  echo "</table>";
}
ShowCalendar(date("m"),date("Y")); 
?>

Dato che per utenti italiani sarebbe abbastanza scomodo gestire un calendario con coni nomi di mesi e giorni in Inglese, questi sono stati tradotti nella nostra lingua e abbreviati; inoltre, si รจ fatto in modo che la settimana cominciasse da lunedรฌ e non da domenica come prevede il calendario anglosassone.

Una volta mostrati i diversi giorni del mese allโ€™interno di una tabella disposta su 7 colonne (una per ogni giorno della settimana) per facilitarne la lettura, si procede ad una serie di controlli: viene calcolata la data odierna in modo da sottolinearla in grassetto, inoltre vengono controllate le corrispondenze tra il contenuto del database e i giorni elencati: quando la data di un appuntamento e un giorno del calendario coincidono, questโ€™ultimo diventa un collegamento cliccabile verso la pagina per la lettura.

Il form per gli appuntamenti

La fase relativa alla creazione del calendario รจ sicuramente la piรน impegnativa in tutta la procedura di creazione dello script, i passaggi successivi saranno molto piรน semplici.

Il nostro prossimo compito sarร  quello di scrivere il codice necessario per mettere a disposizione dellโ€™utilizzatore un form attraverso il quale inserire il titolo, il testo e la data dei suoi appuntamenti.

Titolo e testo verranno inseriti nei relativi campi di destinazione cosรฌ come saranno digitati dallโ€™utente, mentre la data (da scrivere in formato non anglossasone "gg-mm-aaaa") subirร  una conversione grazie allโ€™utilizzo della funzione strtotime().

La conversione nel formato Unix Timestamp ci consentirร  di operare piรน facilmente i confronti trร  giorni del calendario e scadenze degli appuntamenti; la stringa cosรฌ ottenuta potrร  poi essere comodamente riconvertita tramite la funzione date(), per questo non abbiamo avuto la necessitร  di inserire in tabella un campo che contenesse la data nel comune formato "gg-mm-aaaa".

Ecco il codice del nostro modulo:

<?php
if (isset($_POST['submit']) && $_POST['submit']=="invia")
{
  $titolo = addslashes($_POST['titolo']);
  $testo = addslashes($_POST['testo']);
  $str_data = strtotime($_POST['data']);
  include 'config.php';
  $sql = "INSERT INTO appuntamenti (titolo,testo,str_data ) VALUES ('$titolo', '$testo', '$str_data')";
  if($result = mysql_query($sql) or die (mysql_error()))
  {
    echo "Inserimento avvenuto con successo.<br>
    Vai al <a href=\"index.php\">Calendario</a>";
  }
}else{
  ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Titolo:<br>
<input name="titolo" type="text"><br>
Testo:<br>
<textarea name="testo" cols="30" rows="8"></textarea><br>
Data:<br>
<input name="data" type="text" value="gg-mm-aaaa"><br>
<input name="submit" type="submit" value="invia">
</form>
  <?php
}
?>

Naturalmente esitono altri modi piรน comodi per inserire una data in un campo-form, il piรน avanzato รจ sicuramente quello di utilizzare un caledario concepito in Javascript da cui selezionare il giorno desiderato; per la creazione del Javascript sarebbe stata perรฒ necessaria una trattazione a parte, quindi abbiamo optato per la soluzione piรน veloce, lโ€™inserimento manuale.

La pagina per la lettura degli appuntamenti

Una volta creato il calendario e la pagina per lโ€™inserimento degli appuntamenti, il prossimo passaggio sarร  quello di scrivere il codice necessario allโ€™interfaccia per la lettura della nostra agenda.

Qui il discorso si fร  molto semplice, infatti abbiamo detto in precedenza che la corrispondenza tra la data di un appuntamento e un determinato giorno del calendario permetterร  di contrassegnare questโ€™ultimo con un link.

Il collegamento cosรฌ generato conterrร  in querystring una variabile valorizzata con la data convertita tramite la funzione strtotime() che verrร  utilizzata per i confronti con i dati presenti in tabella. A questo punto, tutti i records corrispondenti a quella determinata data verranno visualizzati tramite un ciclo.

Ecco il codice della nostra pagina per la lettura degli appuntamenti:

<?php
if(isset($_GET['day']) && is_numeric($_GET['day']))
{
  $day = $_GET['day'];
  include 'config.php';
  $sql = "SELECT * FROM appuntamenti WHERE str_data=$day";
  $result = mysql_query($sql) or die (mysql_error());
  if(mysql_num_rows($result) > 0)
  {
    while($fetch = mysql_fetch_array($result))
    {
      $id = stripslashes($fetch['id']);
      $titolo = stripslashes($fetch['titolo']);
      $testo = stripslashes($fetch['testo']);
      $data = date("d-m-Y", $fetch['str_data']); 
      echo "Appuntamenti del <b>$data</b><br>" . $titolo . "<br>" . $testo . "<br>
      <a href=\"cancella.php?id=$id\">Cancella</a> |
      <a href=\"modifica.php?id=$id\">Modifica</a>
      <hr>";
    }
  } 
}
?>

Non cโ€™รจ davvero molto da segnalare riguardo al codice appena proposto; si fร  semplicemente notare al lettore come la stringa Timestamp, contenuta nei records venga facilmente riconvertita in un regolare formato/data grazie allโ€™utilizzo della funzione date(), ad essa viene passato come parametro il formato che si intende visulizzare in output (gg-mm-aaaa).

Cancellazioni e modifiche

Il nostro sistema di gestione degli appuntamenti non sarebbe completo senza dare allโ€™utente la possbilitร  di cancellare dallโ€™agenda le voci non piรน utili e di modificare quelle esistenti.

Di seguito proponiano i codici necessari per la creazione del file per le cancellazioni e di quello per le modifiche. I listati sono molto semplici e non necessitano di particolari commenti.

Codice per il file di cancellazione:

<?php
include 'config.php';
if (isset($_GET['id']) && is_numeric($_GET['id']))
{
  $del_id = $_GET['id'];
  $query = mysql_query("SELECT titolo, str_data FROM appuntamenti WHERE id ='$del_id'");
  $fetch = mysql_fetch_array($query);
  $titolo = $fetch['titolo'];
  $data = date("d-m-Y", $fetch['str_data']); 
  ?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<h1>Attenzione!</h1>
Si sta per eliminare l'appuntamento
<b><?php echo stripslashes($titolo); ?></b> 
del <?php echo stripslashes($data); ?>.<br>
Confermare per eseguire l'operazione.<br>
<br>
<input name="del_id" type="hidden" value="<?php echo $del_id; ?>">
<input name="submit" type="submit" value="Cancella">
</form>
  <?php
}
elseif(isset($_POST['del_id']) && is_numeric($_POST['del_id']))
{
  $del_id2 = $_POST['del_id'];
  if (mysql_query("DELETE FROM appuntamenti WHERE id = '$del_id2'")or die(mysql_error()))
  {
    echo "Cancellazione del servizio avvenuta con successo<br>
    <a href=\"index.php\">Torna al calendario</a>";
  }
}
?>

Codice per il file di modifica:

<?php
include 'config.php';
if(isset($_POST['mod_id'])&&(is_numeric($_POST['mod_id'])))
{
  $id = $_POST['mod_id'];
  $titolo = addslashes($_POST['titolo']);
  $testo = addslashes($_POST['testo']);
  $str_data = strtotime($_POST['data']);
  $sql = "UPDATE appuntamenti SET titolo='$titolo', testo='$testo', str_data='$str_data' WHERE id = $id";
  if(mysql_query($sql) or die (mysql_error()))
  {
    echo "Modifica effettuata con successo.<br>
    Vai al <a href=\"index.php\">Calendario</a>";
  }
}
elseif (isset($_GET['id']) && is_numeric($_GET['id']))
{
  $id = $_GET['id'];
  $query = mysql_query("SELECT titolo,testo,str_data FROM appuntamenti WHERE id = $id") or die (mysql_error());
  $fetch = mysql_fetch_array($query)or die (mysql_error());
  $titolo = stripslashes($fetch['titolo']);
  $testo = stripslashes($fetch['testo']);
  $data = date("d-m-Y", $fetch['str_data']); 
  ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">Titolo:<br>
<input name="titolo" type="text" value="<?php echo $titolo; ?>">
<br>Testo:<br>
<textarea name="testo" cols="30" rows="8">
<?php echo $testo; ?>
</textarea>
<br>Data:<br>
<input name="data" type="text" value="<?php echo $data; ?>">
<br><input name="mod_id" type="hidden" value="<?php echo $id; ?>">
<input name="submit" type="submit" value="modifica">
</form>
  <?php
}
?>

Lโ€™unica nota riguarda il file per le cancellazioni: dato che una volta rimosso un record questo non potrร  piรน essere recuperato, lโ€™applicazione chiede allโ€™utente una conferma dellโ€™operazione prima di procedere con lโ€™eliminazione.

Scarica lo script completo

Se volete potete scaricare lo ZIP contenente tutti i i file del nostro script pronti allโ€™uso cliccando a questa pagina.

Altri contenuti interessanti

Pubblicitร 

Potrebbero interessarti queste guide

Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.

Leggi anche...

Cannot modify header information โ€“ headers already sent: come risolvere lโ€™errore PHP

L'errore di PHP cannot modify header information - headers...

Ricavare lโ€™estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano lโ€™orario corretto? Probabilmente...

PHP BBCode: script pronti allโ€™uso

A volte puรฒ aversi l'esigenza di dover offrire agli...
Pubblicitร