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.

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.

Pubblicitร 
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...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

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...
Pubblicitร