[PHP] Sistema di gestione presenze

Discussione in 'PHP' iniziata da brasoft2019, 10 Maggio 2019.

Status Discussione:
Chiusa ad ulteriori risposte.
  1. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Buongiorno a tutti.
    Sto realizzando un sistema di gestione presenze (per una speciale associazione scolastica che lavora con i bimbi down/autistici) con php/mysql/bootstrap/jquery datatable, che gira su un server intranet LAMP UBUNTU, modificando il codice (quando riesco) di uno script trovato in rete per adattarlo alle mie esigenze.
    Il sistema sinora funziona "abbastanza" bene (non proprio del tutto), nel senso che registra nella tabella secondaria "time" (collegata alla tabella principale "student" contenente l'anagrafica): id, codice utente, nome e cognome, data e ora rilevati dell'evento attraverso la lettura di un barcode associato allo studente e restituisce con Javascript (attraverso uno specifico file login.js) un alert temporaneo al momento dell'inserimento, riportando la dicitura "è entrato ... il ...giorno... alle ore ..." .
    Mi servirebbe poter aggiungere nella tabella "time" un campo che, nel momento in cui registro l'ingresso dello studente con il barcode, scriva il numero della lezione di quell'ID incrementandolo di 1 (da 1 a 8) e, giunto alla 8 (per quella riga) avvisi nello steso alert anzidetto il numero della lezione e che quella registrata è l'ultima lezione (di quella serie).
    Per la serie di lezioni successive si agirebbe manualmente, reimpostando i giusti valori nei campi corrispondenti dell'anagrafica principale (data di inizio, giorno della settimana, ora programmata, numero 1 e così via).

    Il bottone che registra la presenza è php (type = "button" id = "login"), non ha submit e quando cliccato aziona un file login.php dove ci sono alcune variabili per data e ora (+ una fetch_array che unisce i campi separati nome e cognome) e un paio di query (una SELECT che recupera i dati dello studente e la seconda INSERT che scrive i dati nella tabella "time" del DB), oltre a una echo .$variabile. + strtotime ecc. che restituisce i dati visualizzati nell'alert.

    La questione per cui non riesco ad aggiungere questa funzionalità (e mi sto rompendo la testa, sinora) è che non so procedere correttamente:
    1 - ad esempio, se aggiungo un campo "lezione" al fondo della tabella "time" non mi viene più registrato l'inserimento (quindi qualcosa confligge con login.js).
    2 - se aggiungo una variabile per recuperare il dato di partenza dalla colonna "lezione" della tabella "student" (valore 1) si blocca tutto e non ne esco.
    Ho letto il thread di un utente che chiedeva come inserire un valore incrementale, e sarebbe per me una buona opzione, ma non so come applicarla (thread: incrementare-variabile-alla-pressione-di-un-pulsante).

    Qualcuno saprebbe come aiutarmi? Chiaro che io debba postare del codice, per far capire meglio ... Non sono sufficientemente preparato per cavarmela da solo ...
    Se c'è chi mi può aiutare posterò tutto il necessario, non ho segreti di sorta...
    Scusate la lunghezza ...
    Grazie.

    Aberto
     
  2. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Piano piano forse ci arrivo, ma non c'è nessuno che mi aiuta, per piacere?
    Sono riuscito, dichiarando una variabile e aggiungendola alla query insert, a ottenere la scrittura del valore 1 in una colonna numerica aggiunta al fondo della tabella "time".
    Ma la pagina login.php non legge il valore di partenza dal campo corrispondente della tabella "student" ... anche se il campo è vuoto la query inserisce 1 ....
    AIUTO!!
    Posto il codice della pagina che effettua la query (spero di non sbagliare con il tag CODE previsto dal regolamento ...)
    PHP:
    login.php
    PHP
    <?php
       
    require_once 'admin/connect.php';
       
    $student $_POST['student'];      
       
    $time date("H:i"strtotime("+0 HOURS"));
       
    $date date("Y-m-d"strtotime("+0 HOURS"));
    /* questa la variabile aggiunta */
       
    $student_lectia $student['lectia'];
       
    $q_student $conn->query("SELECT * FROM `student` WHERE `student_no` = '$student'") or die(mysqli_error());
       
    $f_student $q_student->fetch_array();  
       
    $student_name $f_student['lastname']." ".$f_student['firstname'];
    /* '$student_lectia' aggiunta alla fine della query */      
       
    $conn->query("INSERT INTO `time` VALUES('', '$student', '$student_name', '$time', '$date', '$student_lectia')") or die(mysqli_error());
       echo 
    "<h3 class = 'text-muted'>".$student_name." <label class = 'text-info'> la  ".date("H:i"strtotime($time))."</label></h3>";
    ?>
    che posso fare?
     
    Ultima modifica di un moderatore: 10 Maggio 2019
  3. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    se ho capito, questo é il primo passo, ma non sufficiente
    dovresti sommare 1 a "$student_lectia"
    ma soprattutto devi aggiornare l'anagrafica dello studente con il nuovo conteggio
    o sbaglio ?
    PHP:
    <?php
    require_once 'admin/connect.php';
    $student $_POST['student'];
    $time date("H:i"strtotime("+0 HOURS"));
    $date date("Y-m-d"strtotime("+0 HOURS"));
    $q_student $conn->query("SELECT * FROM `student` WHERE `student_no` = '$student'") or die(mysqli_error());
    $f_student $q_student->fetch_array();

    $student_name $f_student['lastname']." ".$f_student['firstname'];

    /* questa la variabile aggiunta */

    $student_lectia $f_student['lectia'];  //il valore viene recuperato dall'anagrafica, ma credo vada incrementato di 1

    /* '$student_lectia' aggiunta alla fine della query */

    $conn->query("INSERT INTO `time` VALUES('', '$student', '$student_name', '$time', '$date', '$student_lectia')") or die(mysqli_error());

    /* qui dovrebbe essere inserito l'update dell'anagrafica per registrare il valore aggiornato di "lectia" */

    echo "<h3 class = 'text-muted'>".$student_name." <label class = 'text-info'> la ".date("H:i"strtotime($time))."</label></h3>";
    ?>
     
    Ultima modifica: 10 Maggio 2019
  4. Max 1

    Max 1 Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    29 Febbraio 2012
    Messaggi:
    3.772
    Mi Piace Ricevuti:
    283
    Punteggio:
    83
    Sesso:
    Maschio
    @brasoft2019
    Purtroppo hai sbagliatoo il tag [​IMG]Leggi bene il regolamento e usa il tag php da qui [​IMG]
     
  5. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Grazie. Chiedo scusa per il tag sbagliato ... non era evidenziato il fatto (nelle istruzioni del regolamento) che il tag andasse inserito tra parentesi quadre come per uno shortcode in wordpress ... (sono un po' attempato e fatico a elaborare cose che per molti sono ovvie...). Cercherò di non sbagliare ulteriormente.
    Allora: ho applicato la correzione suggerita da Max 1 e funziona. Nel campo "lectia" della tabella "time" viene scritto il valore del campo corrispondente letto dalla tabella "student". Essendo entrambi INT viene restituito zero se viene impostato a priori il valore di testo "occasionale" (è una possibilità reale e il risultato mi sta bene) e viene restituito il valore 1, 2 oppure 3 ecc. , quando numerico. E sin qui tutto OK.

    In sostanza, trattandosi di cicli di 8 sedute terapeutiche che non incominciano lo stesso giorno, mi serve una reportistica giornaliera o per utente relativamente alla presenza e al numero di lezioni fruite. Quando si tratta di due o tre bambini le presenze si rilevano manualmente, quando sono 15-20 o più ogni giorno diventa un ginepraio...

    Fortunatamente per la reportistica ci pensa jquery datatable con i filtri, una volta scritti i records basta stampare i report con il filtraggio desiderato (passo successivo: uno script per formattare il PDF, ma lo affronterò poi).
    Adesso la questione è quella di incrementare il valore numerico del campo padre "lectie" quando viene premuto il bottone di inserimento della presenza, registrando contemporaneamente nel campo figlio "lectie", insieme a data e ora, il NUOVO VALORE.
    In rete (non ricordo se da mrwebmaster o da altre fonti) ho trovato questo script (che Dio me la mandi buona con il tag):

    HTML:
     
    <!DOCTYPE HTML>
    <html>
    <head>
    <title>Esempio</title>
    <meta charset="utf-8">
    <script type="text/javascript">
    function seleziona(){
    var e = document.getElementById("risultato");
    e.innerHTML = Math.min(8,+e.innerHTML+1);
    }
    </script>
    </head>
    <body>
    <button class="btn" onClick="seleziona()" id="selectbutton">Lezione</button>
    <label id="risultato"></label>
    </body>
    </html>
    
     
  6. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Mi piacerebbe molto applicare questo script (oppure una soluzione analoga) per incrementare nel database il valore. Ma (ahimè) non so scrivere quanto necessario per rilevare il valore di partenza impostato nella cella utente "lectie" del DB (ponendo il caso che si possa impostare un valore iniziale superiore a 1 - per corsi già incominciati) e incrementarlo sino a 8. Quando raggiunto il valore 8 dovrei poter visualizzare un alert al momento della convalida barcode (con un popup, per esempio) che dica all'operatore "questa è l'ultima lezione del ciclo" e, eventualmente, non permettere ulteriori registrazioni di presenza per qual barcode, a meno di reimpostare i valori.
    Giunti a quel punto la segreteria andrebbe a reinizializzare i dati per il ciclo successivo impostando i valori nei campi corrispondenti dell'anagrafica (c'è anche un campo con il numero del ciclo e la data d'inizio di quel ciclo).
    Di seguito il codice del file index.php che registra il barcode (cancellati riferimenti personali (... ). Scusate se il codice non è tanto "pulito"... è possibile che ci siano anche errori formali ...).

    A seguire il codice del file login.js che si occupa dell'alert temporaneo durante la registrazione

    Grazie di cuore a chiunque possa aiutarmi.
    Non alcun problema, quando il programma sarà operativo al 100%, a renderlo disponibile gratuitamente dietro richiesta diretta.
    Io lo sto facendo gratuitamente per aiutare una Onlus umanitaria (psicomotricità infantile per bimbi Down e Autistici).

    Dimenticavo: l'insieme del codice con tutte le altre parti che qui non ho postato, testato sul web in un dominio mio di prova , evidenzia errori legati a possibili attacchi legati a Mysql Injection (così mi è sembrato di capire leggendo qua e là - si rileva Warning: mysqli_error() expects exactly 1 parameter, 0 given in /home/.../www..../htdocs/.../login.php on line 9). Chiaro che, usandolo in locale su una macchina non connessa a internet posso tranquillamente ignorare gli avvisi che, sul mio server UBUNTU LAMP php 5.6 non vengono evidenziati. Tuttavia sarebbe bello poter risolvere gli errori... io non so come farlo, però.

    Cordiali saluti.
    Alberto.

    - index.php -

    PHP:
    <!DOCTYPE html>
    <?php
    /*
    Imposto un refresh della pagina corrente ogni 15 secondi
    */
    $curpage $_SERVER['PHP_SELF'];
    header('Refresh: 15;' $curpage);
    ?>  
    <html lang = "eng">
       <head>
           <title> ... </title>
           <meta charset = "utf-8" />
           <meta name = "viewport" content = "width=device-width, initial-scale=1" />
           <link rel = "stylesheet" href = "admin/css/bootstrap.css" />   
           
       </head>
       <body class = "alert-info">
           <nav class = "navbar navbar-inverse navbar-fixed-top">
               <div class = "container-fluid">
                   <div class = "navbar-header">
                       <img src = "admin/images/cs.png" width = "85px" height = "60px"/>
                       <p class = "navbar-text pull-right"><span style="font-size:24px;color:Gold"> ... </span></p>                   
                   </div>
               </div>
           </nav>
           <div class = "container-fluid">               
               <br />
               <br />
               <br />           
               <div class = "col-lg-3"></div>
               <div class = "col-lg-6 well">               
                   <h2 align="center">Registrazione presenza</h2>
                   <br />               
                   <div id = "result"></div>
                   <br />               
                   <form enctype = "multipart/form-data">
                       <div class = "form-group">                       
                           <center>
                           <label>&nbsp; Barcode ID :</label></center>
                           <br />
                           <input type = "text" id = "student" class = "form-control" required = "required"/>
                           
                           <!-- script focus sul campo immissione barcode -->
                           <script>window.onload = function()  
                           { document.getElementById('student').focus()  
                           }</script>
                           
                           <br />
                           <div id = "error"></div>
                           <br />                                       
                           <div id='skills-section' align="center">  
                           <div id='skills' >
                           <div class="skill" style="display: inline-block; margin:5px;"><h4>data &nbsp;e&nbsp; ora:&nbsp;</h4></div>
                           <div class="skill" style="display: inline-block; margin:5px;">
                   <p style="font-size:16px;color:Green" ><?php $timestamp strtotime("+0 day"); echo date('d-m-Y'$timestamp); ?></p></div>
                   <div class="skill" style="display: inline-block;">&nbsp;|&nbsp;</div>  
                           <div class="skill" style="display: inline-block; margin:5px;">
                   <p style="font-size:16px;color:Green"><?php $timestamp strtotime("+0 day"); echo date('H:i'$timestamp); ?></p>
                   </div>                 
                   </div>  
                   </div>
                   </div>
                           <button type = "button" id = "login" class = "btn btn-primary btn-block"><span class = "glyphicon glyphicon-ok"style="font-size:20px;color:Gold"></span><span style="font-size:20px;color:Gold">&nbsp; REGISTRA</span></button>
                           
                           <br/>
    <!--  CODE LAST BARCODE  (inserito in database) -->   
               <?php $conn = new mysqli('localhost''root''pw...''db...') or die(mysqli_error()); ?>               
                   <div class = "box-1">
                   <table id = "table" class = "table">
                       <thead class = "alert-info">
                           <?php
                           $q_time 
    $conn->query("SELECT * FROM `student` ORDER BY student_id DESC LIMIT 1") or die(mysqli_error());
                           while(
    $f_time $q_time->fetch_array()){  ?>
                           <tr>
                               <th>Ultimo barcode registrato :   
                           <?php echo $f_time['student_no']?></th> 
                           </tr>
                       </thead>
                       <tbody>
               <?php
               
    }
               
    ?>                   
    <!-- / CODE  LAST BARCODE -->
                           <hr>
                            <p class = "active" align="center"><a href = "admin/index.php"><span class = "glyphicon glyphicon-log-in" style="font-size:15px;color:Magenta"></span>&nbsp;&nbsp; ADMIN</a></p>  
                           <p class = "active" align="center"><a href = "admin/logout.php"><span class = "glyphicon glyphicon-log-out" style="font-size:15px;color:Magenta"></span>&nbsp; LOGOUT </a></p>
                           
                       </div>
                   </form>
               </div>
               
           </div>
       <div class = "navbar navbar-fixed-bottom alert-warning">
               <div class = "container-fluid">
                   <div class="text" align="center"><span></span>&copy; ...</span></div>
               </div>   
           </div>   
       </body>
       <script src = "js/jquery.js"></script>
       <script src = "js/bootstrap.js"></script>
       <script src = "js/login.js"></script>
    </html>
    - login.js -

    Codice:
    $(document).ready(function(){
       $error = $('<center><h2 class = "text-danger">Non ho trovato questo ID...<h2></center>');
       $error1 = $('<center><h2 class = "text-danger">Scansiona il BARCODE o scrivi il numero ID<h2></center>');
       $('#login').click(function(){
           $error.remove();
           $error1.remove();
           $student = $('#student').val();
           if($student == ""){
               $error1.appendTo('#error');
           }else{   
               $.post('check.php', {student: $student},
                   function(show){
                       if(show == 'Success'){
                           $.ajax({
                               type: 'POST',
                               url: 'login.php',
                               data: {
                                   student: $student
                               },
                               success: function(result){
                                   $result = $('<h2 class = "text-warning">Entra :</h2>' + result).appendTo('#result');
                                   $('#student').val('');
                                   setTimeout(function(){
                                       $result.remove();
                                   }, 10000);
                               }
                           });
                       }else{
                           $('#student').val('');
                           $error.appendTo('#error');
                       }
                   }
               )
           }   
       });
    });
    
     
  7. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Ho sbagliato di nuovo con il codice. Chiedo ancora scusa.
    Adesso ho capito, alla prossima non sbaglio più.
     
  8. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    a mio parere non dovresti aver bisogno di un nuovo script ma, l'aggiornamento di "student" dovrebbe avvenire contestualmente alla scrittura in "time"
    PHP:
    $student_name $f_student['lastname']." ".$f_student['firstname'];

    /* questa la variabile aggiunta */
    $student_lectia $f_student['lectia'];  //il valore viene recuperato dall'anagrafica, ma credo vada incrementato di 1

    /* '$student_lectia' aggiunta alla fine della query */
    $conn->query("INSERT INTO `time` VALUES('', '$student', '$student_name', '$time', '$date', '$student_lectia')") or die(mysqli_error());

    /* qui dovrebbe essere inserito l'update dell'anagrafica per registrare il valore aggiornato di "lectia" */
    $conn->query("UPDATE student set lectia = '$student_lectia' WHERE student_no = '$student'") or die(mysqli_error());

    echo 
    "<h3 class = 'text-muted'>".$student_name." <label class = 'text-info'> la ".date("H:i"strtotime($time))."</label></h3>";
    ?>
    quando "lectia" in "student" é zero, il bimbo non ha seguito sedute terapeutiche,
    alla lettura del barcode,
    1) viene letto "lectia" da "student" e incrementato di 1
    2) viene inserito il record in "time"
    3) viene aggiornato "student" con il nuovo valore "lectia"

    ti sembra corretto ?
     
    Ultima modifica: 11 Maggio 2019
  9. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Chapeau.
    Bravo, Marino 51. Grazie! - la classe (non css, beninteso) non è acqua.
    Io non avrei saputo scrivere la query, non sono sufficientemente ferrato. Tuttavia, per aggiornare i campi come desiderato e sperato ho dovuto aggiungere un +1 (...'$student_lectia' +1 WHERE....), altrimenti rimaneva costantemente al valore impostato, oppure a zero.
    La ciliegina sarebbe ... fare in modo che arrivati al valore 8 il sistema non registri più nulla oltre e restituisca un warning, obbligando la segreteria a reimpostare via CRUD - bootstrap i valori nei campi "data inizio serie lezioni" ("data_serie"), numero serie ("n_serie") e numero lezioni ("lectie") di quella serie.
    Poi (credo, spero, [... ahi, ahi, ahi ...]) passerò a studiarmi il modo di recuperare e implementare uno script per formattare e stampare i report in PDF con un minimo di grafica (ce ne sono diversi, uno è print.js, ma non so come usarlo - cosa mai fatta, sinora. Per adesso stampo da firefox via CUPS-PDF pulendo il codice dall'anteprima. Non è bello, ma funziona.
    Servirà a dare alle famiglie una reportistica sulla frequenza.
    Lo stesso software, opportunamente modificato, servirà a creare un sistema parallelo di schede di apprendimento laddove a un certo barcode (corrispondente all'anagrafica, ovviamente) saranno associati degli "step" specifici (via FORM) che restituiranno le date e le curve di miglioramento dei bimbi. Chiaro che questi dati saranno estremamente riservati, dato che sono sensibili, sensibilissimi ... (ho fatto un corso GDPR certificato).
    Per questo penso al PDF: i genitori riceveranno via mail la reportistica, solo su espressa richiesta. Tutto il software sarà rigidamente INTRANET, con backup, ecc. ma non online. Il server mi fa anche da nas.

    Diciamo che, se tutto va bene, lunedì prossimo metto questo primo software in "produzione" ripulendo un pò il codice da sporcature varie.
    Grazie ancora, tutti i consigli sono bene accetti!
    Buona Domenica!

    Alberto
     
  10. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    in realtà pensavo che il valore iniziale in "student" fosse zero quindi ho pensato che fosse meglio sommare 1 alla lettura di lectia ( rivedi il mio ultimo script postato )
    PHP:
    /* questa la variabile aggiunta */
    $student_lectia $f_student['lectia'];  //il valore viene recuperato dall'anagrafica, ma credo vada incrementato di 1
    In questo modo i valori in "time" vanno da 1 a 8 ed al contempo viene aggiornato "studend" con l'ultimo valore usato
    "student" e "time" sono ben allineati

    secondo me andrebbe fatto al momento dell'inserimento del barcode
    ma mi manca … il codice, se puoi postarmi il form che usi per inserire il barcode, potrei vedere come agire ….
    io uso FPDF il report é generato con uno script php, qui un esempio di una lista (scusa se ho mascherato dei dati)
    upload_2019-5-11_21-22-59.png

    risolviamo prima la "numerazione" ….
     
    Ultima modifica: 11 Maggio 2019
  11. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Mannaggia, che pollo sono ... non avevo visto la stringa di codice precedente con l'increment ... mea culpa.
    Tuttavia ho pensato di usare il decrement, variando il segno e impostando 8 come valore di partenza.
    E' una questione "psicologica", se vuoi: partendo da 8 (valore obbligato per le lezioni nei cicli mensili su 2 sedute a settimana o bimestrali una seduta a settimana) una volta arrivati a zero, se si procede con la registrazione attraverso barcode i numeri vanno in negativo e l'operatore, vedendo stampato a video -1 (oppure -2) ecc. capisce immediatamente che non è stato fatto qualcosa dal lato amministrativo e si risolve reimpostando i valori. Se lo lasciamo in positivo, in assenza di un popup alert, l'operatore potrebbe pensare che il bimbo esegue cicli di lezioni più lunghi di 8, e questo può danneggiare l'attività, che è calibrata appunto su 8 lezioni.
    Ti spiego come funziona: il "micro server" sarà in segreteria (non ridere: sarà un raspberry PI prima serie, vecchiotto ma ok, con Raspbian - SD da 64GB, più che sufficiente per l'attività) insieme a un normale desktop per l'amministrazione ordinaria (Xubuntu 64). All'ingresso c'è un laptop Xubuntu con il lettore di barcode che rileva l'accesso dei bimbi alla sala di terapia. Il rilevamento viene fatto o dalla segretaria (il cambio turno è a ogni ora, principalmente di pomeriggio, finite le scuole) o da una ragazza Down che fa volontariato (per loro è una grandissima conquista sociale, quando possono fare qualcosa, e lo fanno BENE!).
    E' tutto materiale informatico riciclato, le associazioni di volontariato non hanno denari per acquistare tecnologie e licenze, altrimenti di cms che fanno l'attendance, il timetracking e la reportistica per le scuole ce ne sono a vagonate, opensource e a pagamento. Ma in genere sono molto articolati e complessi, mentre qui serve una cosa basilare, semplice e funzionale.
    Ok. adesso vado a pescare il codice e lo posto nella replica successiva.
     
  12. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    HTML:
    <!DOCTYPE html>
    <?php
    /*
    Imposto un refresh della pagina corrente dopo 15 secondi
    */
    $curpage = $_SERVER['PHP_SELF'];
    header('Refresh: 15;' . $curpage);
    ?>
    <html lang = "eng">
        <head>
            <title>... PRESENZE</title>
            <meta charset = "utf-8" />
            <meta name = "viewport" content = "width=device-width, initial-scale=1" />
            <link rel = "stylesheet" href = "admin/css/bootstrap.css" />   
            
        </head>
        <body class = "alert-info">
            <nav class = "navbar navbar-inverse navbar-fixed-top">
                <div class = "container-fluid">
                    <div class = "navbar-header">
                        <img src = "admin/images/cs.png" width = "85px" height = "60px"/>
                        <p class = "navbar-text pull-right"><span style="font-size:24px;color:Gold"> Sistema di registrazione presenze bazin</span></p>                   
                    </div>
                </div>
            </nav>
            <div class = "container-fluid">               
                <br />
                <br />
                <br />           
                <div class = "col-lg-3"></div>
                <div class = "col-lg-6 well">               
                    <h2 align="center">Registra presenza</h2>
                    <br />               
                    <div id = "result"></div>
                    <br />               
                    <form enctype = "multipart/form-data">
                        <div class = "form-group">                       
                            <center>
                            <label>&nbsp; Barcode ID :</label></center>
                            <br />
                            <input type = "text" id = "student" class = "form-control" required = "required"/>
                            
                            <!-- script focus sul campo immissione barcode -->
                            <script>window.onload = function()
                            { document.getElementById('student').focus()
                            }</script>
                            
                            <br />
                            <div id = "error"></div>
                            <br />                                       
                            <div id='skills-section' align="center">
                            <div id='skills' >
                            <div class="skill" style="display: inline-block; margin:5px;"><h4>data &nbsp;si&nbsp; ora:&nbsp;</h4></div>
                            <div class="skill" style="display: inline-block; margin:5px;">
                    <p style="font-size:16px;color:Green" ><?php $timestamp = strtotime("+0 day"); echo date('d-m-Y', $timestamp); ?></p></div>
                    <div class="skill" style="display: inline-block;">&nbsp;|&nbsp;</div>
                            <div class="skill" style="display: inline-block; margin:5px;">
                    <p style="font-size:16px;color:Green"><?php $timestamp = strtotime("+0 day"); echo date('H:i', $timestamp); ?></p>
                    </div>                 
                    </div>
                    </div>
                    </div>
                            <button type = "button" id = "login" class = "btn btn-primary btn-block"><span class = "glyphicon glyphicon-ok"style="font-size:20px;color:Gold"></span><span style="font-size:20px;color:Gold">&nbsp; Actualizare</span></button>
                            
                            <br/>
    <!-- CODE LAST BARCODE                -->   
                <?php $conn = new mysqli('localhost', '...', ....', '....') or die(mysqli_error()); ?>               
                    <div class = "box-1">
                    <table id = "table" class = "table">
                        <thead class = "alert-info">
                            <?php
                            $q_time = $conn->query("SELECT * FROM `student` ORDER BY student_id DESC LIMIT 1") or die(mysqli_error());
                            while($f_time = $q_time->fetch_array()){  ?>
                            <tr>
                                <th>Ultimo barcode registrato :   
                            <?php echo $f_time['student_no']?></th>       
                            
                                                        
                            </tr>
                        </thead>
                        <tbody>
                        
                <?php
                }
                ?>                   
    <!-- / CODE  LAST BARCODE -->
                            <hr>
                            
                            <p class = "active" align="center"><a href = "admin/index.php"><span class = "glyphicon glyphicon-log-in" style="font-size:15px;color:Magenta"></span>&nbsp;&nbsp; ADMIN</a></p>
                            <p class = "active" align="center"><a href = "admin/logout.php"><span class = "glyphicon glyphicon-log-out" style="font-size:15px;color:Magenta"></span>&nbsp; LOGOUT </a></p>
                            
                        </div>
                    </form>
                </div>
                
            </div>
        <div class = "navbar navbar-fixed-bottom alert-warning">
                <div class = "container-fluid">
                    <div class="text" align="center"><span></span>&copy; ...</span></div>
                </div>   
            </div>   
        </body>
        <script src = "js/jquery.js"></script>
        <script src = "js/bootstrap.js"></script>
        <script src = "js/login.js"></script>
    </html>
     
  13. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Ho visto che il form lo avevo già postato (replica #6 sopra, index.php + login.js); inoltre adesso, provando, ho notato che (come decrement) va impostato il valore 7 di partenza, perchè se metto l'8 con la "lezione" zero il totale fa 9, prima di andare in negativo. Posso aggiungere nel testo dell'alert attuale la dicitura "ci sono ancora ...x... sedute" oppure soltanto "lezione"; ne parlerò con la psicomotricista.
    Ok.
    Per la stampa report: FPDF non l'ho mai usato. Andrò a vedere. Mi piacerebbe capire (non lo so con certezza) se si riesce a popolare in qualche modo un modello formattato di Openoffice Writer, forse si può fare con una o più macro ma, onestamente, non l'ho mai fatto e non ne sono capace così, a priori.
    Se si potesse fare uscirebbero dei report graficamente carini con logo, intestazione ecc. che potrebbero cambiare sostanzialmente la qualità della comunicazione ai genitori, aumentando il livello della professionalità che è alta, nella psicomotricità. Un pò meno nelle mie capacità ... io mi occupo di cose leggermente diverse, di solito, non ho studiato informatica e mi ritengo analogo a un buon musicista amatore, non certo un professionista.
    Anche se, perdonami, non ho trovato professionisti disposti a mettere mano al codice per volontariato, neppure se lo scopo è umanitario.
    Grazie, tu sei una eccezione. Se vuoi, scrivimi in privato, ti darò maggiori informazioni personali e i riferimenti dell'associazione.
    Potresti rimanere stupito ...
    Ciao.
    Alberto
     
  14. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    mai succederà, anzi é da diverso tempo che ho nella testa di regalarne un paio ai miei nipoti
    potrei sfruttare la tua esperienza

    c'é un sito specifico con molti esempi significativi, http://www.fpdf.org/
    ho integrato la classe con "header", "body" e "footer" e con poche righe di codice, ottengo liste "semplici" come quella postata in "minuti"

    se parti da 7 in "student" ti rimane uno zero alla fine del ciclo che confonde si si volesse usare una ricerca con zero per individuare i bimbi senza cicli di lezioni (ma sull'argomento tu "vedi" meglio la situazione)

    ora cerco di capire il form e come inserire l'alert
     
  15. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    puoi pubblicare lo script "check.php" per favore,
    credo sia possibile modificare lui per gestire l'alert, per intenderci, gestendo qui la risposta
    Codice:
               $.post('check.php', {student: $student},
                   function(show){
                       if(show == 'Success'){
                           $.ajax({
                               type: 'POST',
                               url: 'login.php',
                               data: {
                                   student: $student
                               },
                               success: function(result){
    
    qui penso si possa controllare la risposta
    
                                   $result = $('<h2 class = "text-warning">Entra :</h2>' + result).appendTo('#result');
                                   $('#student').val('');
                                   setTimeout(function(){
                                       $result.remove();
                                   }, 10000);
                               }
                           });
                       }else{
                           $('#student').val('');
                           $error.appendTo('#error');
                       }
                   }
    
     
  16. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Yes! Immediately!
    PHP:
    <?php
        
    require_once 'admin/connect.php';
        
    $student $_POST['student'];
        
    $q_student $conn->query("SELECT * FROM `student` WHERE `student_no` = '$student'") or die(mysqli_error());
        
    $v_student $q_student->num_rows;
        if(
    $v_student 0){
            echo 
    'Success';
        }else{
            echo 
    'Error';
        }
    A proposito di raspberry ... non so la versione 3, ma con la versione 1 (comprata poco dopo l'uscita) ci ho giocato un pò ... invece con Arduino non mi sono mai cimentato.
    Siccome il mio lo darò all'associazione, conto di comprarmene un'altro per "giocarci" ancora, stavolta ultima versione.
    A più tardi. Credo stasera, forse. Oggi esco con famiglia. Grazie, buona domenica.
     
  17. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    P.S. Gli alert sono gestiti da login.js, per quello che ho capito io. Ma di sintassi Javascript ne so meno di PHP ...
     
  18. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    check.php "genera" gli alert (vedi error)
    login.js, li "gestisce"

    con check.php modificato, in caso di lectia < 1 viene generato al momento lo stesso errore del barcode errato o vuoto
    ho messo la candizione < 1 perché mi hai detto che parti da 7 a scendere
    prova se funziona, se ok, nel passo successivo gestiamo bene il messaggio di errore

    PHP:
    <?php
    require_once 'admin/connect.php';
    $student $_POST['student'];
    $q_student $conn->query("SELECT * FROM `student` WHERE `student_no` = '$student'") or die(mysqli_error());
    $v_student $q_student->num_rows;
    if(
    $v_student 0) {
        while(
    $f_student $q_student->fetch_array()) {
            if ( 
    $f_student['lectia'] < ) {
                echo 
    'Error';
            }
            else {
                echo 
    'Success';
            }
        }
    }
    else {
        echo 
    'Error';
    }
    ?>
     
  19. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    check.php
    PHP:
    <?php
    require_once 'admin/connect.php';
    $student $_POST['student'];
    $q_student $conn->query("SELECT * FROM `student` WHERE `student_no` = '$student'") or die(mysqli_error());
    $v_student $q_student->num_rows;
    if(
    $v_student 0) {
        while(
    $f_student $q_student->fetch_array()) {
            if ( 
    $f_student['lectia'] < ) {
                echo 
    'Error3';
            }
            else {
                echo 
    'Success';
            }
        }
    }
    else {
        echo 
    'Error2';
    }
    ?>
    login.js
    HTML:
    $(document).ready(function(){
       $error1 = $('<center><h2 class = "text-danger">Scansiona il BARCODE o scrivi il numero ID<h2></center>');
       $error2 = $('<center><h2 class = "text-danger">Non ho trovato questo ID...<h2></center>');
       $error3 = $('<center><h2 class = "text-danger">Il ciclo di trattamento &egrave; concluso per questo barcode<h2></center>');
       $('#login').click(function(){
           $error1.remove();
           $error2.remove();
           $error3.remove();
           $student = $('#student').val();
           if($student == ""){
               $error1.appendTo('#error');
           }else{   
               $.post('check.php', {student: $student},
                   function(show){
                       switch(show) {
                           case 'Success':
                               $.ajax({
                                   type: 'POST',
                                   url: 'login.php',
                                   data: {
                                       student: $student
                                   },
                                   success: function(result){
                                       $result = $('<h2 class = "text-warning">Entra :</h2>' + result).appendTo('#result');
                                       $('#student').val('');
                                       setTimeout(function(){
                                           $result.remove();
                                       }, 10000);
                                   }
                               });
                           break;
                           case 'Error2':
                               $('#student').val('');
                               $error2.appendTo('#error');
                           break;
                           case 'Error3':
                               $('#student').val('');
                               $error3.appendTo('#error');
                           break;
                       }
                   }
               )
           }   
       });
    });
    il mio risultato
    upload_2019-5-12_17-37-37.png
     
  20. brasoft2019

    brasoft2019 Nuovo Utente

    Registrato:
    22 Aprile 2019
    Messaggi:
    20
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Ciao, Marino 51.
    Si, funziona, ma per i cicli soltanto.
    Per poterlo utilizzare, si dovrebbe migliorare la condizione: infatti ci sono bimbi che fanno cicli di 8 lezioni e altri che invece arrivano al centro senza programmazione, oppure occasionalmente (e a cui si applicano "terapie" diverse dai quelle praticate nei cicli). Magari ci sono quelli che vengono una volta o due e poi non li vedi più...
    Ho un campo immediatamente precedente al "lectie" (nome "tipabonament") che prevede appunto tre voci: occasionale, no_prog, 8_sedute.
    Adesso il campo "lectie" è settato a zero in tutta la colonna (374 record per adesso, chiaro che nel momento in cui si vanno a inserire i valori per ciasun bimbo in anagrafica la situazione cambia). Prima delle tue correzioni, per testare il sistema, inserendo il barcode i valori zero vanno a -1, -2, ecc. (per quel record)
    Se applico il codice i barcode "non settati " non sono più registrabili, restituisce sempre l'alert...
    Guardando cosa hai scritto, vedo che l'alert compare quando la condizione è a < 1.
    Come posso fare per restituire l'alert soltanto per i cicli di lezioni, lasciando la possibilità agli occasionali di venire registrati senza conteggi (solo con ora e data)?
    Inserendo dopo if anche la condizione relativa al campo precedente "tipabonament", cioè se viene letta la condizione "8_sedute" si procede al conteggio, altrimenti no?
    - tipo quando trovo la condizione "8 lectii" e il numero < 1 procedo con l'alert e il blocco della registrazione, altrimenti rimane tutto a zero (o in alternativa a -1, -2, -3, ecc. - che può essere un modo per visualizzare istantaneamente la diversa tipologia di prestazioni?
    "...confused..."
     
Sto caricando...
Status Discussione:
Chiusa ad ulteriori risposte.

Condividi questa Pagina