4E Sia: Gestione "cittadini" in Php + file di testo -procedura per il progetto "reddito di cittadinanza"

L'esempio presentato riguarda la registrazione di utenti in un file txt (no database).
Si utilizzano solo pagine php. Il modulo form viene gestito all'interno di una pagina php.
Ricordo che le pagine php e i relativi file txt creati devono essere memorizzati all'interno di una cartella dentro un server Web. I file di testo devono avere i permessi di lettura e scrittura. Altrimenti al primo tentativo di accesso al file di testo apparirà a video il messaggio che non si ha il permesso di scrittura.

Procediamo adesso ad analizzare l'intera procedura:
La prima cosa da fare è registrarsi compilando la pagina reg_ute.php.


Questa operazione permette di passare i dati inseriti direttamente nella stessa pagina all'interno delle variabili create appositamente. Queste variabili vengono poi passate alla pagina action.php che registrerà per ogni riga del file di testo l'intero record e tra un campo e l'altro verrà memorizzato un carattere ASCII che servirà a distanziare il contenuto di ogni singolo campo. Alla fine verranno memorizzati due caratteri ASCII che permetteranno al Php di terminare il record e posizionare il puntatore all'inizio della fine riga.

Successivamente si potrà accedere all'area riservata inserendo le credenziali corrette tramite la pagina di login acc_utente.php.
In questa pagina ci sono alcune cose importanti da ricordare:

  • Si verifica se i dati non sono stati inseriti. 
  • Si apre il file in lettura (r). 
  • Si crea l'array dei clienti registrati. 
  • si definisce la variabile con il numero dei clienti registrati (servirà per il ciclo con il num max) 
  • flock($fp,2); è la funzione (LUCCHETTO) che rende sicura la registrazione in maniera che nessuno possa intervenire in quel dato momento. 
  • la variabile $trovato viene azzerata associata con false; //variabile che viene portata a 1 (vero - true) nel caso in cui sia user che password siano corretti e l'utente può accedere all'area riservata. 
  • Si apre il ciclo di lettura per cercare nell'array in memoria i due campi da confrontare con le variabili inserite. 
  • confronto formale tra i dati inseriti dall'utente con quelli memorizzati in fase di registrazione. 
  • $trovato=($check_user && $check_pass) corrisponde a true. 
  • flock($fp,3); ritorna disponibile un'altra registrazione nel file di testo 
  • adesso si può chiudere il file di testo 
  • Si riapre il file di testo (clienti.txt) in lettura. 
  • si associa a $gen (nome del file logico generalità dei clienti al file fisico clienti.txt 
  • $i--; la variabile $i viene decrementata per permettere di prelevare i dati da un altro file di testo senza l'utilizzo di un'altra variabile. 
  • fclose($fp); La funzione explode in PHP ha il compito di suddividere una stringa sulla base di un dato separatore. 
  • Si chiude i file di testo.

    Con la pagina login_effetuato.php si verifica se l'accesso è stato effettuato con successo.
    Con la pagina logout.php si disconnette dalla sessione attiva.


    Ecco in sequenza gli scripts delle pagine 


    ATTENZIONE ALLE ISTRUZIONI e alla loro corretta codifica. (Alcune righe sono parte delle istruzioni delle righe precedenti) 
    Pagina registrazione utenti

    reg_ute.php

    <html>
    <head>
    <title>Registrazione dei clienti</title>
    </head>
    <body>
    <form method="POST" action="reg_ute.php">
    Nome: <input type="text" name="nome">
    <br><br>
    Cognome: <input type="text" name="cognome">
    <br><br>
    Sesso:
    <input type="radio" name="sesso" value="femmina">Femmina
    <input type="radio" name="sesso" value="maschio">Maschio
    <br><br>
    Data di nascità:<input type="date" name="dnascita">
    <br><br>
    Codice Fiscale: <input type="text" name="codfiscale">
    <br><br>
    E-mail: <input type="text" name="email">
    <br><br>
    Indirizzo: <input type="text" name="indirizzo">
    <br><br>
    Paese: <input type="text" name="paese">
    <br><br>
    Cellulare: <input type="text" name="cellulare">
    <br><br>
    Nome utente: <input type="text" name="user">
    <br><br>
    Password: <input type="password" name="pass">
    <br><br>
    Ripeti la Password: <input type="password" name="rip_pass">
    <br><br>
    <input type="submit" name="registrati" value="registrati">

    </form>

    <?php
    if(isset($_POST['registrati'])){
    echo"<br><br><br>";
    $nome=$_POST['nome'];
    $cognome=$_POST['cognome'];
    $sesso=$_POST['sesso'];
    $dnascita=$_POST['dnascita'];
    $codfiscale=$_POST['codfiscale'];
    $email=$_POST['email'];
    $indirizzo=$_POST['indirizzo'];
    $paese=$_POST['paese'];
    $cellulare=$_POST['cellulare'];
    $user=$_POST['user'];
    $pass=$_POST['pass'];
    $rip_pass=$_POST['rip_pass'];
    //riempimento variabili con dati form
    if($nome&&$cognome&&$sesso&&$dnascita&&$codfiscale&&$email&&$indirizzo&&$paese&&$cellulare&&$user&&$pass&&$rip_pass)
    {
    if($pass==$rip_pass) {
    //La funzione strlen restituisce la lunghezza (numero di caratteri) di una stringa.
    if(strlen($pass)<6){
    echo"La password deve contenere almeno 8 caratteri";
    } else{
    //unione delle variabili paese ed indirizzo in un'unica stringa
    //la funzione ucwords restituisce un testo in cui la lettera iniziale di ogni parola è convertita in maiuscolo, se il carattere è alfabetico.
    $indirizzo=ucwords("$paese, $indirizzo");
    //La funzione restituisce la stringa $string con tutti i caratteri alfabetici convertiti in minuscolo.
    $pass=strtolower($pass);
    //la funzione ucwords defiisce "parola": sequenza di caratteri immediatamente seguita da un 

    //carattere di delimitazione (i delimitatori sono: spazio, form-feed, newline, carriage return, tab 
    //orizzontale e tab verticale). concatenazione stringhe
    $nome=ucwords("$nome $cognome");
    //nome del file di testo
    $nomefile="password.txt";
    //apertura file di testo clienti
    $fp=fopen($nomefile,"r");
    $dati=file($nomefile);
    //variabile che indica se un user name è già presente nel nostro archivio
    $trovato=0;
    for($i=0;$i<count($dati) && $trovato==0;$i++){
    $stringa_div=explode("|",$dati[$i]);
    if($stringa_div[0]==$user || $stringa_div[2]==$mail)
    $trovato=1;
    }
    fclose($fp);//chiusura del file di testo
    if($trovato==0){
    $fp=fopen($nomefile,"a");//aperture del file di testo dei dati personali del cliente
    $dati_pers=array($user,$pass,$email,$nome,$indirizzo);//array dei dati personali
    $stringa=implode("|",$dati_pers);/*funzione che ci permette di passare dall'array ad una stringa separando i vari campi con un carattere da noi deciso*/
    flock($fp,2);/*funzione che blocca il file in maniere che si possa scrivere senza accavallare i dati se 2 o più persone stanno usando il programma*/
    $nl=chr(13).chr(10);//manda a capo alla fine della stringa nel file di testo
    fwrite($fp,"$stringa$nl");//scrive nel file di testo
    flock($fp,3);//sblocca permettendo a prossimi dati di essere iscritti nel file di testo
    fclose($fp);//chiusura del file di testo
    echo"I tuoi dati sono stati registrati correttamente! Ora puoi accedere ai nostri servizi tramite user e password cliccanco <a href='/public_html/4e/file_testo/biblioteca_02/login/acc_utente.php'>qui</a>";
    }else
    echo"L'username o l'email che hai utilizzato è già presente nel nostro registro dati,<a href='reg_ute.html'>torna indietro</a> per cambiarlo!";
    }
    }else
    echo"<h1>Le password non coincidono,<a href='reg_ute.html'>torna indietro</a> per cambiare!</h1> ";
    } else
    echo"<h1>Perpiacere riempia tutti i campi indicati</h1>";
    }
    ?>

    </body>
    </html>

    Pagina “cuore del programma”

    action.php

    <?php
    include("setting.php");

    /*************************
    SCRITTURA
    **************************/

    if(isset($_POST['registrati']))
    {
    if(!is_writable($my_database_txt)){
    exit("il file non ha i permessi di scrittura!");
    }
    // riceviamo i dati e li filtriamo
    $bad_char = array("|", "\r\n", "\r", "\n");
    $user = str_replace($bad_char, "", $_POST['user']);
    $pass = str_replace($bad_char, "", $_POST['pass']);
    // apriamo il file
    $open = fopen($my_database_txt, "a+");
    // scriviamo i dati separati dal carattere separatore
    fwrite($open,$user."|". $pass. "\r\n");
    // chiudiamo il file
    fclose($open);
    // ritorniamo nella pagina di visualizzazione
    header("location: acc_utente.php");
    exit;
    }
    ?>

    Pagina contenente nome file fisico da richiamare in tutte le pagine con la funzione include

    setting.php

    <?php
    $my_database_txt = 'password.txt';
    ?>

    pagina di accesso all'area riservata

    acc_utente.php

    <html>
    <head> <title> Accesso utente</title>
    </head>
    <?
    if(isset($_GET['error_login']))
    {
    echo "<div class='container' style= 'position: absolute; right:560px; top:240px';><p style='color:Tomato;'>Password erratta. Riprovare</p></div>";
    }
    ?>
    <body>
    <form action="acc_utente.php" method="POST">
    Username: <input name="user" maxlength="15" size="10" type="text"><br><br>
    Password: <input name="pass" maxlength="15" size="10" type="password"> <br><br>
    <input value="Accedi" type="submit" name="invia">
    <input value="Cancella" type="reset">
    </form>
    <?php
    $user=$_POST['user'];
    $pass=$_POST['pass'];
    $fp=fopen("password.txt","r");//apertura file di testo user pass clienti
    $dati=file("password.txt");//array dei clienti registrati
    $num_cli=count($dati);//numero dei clienti registrati
    flock($fp,2);//funzione che blocca il file in sicurezza in maniera che si possa scrivere senza che nessun altro possa registrare i dati.
    $trovato=false; //variabile che viene portata a 1 (vero - true) nel caso in cui sia user che password siano corretti e l'utente può accedere
    for($i=0; !$trovato && $i<$num_cli; $i++){
    $stringa_div=explode("|",$dati[$i]);
    $check_user=($stringa_div[0]==$user);
    //La funzione trim di PHP è utilizzata per rimuovere eventuali spazi (ed altri caratteri che vedremo 
    //in seguito) all'inizio ed alla fine di una stringa.
    $check_pass=(trim($stringa_div[1])==trim($pass));
    $trovato=($check_user && $check_pass);
    }
    flock($fp,3);//sblocca permettendo una successiva registrazione nel file di testo
    fclose($fp);//chiusura del file di testo
    $fp=fopen("biblioteca_02/clienti.txt","r");//apertura del file di testo delle generalità dei clienti
    $gen=file("biblioteca_02/clienti.txt");

    $i--;//$i aveva concluso l'ultimo ciclo con l'indice maggiore di uno, viene quindi riportato indietro per permettere di prelevare i dati da un altro file di testo senza l'utilizzo di un'altra variabile

    $stringa=explode("|",$gen[$i]);

    fclose($fp);

    if($trovato==true)
    header("Location: login_effetuato.php");
    else echo"L'username o la password inserite non sono corrette, riprova o registrati <a href='reg_ute.php'>qui</a>.";

    ?>
    </body>
    </html>

    Pagina intermedia che permette di visualizzare l'accesso effettuato

    login_effetuato.php

    <i class="fa fa-search"></i>


    <!DOCTYPE html>
    <html>
    <head>
    <title>Biblioteca comunale</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <style>
    #map {
    height: 300px;
    width: 300px;
    }
    body {
    font-family: Arial;
    }

    .coupon {
    border: 5px dotted #bbb;
    width: 80%;
    border-radius: 15px;
    margin: 0 auto;
    max-width: 600px;
    }

    .container {
    padding: 2px 16px;
    background-color: #f1f1f1;
    }
    ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
    overflow: hidden;
    border: 1px solid #e7e7e7;
    background-color: #f3f3f3;
    }

    li {
    float: left;
    }

    li a {
    display: block;
    color: #666;
    text-align: center;
    padding: 14px 16px;
    text-decoration: none;
    }

    li a:hover:not(.active) {
    background-color: #ddd;
    }

    li a.active {
    color: white;
    background-color: #4CAF50;
    }
    </style>
    </head>
    <body>
    <h1><center>BIBLIOTECA COMUNALE</center></h1>
    <center><h4>*simulazione scolastica*</h4></center>
    <div class="coupon">
    <ul>
    <li><a class="active" href="/public_html/4e/file_testo/biblioteca_02/login/login_effetuato.php">Home </a></li>
    <li><a href="/public_html/4e/file_testo/biblioteca_02/areariservata/login.php">Area riservata</a></li>
    <li><a href="/public_html/4e/file_testo/biblioteca_02/prestiti/prestiti.php">Richiedi prestito</a></li>
    <li><a href="../login/logout.php">Logout</a></li>
    </ul>
    <img src="/public_html/4e/file_testo/biblioteca_02/immagini/biblioteca.jpg" alt="biblioteca" style="width:100%;">
    <div class="container">
    <h4>DOVE SIAMO</h4> <div style="position: absolute; right:400px; top:650px; background-color:white">
    <p><b><center>CONTATTI:</center></b></p> <p>Tel. 0371 ** ** **<br>Email: biblioteca@biblioteca.com</p></div>
    <div id="map"></div>
    <script>
    function initMap() {
    var uluru = {lat:45.31139 ,lng:9.50088 };
    var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 13,
    center: uluru
    });
    var marker = new google.maps.Marker({
    position: uluru,
    map: map
    });
    }
    </script>
    <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyD_0xGC6BDxQQ6A0Zmx_oFDZVaEdlz0tc0&callback=initMap"></script>
    </div>
    </div>
    </body>
    </html>

    Chiusura della sessione

    logout.php

    <html>
    <head>
    <title>Login Area</title>
    <style>
    body {
    font-family: Arial;
    }

    .coupon {
    border: 5px dotted #bbb;
    width: 80%;
    border-radius: 15px;
    margin: 0 auto;
    max-width: 600px;
    }

    .container {
    padding: 2px 16px;
    background-color: #f1f1f1;
    }
    ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
    overflow: hidden;
    border: 1px solid #e7e7e7;
    background-color: #f3f3f3;
    }

    li {
    float: left;
    }

    li a {
    display: block;
    color: #666;
    text-align: center;
    padding: 14px 16px;
    text-decoration: none;
    }

    li a:hover:not(.active) {
    background-color: #ddd;
    }

    li a.active {
    color: white;
    background-color: #4CAF50;
    }

    input[type=text], input[type=password] {
    width: 50%;
    padding: 12px 20px;
    margin: 8px 0;
    display: inline-block;
    border: 1px solid #ccc;

    }

    button {
    color: white;
    background-color: #4CAF50;
    padding: 14px 20px;
    margin: 8px 0;
    border: none;
    cursor: pointer;
    width: 20%;
    }

    button:hover {
    opacity: 0.8;
    }

    .cancelbtn {
    width: auto;
    padding: 10px 18px;
    }

    span.psw {
    float: right;
    padding-top: 16px;
    }

    /* Change styles for span and cancel button on extra small screens */
    @media screen and (max-width: 300px) {
    span.psw {
    display: block;
    float: none;
    }
    .cancelbtn {
    width: 100%;
    }
    }
    </style>
    </head>
    <body>
    <form method="post" action="acc_utente.php">
    <div class="coupon">
    <div class="container">
    <ul>
    <li><a href="/public_html/4e/file_testo/biblioteca_02/info.php">Home</a></li>
    <li><a href="/public_html/4e/file_testo/biblioteca_02/info.php" class="active" >Area riservata</a></li>
    </ul><br>
    <?php
    include 'conf.php';
    session_start();
    if ($_SESSION['username']==$uname1) {
    session_unset();
    session_destroy();
    echo "<center><p style='color:Tomato';>HAI EFFETTUATO IL LOGOUT</p></center>";
    echo"<center><button type='submit' value='Log In'>Login</button></center><br>";
    } ?>
    </div>
    </div>
    </form>
    </body>
    </html>



    Commenti