Scambio di informazioni con il server


Il contatore creato negli esempi precedenti, una volta avviato, non smette di crescere. Si supponga ora che l'autore della pagina alla fine di ogni mese, dopo aver preso nota del numero di accessi, voglia azzerare il contatore per iniziare un nuovo conteggio per il mese successivo. Perché questo succeda deve azzerare il file "file_conta.txt".

Ma non si può permettere a chiunque di modificare un file sul server e quindi bisogna ricorrere a qualche sistema di selezione degli utenti autorizzati ad effettuare questa operazione. Il sistema usuale è quello di chiedere una password da inviare al server nel quale opportune istruzioni controlleranno la password e, solo se questa è corretta, provvederanno alla distruzione del file.

Esempio 3

Con il seguente esempio si propone un modo un po' rudimentale e facilmente aggirabile, ma che si spera istruttivo, per realizzare questo progetto. L'esempio 3 è una pagina HTML di cui si riporta la sezione body

<body style="background-color:azure">
<h1 style="color:red; text-align:center">Azzeramento del contatore
<form id="frm" name="frm" action="azzeraV.php" method="get" 
  style="position:relative; left:30%; width:40%; text-align:center; border-style:solid; background-color:cyan" >
<p>
<label for="c_pw">password? </label>
<input type="text" id="c_pw" name="c_pw" size="30" value="" > 
</p>
<p>
<button type="reset"> reset </button>
<button type="submit"> azzeramento 
</p>
</form>
</body>

Salvare la pagina in contavisite degli esempi precedenti con nome azzeraV.html.

La pagina contiene una form nella quale sono importanti i valori dei due parametri action e method.

Quando viene premuto il bottone submit, il controllo passa dalla pagina azzeraV.html alla pagina azzeraV.php che contiene solo istruzioni per il server. Il suo contenuto è il seguente.

<?php
  function azzeraContatore()
    {
      $pw_letta = $_GET["c_pw"];
      $file = fopen("pw_conta.txt","r");
      $pw_giusta = fgets($file);
      fclose($file);
      $pw_giusta = trim($pw_giusta);

      if (strcmp($pw_letta,$pw_giusta) != 0)
        return "Password sbagliata.";
      else
        {
          $nf = "file_conta.txt";
          if (file_exists($nf))
            {
              if (!unlink($nf))
                return "Errore nell'azzeramento del contatore.";
              else
                return "Il contatore è stato azzerato";
            }
          else
            return "La pagina non è mai stata vista.";
        }
    }

  echo "<!DOCTYPE html>".PHP_EOL;
  echo "<html lang='it'>".PHP_EOL;
  echo "<head>".PHP_EOL;
  echo "<title>Azzeramento del contatore</title>".PHP_EOL;
  echo "<meta charset="utf-8">".PHP_EOL;
  echo "<meta name='viewport' content='width=device-width,minimum-scale=1.0,initial-scale=1.0'>".PHP_EOL;
  echo "</head>".PHP_EOL;
  echo "<body style='background-color:azure; font-size:150%'>".PHP_EOL;
  echo "<p>".azzeraContatore()."

".PHP_EOL; echo "</body>".PHP_EOL."</html>"; ?>

Salvare la pagina in contavisite degli esempi precedenti con nome azzeraV.php.

Questa pagina non viene attivata direttamente dall'utente del browser, ma dal bottone di tipo submit della precedente pagina azzeraV.html.

Quindi, per azzerare il contatore, nel browser va scritto localhost/contavisite/azzeraV.html e, nella pagina visualizzata, va cliccato il bottone azzeramento.

La pagina azzeraV.php genera a sua volta un file HTML in grado di essere decodificato dal browser e che mostra l'esito dell'operazione di azzeramento. L'esito viene prodotto dalla funzione azzeraContatore() e viene inserito nella pagina HTML generata da azzeraV.php.

L'istruzione

  $pw_letta = $_GET["c_pw"];

dice al server di recuperare il valore del campo c_pw della form che ha fatto l'invio, cioè la password scritta dall'utente, e di assegnarlo alla variabile $pw_letta. La variabile di sistema $_GET è un array i cui elementi sono coppie identificatore-valore. Inserendo tra le parentesi quadre l'identificatore si ottiene il valore associato.

Le tre istruzioni

  $file = fopen("pw_conta.txt","r");
  $pw_giusta = fgets($file);
  fclose($file);

vanno a prelevare il contenuto del file di testo pw_conta.txt e lo assegnano alla variabile $pw_giusta. Il programmatore avrà in precedenza preparato il file pw_conta.txt scrivendoci un'unica linea di un'unica parola, cioè la password richiesta che, per non complicare le cose in una esercitazione, può essere semplicemente "password".

L'istruzione

  $pw_giusta = trim($pw_giusta);

usa la funzione predefinita trim(stringa) per ripulire il contenuto della stringa $pw_giusta da eventuali caratteri non pertinenti (blank, line feed, ecc.) presenti all'inizio o alla fine della stringa stessa.

Nell'istruzione successiva

  if (strcmp($pw_letta,$pw_giusta) !=0)

si controlla se la password inserita è uguale a quella registrata nel file pw_conta.txt.
Per controllare se due stringhe sono uguali, si usa la funzione strcmp(stringa1,stringa2).

Questa funzione

Notare che, come in JS, Java e C, l'uguaglianza è denotato da un doppio segno == e la disuguaglianza da != .