Determinazione data

di pierpippo il
45 risposte

45 Risposte - Pagina 2

  • 20/06/2026 - pierpippo ha scritto:

    UPDATE festivita SET data = :D_Pasquetta WHERE NOME = 'PASQUETTA'; sintassi a me sconosciuta al momento ma immagino che pre imposti dei segnaposti e poi i parametri vengono inseriti dopo con l'istruzione easter_date MA se queste vanno pianificate per essere eseguite in automatico, come fa sql a sapere che anno deve perendere in considerazione?

    :Pippo :pasquetta :a sono i parametri

    Tu puoi da PHP settare il parametro e lanciare la query o lanci la query (la.scrivi di sana pianta) con già il parametro settato

    Es. Select bla bla where campo= :a

    Ed a vale Pippo la query diventa

    Select bla bla where campo="Pippo"

    20/06/2026 - pierpippo ha scritto:

    SELECT * FROM festivita;

    L'ho inserita per vedere la tabella compilata

    20/06/2026 - pierpippo ha scritto:

    D_pasqua=easter_date(annodaconsiderare) e D_Pasquetta (D_pasqua+1) --?? anno da considerare?

    Tradotto:

    Variabile d_pasqua (che è di tipo date) uguale funzione che restituisce il giorno di pasqua in base all'anno che stai valutando cioè easter_date(2026)

    Ti restituisce 05/04/26 pasquetta ovviamente è il giorno di pasqua + 1

    Se metti 2027 ti dà il giorno di pasqua del prossimo anno e così via...

    Prendi la data e la schiaffi sul parametro o costruisci la stringa SQL con la data e/o i vari parametri.

  • 20/06/2026 - sihsandrea ha scritto:

    Se metti 2027 ti dà il giorno di pasqua del prossimo anno e così via...

    Prendi la data e la schiaffi sul parametro o costruisci la stringa SQL con la data e/o i vari parametri.

    Quindi se pianifico le update sulla tabella festività che mi hai suggerito di creare, (sto studiando l'istruzione CREATE EVENT...), 
    in modo che la tabella festività venga aggiornata al 1 gennaio di ogni anno, 
    il parametro (annodaconsiderare) può essere :

    D_pasqua=easter_date(YEAR(CURDATE());

  • Si lo stesso per il calendario, metti una data inizio e una data fine io hoesso tutto l'anno tu puoi andare mese per mese

  • Allora mettiamo che creo una update pianificata al primo dell'anno devo usare l'istruzione CREATE EVENT etc...

    Ma se l'aggiornamento dei record che hanno date fisse non ha bisogno della funzione easter_date che è un'istruzione php, l'aggiornamento delle date variabili ne ha bisogno invece e come faccio a passargli quei parametri se l'operazione dovrebbe avvenire autonomamente su sql ? 

    Cioè per le date fisse gli dico che a partire dal 2027/01/01 00:30:00 tutti gli anni venga svolta una determinata operazione:

    CREATE EVENT IF NOT EXISTS aggiorna_date_festive
    ON SCHEDULE EVERY 1 YEAR
    STARTS '2026-06-22 02:00:00'
    DO
      UPDATE gbgar_festività..

    non capisco però come usarla per le date variabili che necessitano di quei parametri che sono ricavati da una funzione PHP e quindi devo essere impartiti da uno script in php.

    Io ho sempre saputo che un file php riceve dei dati da un form e esegue una query usando i dati come parametri da passare alle istruzioni sql .

    qua non mi serve un form per i dati, ma devo cmq avere uno script php per lanciare le 2 query che devono aggiornare valori tipo data che sono calcolati in base alla funzione easter_date.

    Quindi non capisco come possa fuunzionare.

    Per finire, per settare permanentemente sul mio server locale event_scheduler = ON  sto diventando cretino perchè  non trovo il file di configurazione  in /etc/myasql/... booohhhh

    ne ho provati diversi ma al riavvio del servizio non riesco a rientrare in console che nessuna credenziali perchè la direttiva di cui sopra non è corretta o non è scritta nel file corretto.

    buona domenica 

  • Uhm... Comunque si chiama trigger...

    Fai così, come fa PHP e mysql a sapere che hai un automezzo nuovo? Come fa a sapere che c'è una corsa in più, che c'è un nuovo autista, che ci sono nuovi percorsi, che hanno abolito la befana.... Chissà! Sei ti che premi il pulsante nuovo>>automezzo oppure nuovo>>autista ecc... Questi non puoi automatizzarli, ma una ricorrenza si.

    O metti un trigger che al 1/1 aggiorna i dati (sono quelli, non hanno bisogno dell'utente che glielo dice, natale sarà sempre il 25/12 hai bisogno dell'omino per cambiare l'anno? Pasqua ci sarà ogni anno, quella la lanci tu al 1/1/anno nuovo o la.scrivi a mano o lanci il pulsantino "passaggio anno nuovo" che lancia le query di aggiornamento date festive.

    Il calendario corse, io l'ho fatto annuale ma tu o chi per te, apre la pagina assegnazioni seleziona un periodo, in base al periodo hai quei risultati da lun a dom ed eventuali feste avrai 

    Data, tipo giornata, numero corse (che hai configurato nella tabella corse_config.

    Così sai che lun è festa ed hai 2 corse, leghi la tabella coser,.scegli le corse da fare (2) scegli l'autista di turno e compili la tabella relazione m a m del precedente 3d di cui abbiamo abbondantemente discusso.

    Con questo sistema sai quante corse assegnare, scegli quali mezzi usare e quali autisti associare, registri il tutto e se fra 1 anno arriva una multa sai chi guidava...

    Adesso un tuffo al mare... Buona domenica.

    PS. Apri mysql, crea le tabelle metti qualche dato, lancia da terminale le query con i valori che vuoi e vedi i risultati: è quello che ti aspetti?fregatene di automatizzare e mettere trigger, poi, in futuro potrai farlo per il momento apri la pagina PHP e sui pulsanti scrivi mostra date dal al e lanci la query.

  • 21/06/2026 - sihsandrea ha scritto:

    Uhm... Comunque si chiama trigger...

    Aiuto!!!! E ora che sono sti trigger? ;-)

    mi si continuano a confondere le idee quindi per schiarirmele sono andato a leggere:

    ho letto che una operazione pianificata in sql è una operazione, tipo ad esempio update , insert into o delete che si attiva con una determinata frequenza a partire da una certa data. Quindi l'evento che la fa eseguire è un momento stabilito tipo 2027-01-01 00:30:00.

    in quel momento in teoria e con la frequenza di 1 YEAR eseguo, sempre per es, una delete di tutti i record di una tabella dove la data è inferiore a 1/1/2026.  Quindi cancello i record fino al 31/12/2025 compreso.

    I trigger invece reagiscono in base ad un evento specificato che a sua volta può essere una update o una insert o altro,  può essere eseguita prima o dopo di esso ma non in base ad una data; non direttamente per lo meno.

    Ovviamente quindi posso avere un' operazione pianificata che a sua volta, ad esempio, scatena una delete subito dopo essere stata eseguita. Anche se non so esattamente al momento che applicazione pratica possa avere, cmq il concetto è che un evento si pianifica in base ad un momento e con una frequenza, un trigger invece non dipende da un momento cronologico ma dall'esecuzione di una operazione precedente.

    Se per esempio voglio snellire una tabella che tende a riempirsi di record che dopo top tempo non ha più senso conservare ulteriormente, avendo infatti una tabella che registra i servizi che vengono assegnati agli operatori (autisti), ed essendo 20 colleghi,  in breve tempo mi trovo un sacco di record (almeno 20 al giorno che sono già 600 in un mese), potrei pianificare che una volta all'anno a partire dal 2027-01-01 00:30:00, venga eseguita una delete from gbgar_serv_master where date<= (YEAR(NOW()) -2);

     //elimino i record con data risalente a 2 anni indietro rispetto l'anno della data corrente. 

    O sbaglio? 

    ps in ogni caso è una cosa che affronterò a tempo debito. Per ora devo impostare la selezione delle corse che devono essere prelevate dalla tabella corse i base ai parametri del giorno di riferimento.

    Intanto ho preparato la tabella dei giorni festivi, e scoperto che per la pasqua la funzione easter_date restituisce la data del giorno precedente la pasqua per effetto del timezone impostato nell' OS su cui gira il server. (Gnu/Linux debian13 TimeZone utc+1).

    Il problema si risolve anche facilemente aggiungendo un giorno per ricavare la data pasquale corretta e 2 gg per la pasquetta; tuttavia, essendo che si basa sul valore data in formato Timestamp, dopo il 2037 uno script basato su questa funzione sarà cmq da rivedere. 

    Ho letto di usare piuttosto easter_days  che calcola quanti giorni passano in base all'anno corrente tra il 21 marzo (equinozio) e la pasqua considerando il calendario lunare visto che si deve calcolare la data della prima domenica dopo il primo plenilunio di primavera.

    In ogni caso, non sapendo il server installato dal provider con cui pubblicherò il sito, che timezone utilizza,
    l'opzione easter_days mi pare quella più sicura o no?

    Buon pomeriggio

    Filippo  

  • Per la.pasqua e il timezone:

    $timestamp = easter_date(2026);
    $date = new DateTime("@$timestamp"); // timestamp UTC
    $date->setTimezone(new DateTimeZone('Europe/Rome'));
    echo $date->format('Y-m-d H:i:s');

    Così in qualsiasi parte del mondo si festeggia la pasqua sei a posto.

    Per il trigger: setti la pasqua e all'update del.record.pasqua il trigger aggiorna tutti gli altri fissi + pasquetta.

    I successivi id (sarebbe meglio un campo specifico) quelli relativi ai periodi nel mio caso che ho messo tutto in tabella festività, non fai gli aggiornamenti, quelli li correggi con una update tua. Selezioni il.periodo e metti le date dal...al... In questo caso il trigger non parte perché non è il record della.pasqua a variare.

    Ripeto, fai lavorare il server, così se domani abbandoni PHP e usi python, access o qualsiasi altra cosa, tu devi solo lanciare il comando eal resto ci pensa il database.

  • 22/06/2026 - pierpippo ha scritto:

     in breve tempo mi trovo un sacco di record (almeno 20 al giorno che sono già 600 in un mese), potrei pianificare che una volta all'anno a partire dal 2027-01-01 00:30:00, venga eseguita una delete from gbgar_serv_master where date<= (YEAR(NOW()) -2);

    Non sono niente...

    Per la permanenza dipende dalla prescrizione di cosa ti arriva. Multe, pedaggio, ecc...

    Legalmente i documenti si tengono per 10 anni, fiscalmente per 5 anni.

  • Buongiorno,

    22/06/2026 - sihsandrea ha scritto:

    I successivi id (sarebbe meglio un campo specifico) quelli relativi ai periodi nel mio caso che ho messo tutto in tabella festività, non fai gli aggiornamenti, quelli li correggi con una update tua. Selezioni il.periodo e metti le date dal...al... In questo caso il trigger non parte perché non è il record della.pasqua a variare.

    Riguardo a sto punto, io come ho già scritto ho già una tabella chiamata gbga_scad_periodo:

    MariaDB [gbgarage_test]> SELECT * FROM gbgar_scad_periodo;
    +------+------------+------------+------------+------------+
    | id   | start_inv  | end_inv    | start_est  | end_est    |
    +------+------------+------------+------------+------------+
    |    1 | 2025-09-15 | 2026-06-06 | 2026-06-07 | 2026-09-14 |
    +------+------------+------------+------------+------------+
    1 row in set (0,001 sec)
    

    Ance se diversa da come mi era stata suggerita, (non è una tabella unica con gbgar_festività.)

    L'avevo pensata cosi quando mi ponevo il problema di come definire appunto delle query SELECT differenziate in base al periodo in vigore(estate/inverno), alla data cui i servizi assegnati attraverso il form, sono riferiti.

    Per cui creai la tabella e avendo già un form in cui viene inserita la data di riferimento appunto, creai un div sopra quello che ospita la input principale, e li ci ho messo le input tipo date per inserite le date di inizio/fine periodo estivo e invernale. Questo div appare solo se si attiva un chekbox chiamato aggiorna periodi.

    Se non viene attivata la check box non compare il div e di conseguenza non compaiono neppure le label e le input relative, di conseguenza le scadenze dei periodi restano quelli esistenti.

    Poi ho la select che preleva le date e le mette in variabili chiamate 

    $inizio_invernale;
    $fine_invernale;
    $inizio_estivo;
    $fine_estivo

    in questo modo ho ciò che mi serve, almeno per filtrare quali corse devono essere prelevate dalla SELECT che agisce sulla tabella gbgar_corse per schiaffarle nella mia tendina (select html) del form in cui si assegnano i servizi, select html che nel form appare se per tipologia servizio si è scelto tpl, altrimenti scegliendo "noleggio" (si intende noleggio con conducenti di autobus turistici), non appare la select con le corse ma una campo descrittivo (input classica).

    Questo lo avevo pensato anche perché volevo collaudare delle applicazioni pratiche del codice JS.

    Tuttavia non credo che, seppur diversamente da come, un programmatore professionista avrebbe ottenuto altrettanto, ciò ho bene o male realizzato sia sbagliato. L'importante credo, sia non chiudersi la strada come mi è capitato di fare in altre occasioni, realizzando script "chiusi", cioè che non potessero avere sviluppi o aggiunte senza essere stravolti o rifatti da 0.

    22/06/2026 - sihsandrea ha scritto:

    Ripeto, fai lavorare il server, così se domani abbandoni PHP e usi python, access o qualsiasi altra cosa, tu devi solo lanciare il comando eal resto ci pensa il database.

    Capisco questo tuo suggerimento, in effetti lasciar lavorare il server e quindi non far eseguire tanto codice dal client che richiede la pagina, è un vantaggio a favore dell'utenza del sito, sicuramente, tuttavia, dimmi se sbaglio, avverto che (mi riferisco a sihsandrea), non ami tanto PHP, mentre io non ho nessuna intenzione di abbandonarlo, perché sono e resto un dilettante, perché imparare un altro codice... anche no, visto il tempo che richiede e che fatico a ricavare, e perché il problema di imparare un altro linguaggio quando ancora conosco si e no il 10 % di PHP,  non me lo sono assolutamente posto.

      Buona giornata.

    Ps. Sempre Grazie, lo scambio di info e opinioni avuto fin qui e che spero possa continuare, si sta rivelando per me molto costruttivo e interessante, per cui ringrazio sihsandrea e tutta la comunità.

    Filippo P

  • 22/06/2026 - pierpippo ha scritto:

    Riguardo a sto punto, io come ho già scritto ho già una tabella chiamata gbga_scad_periodo:

    Che io ho ricavato da festività e.mesaa nella query di generazione calendario

    
        periodi AS (
        SELECT
            f1.nome,
            f1.data AS data_inizio,
            (
                SELECT MIN(f2.data)
                FROM festivita f2
                WHERE f2.nome = f1.nome
                  AND f2.tipo = 'fine'
                  AND f2.data > f1.data
            ) AS data_fine
        FROM festivita f1
        WHERE f1.tipo = 'inizio'
        )

    In questo punto metti i campi della tua tabella.

    22/06/2026 - pierpippo ha scritto:

    MariaDB [gbgarage_test]> SELECT * FROM gbgar_scad_periodo; +------+------------+------------+------------+------------+ | id | start_inv | end_inv | start_est | end_est | +------+------------+------------+------------+------------+ | 1 | 2025-09-15 | 2026-06-06 | 2026-06-07 | 2026-09-14 | +------+------------+------------+------------+------------+ 1 row in set (0,001 sec)

    I campi di questa tabella dovrebbero essere

    Id, descrizione, data inizio, data fine

    Usare 2 inizio e 2 fine serve a complicarsi la vita

    Dovresti avere un elenco di periodi con la descrizione del periodo

    Estate dal al

    Inverno dal.al

    Scolastico dal al

    Un elenco del tipo:

    1 dal1 al1 dal2 al2 ecc... Anche a vederlo da cruscotto non rende l'idea

    E l'orario scolastico?

    2 dal1 al1 null null?

    Aggiungi un campo descrizione e abolisci dal2 al2

    Poi sostituisci i nomi allo stralcio query che ho riportato.

    La.descrizione.anche in una combo (come stai usando) ti permette di selezionere.il.periodo come descrizione e lavorare sull'intervallo di date.

    22/06/2026 - pierpippo ha scritto:

    , avverto che (mi riferisco a sihsandrea), non ami tanto PHP,

    Ti sbagli,dico solo che se lavora il database non devi rifare tutto lato PHP, o altri linguaggi basta solo collegare al db e lanciare le query.

    Adoro Delphi ma lato db faccio lavorare il db, lato desktop lavora Delphi, lato web lavora PHP. Semplice!

  • 22/06/2026 - sihsandrea ha scritto:

    I campi di questa tabella dovrebbero essere

    Id, descrizione, data inizio, data fine

    Usare 2 inizio e 2 fine serve a complicarsi la vita

    Posso anche modificare la tabella in record separati ma poi mi tocca rielaborare anche lo script che va aggiorna le date del periodo invernale e estivo con un ciclo perchè quello che ho impostato ora lavora su un unico record, che è il motivo per cui ho fatto quella tabella gbgar_scad_periodo cosi come l'ho fatta.

    dovrei andare a rifare questo blocco php:

    <?php session_start();
    ...
    
    
       
          if($imposta_periodo === "on" || $imposta_periodo === "off"){
    
                //preparazione aggiornamento tabella sql "gbgar_scad_periodo"
                $fields = [];
                $params = [];
                $types = "";
    
                if(!empty("$inizio_invernale")){    
                $fields[] = "start_inv=?";
                $params[] = $inizio_invernale;
                $types .= "s";
                }
                if(!empty("$fine_invernale")){    
                $fields[] = "end_inv=?";
                $params[] = $fine_invernale;
                $types .= "s";
                }
                if(!empty("$inizio_estivo")){
                $fields[] = "start_est=?";
                $params[] = $inizio_estivo;
                $types .= "s";
                }
                if(!empty("$fine_estivo")){
                $fields[] = "end_est=?";
                $params[] = $fine_estivo;
                $types .= "s";
                }
                if(empty($fields)){
                    echo"<div class='risposta'>
                        Date periodicità orari non aggiornate. Restano valide quelle attualmente impostate
                </div>";
                //return;
                };
    
                $params[]= $id_scad_impostate;
                $types .= "i";
    
                $set = implode(",", $fields);
                $query_update = "UPDATE gbgar_scad_periodo SET $set WHERE id=?;";
                $stmt = $Conn->prepare($query_update);
                $stmt->bind_param($types, ...$params);
                if($stmt->execute()){
                    echo"<div class='risposta'>Date modificate con successo !</div>";
                    }else{echo"<div class='risposta'>Errore durante la modifica". $stmt->error ."</div>";
                }
            }if(!isset($imposta_periodo)){
                echo"<div class='risposta'>Le periodicità restano invariate</div>";
            }
    ...
    ?>    

    Questo blocco  fa parte di un file che a monte contiene un form che invia i dati allo stesso file che lo contiene. Compie di seguito la update riportata, sulla tabella gbgar_scad_periodo solo se viene attivato la check box che fa comparire anche il div, nel form, che contengono i campi in cui si inseriscono eventuali nuove date di scadenza.

    In caso contrario il file spedisce a se stesso solo il valore del campo data_servizio.

    poi ovviamente metto i valori in omonime variabili.

    Ovviamente faccio una select successiva alla tabella delle scadenze che tira su nuovi valori eventualmente aggiornati oppure quelli esistenti precedentemente.

    Tutti i valori poi sono inseriti nella variabile globale $SESSION che così mi trovo a disposizione anche nalla webapp-gest-servizi.php che compie le insert into/update/delete sulle tabelle gbgar_serv_master e gbgar_serv_detail.

    Cmq non riesco a definire un periodo scolastico e non scolastico.

    Il periodo puo essere solo invenale o estivo.

    In ogni giorno del periodo invernale ci sono delle corse scolastiche e non scolastiche.

    Se ad es le scuole di Forlì son chiuse per il. Patrono locale, nel nostro ambito le corse "scolastiche" vengono cmq eseguite. 

    CORSE tpl  scolastiche non sono servizi scuolabus. 

    Le Corse invernali feriali ma non scolastiche sono solo quelle in cui le lezioni sono ufficialmente sospese es: 23, 24,,27,28... dic (sempre che non coincidano con domenica) etc... 

    Quindi come faccio a definire un periodo scolastico oppure non scolastico? 

    Quindi nella tabella gbgar_corse ho il campo frequenza, perché per lo stesso giorno posso avere la corsa delle 6.30 della linea 159 che è scolastica, e nello stesso gg stessa linea ore 8.15 corsa feriale ma non scolastica. 

    Però effettivamente, si è anche sicuri che tolto il periodo estivo, natalizio e pasquale i giorni feriali son tutti anche scolastici.

    Quindi si mi conviene nella tabella gbgar_scad_periodi aggiungere 

    Sosp_scol_natale start/end e

    Sosp_scol_pasquale start/end. 

    Aggiungendo Il campo descrizione_periodo. 

    quindi si, santo cielo la query update attuale sulla tabella gbga_scad_periodi non funzionerà più e devo rifarla. 

    nell'orario estivo ovviamente questa variante non esiste.

    Ora scappo a fare dei servizi appunto

    Buona giornata

    Filippo P.

  • 23/06/2026 - pierpippo ha scritto:

    Questo blocco  fa parte di un file che a monte contiene un form che invia i dati allo stesso file che lo contiene.

    uhm.... compro una vocale!

    23/06/2026 - pierpippo ha scritto:

    Cmq non riesco a definire un periodo scolastico e non scolastico.

    Il periodo puo essere solo invenale o estivo.

    In ogni giorno del periodo invernale ci sono delle corse scolastiche e non scolastiche.

    Se ad es le scuole di Forlì son chiuse per il. Patrono locale, nel nostro ambito le corse "scolastiche" vengono cmq eseguite. 

    CORSE tpl  scolastiche non sono servizi scuolabus. 

    Le Corse invernali feriali ma non scolastiche sono solo quelle in cui le lezioni sono ufficialmente sospese es: 23, 24,,27,28... dic (sempre che non coincidano con domenica) etc... 

    Quindi come faccio a definire un periodo scolastico oppure non scolastico?

    per questo motivo la tabella festività (che puoi chiamare anche periodi_corse) è stata strutturata a sviluppo verticale.

    se devi aggiungere eccezioni puoi inserirli con la sua descrizione e inizio/fine (qui basta che aggiungi il campo descrizione alla tua tabella)

    in descrizione vacanze scolastiche avrai periodi configurati sulla tabella di configurazione di meno mezzi e frequenze ad orari ridotti (sarà vacanza per gli studenti ma non per i lavoratori). ti ho fornito una versione reale che usavo per programmare le corse di trasporto pazienti (ovviamente adattata: un paziente poteva saltare o anticipare o posticipare una seduta, un trasporto pubblico ha corse fissate e non modificabili all'ultimo minuto). 

    si dice che chi ben comincia è a metà dell'opera, con 4 query hai tutto il calendario per periodo, devi solo selezionare data inizio e data fine periodo per assegnare autisti e mezzi. puoi farlo settimanale, giornaliero mensile semestrale o dal al senza preoccuparti di altro.

  • 24/06/2026 - sihsandrea ha scritto:

    uhm.... compro una vocale!

    :-)

    ti incollo tutto lo script del file imposta_date.php mettendo dei commenti nei blocchi per aiutarti a  capire piu velocemente come è impostato questo script e come posso quindi reimpostare la query per aggiornare le date 

    (operazione che normalmente si fa durante il periodo estivo, quando si hanno le date ufficiali di inizio/fine anno scolastico, vacanze natalizie etc....

    <?php session_start();?> 
    
    <!DOCTYPE html>
    <html lang="it">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>input date</title>
        <link rel="stylesheet" href="../css/form-js.css">
        <link rel="stylesheet" href="../css/gest_database.css">
    </head>
    <body>
    
    <div class="titolo_pagina">IMPOSTA LA DATA</div>
        <div class="descrizione_pagina">Inserisci la data relativi ai servizi che andrai a inserire</div>
    
    //INIZIA IL FORM PER INSERIRE LE DATE DA AGGIORNARE
    
        <div class="form">
            <form action="" method="post">
                <div class="field">
                    <label for="imposta_periodo">Spunta se occorre aggiornare <br> le scadenze dei periodi</label>    
                    <input class="ck_box" type="checkbox" name="imposta_periodo" id="imposta_periodo">
                </div>
                <div class='hidden' id='periodo'>
                    <div class="field">
                    <label for="inizio_invernale">Inzio dell'orario invernale</label>
                    <input class='data_orario' type="date" name="start_inv">
                    </div>
                    <div class="field">
                    <label for="fine_invernale">Fine dell'orario invernale</label>
                    <input class='data_orario' type="date" name="end_inv">
                    </div>
                    <div class="field">
                    <label for="inizio_estivo">Inzio dell'orario estivo</label>
                    <input class='data_orario' type="date" name="start_est">
                    </div>
                    <div class="field">
                    <label for="inizio_estivo">Fine dell'orario estivo</label>
                    <input class='data_orario' type="date" name="end_est">
                    </div>
                    <div class="field">
                    <label for="inizio_natalizio">Inizio periodo natalizio</label>
                    <input class='data_orario' type="date" name="start_nat">
                    </div>
                    <div class="field">
                    <label for="fine_natalizio">Fine del periodo natalizio</label>
                    <input class='data_orario' type="date" name="end_nat">
                    </div>
                    <div class="field">
                    <label for="inizio_pasquale">Inizio periodo pasquale</label>
                    <input class='data_orario' type="date" name="start_pasq">
                    </div>
                    <div class="field">
                    <label for="fine_pasquale">Fine del periodo pasquale</label>
                    <input class='data_orario' type="date" name="end_pasq">
                    </div>
                </div>
                
       //questo div porta solo il campo per la data di riferimento, quella per cui verranno inviati e quindi assegnati i servizi. 
                <div class="field">
                    <label for="data">Inserisci data servizio</label>
                    <input type="date" name="data" id="data" required>
                    <input name="invia" type="submit" id="" value="Conferma">
                </div>
            </form>
    
    //SCRIPT JS per far comparire il div contenenti i campi del form necessari a aggiornare le date dei periodi. Queste quindi son date da aggiornare a comando non si possono pianificare.
            <script>
            const checkBox = document.getElementById('imposta_periodo');
            const scadenzeOrario = document.getElementById('periodo');
    
            checkBox.addEventListener('change', function(){
            const selected = this.checked;
    
            if(selected===false){
                scadenzeOrario.classList.add('hidden');
            }if(selected===true){
                scadenzeOrario.classList.remove('hidden');
            }
            });
        </script>
        </div>
    
        <?php 
    
            //connessione al database sql-----
            require_once('../database_connection.php');
            //Si include il file del formattatore per la data in formato italiano
            include'../partial/format-date.php';
            //--------------------------------
    // creo tutte le variabili con i dati in arrivo dal form
    
            $inizio_invernale = $_POST["start_inv"] ?? null;
            $fine_invernale = $_POST["end_inv"] ?? null;
            $inizio_estivo = $_POST["start_est"] ?? null;
            $fine_estivo = $_POST["end_est"] ?? null;
            $inizio_natalizio = $_POST["start_nat"] ?? null;
            $fine_natalizio = $_POST["end_nat"] ?? null;
            $inizio_pasquale = $_POST["start_pasq"] ?? null;
            $fine_pasquale = $_POST["end_pasq"] ?? null;
            $imposta_periodo = $_POST["imposta_periodo"] ?? null;
            
            //Questa variabile è l'unica che avrà sempre il valore (data), ed esso va a finire registrato nella tabella gbgar_serv_master e verrà aggiornato solo se dal form gest_servizi.php si torna al form imposta_date.php(questo file), altrimenti cliccando su ricarica form (gest_servizi) si può  inviare nuovi dati senza inserire nuovamente la data. 
           
            $data = $_POST["data"] ?? null;
            
            $id_p_invernale = 1;
            $id_p_estivo = 2;
            $id_p_natalizio = 3;
            $id_p_pasquale = 4;
        
    
    ECCO Questo è il blocco che farebbe la update sulla tabella periodi e  mi era stato suggerito, avendo i dati su un unico record di impostare una update in modo che la query lasciasse il valore precedente nelle colonne che eventulamente nn ricevessero un dato nuovo percè altrimenti la update avrebbe scritto un null. 
    Però ora ho 4 record con la nuova tabella
    Come la reimposto questa query adesso?
    In teoria mi vien da pensare che devo  fare 4 query (una per record), condizionate dalla consistenza (!empty) delle variabili che ho riportato sopra?
    
    il blocco che segue con la preparzione dei dati e la costruzione dinamica della update a sto punto non serve più ?
    
            if($imposta_periodo === "on" || $imposta_periodo === "off"){
    
                //preparazione aggiornamento tabella sql "gbgar_scad_periodo"
                $fields = [];
                $params = [];
                $types = "";
    
                if(!empty("$inizio_invernale")){    
                $fields[] = "start_inv=?";
                $params[] = $inizio_invernale;
                $types .= "s";
                }
                if(!empty("$fine_invernale")){    
                $fields[] = "end_inv=?";
                $params[] = $fine_invernale;
                $types .= "s";
                }
                if(!empty("$inizio_estivo")){
                $fields[] = "start_est=?";
                $params[] = $inizio_estivo;
                $types .= "s";
                }
                if(!empty("$fine_estivo")){
                $fields[] = "end_est=?";
                $params[] = $fine_estivo;
                $types .= "s";
                }
                if(empty($fields)){
                    echo"<div class='risposta'>
                        Date periodicità orari non aggiornate. Restano valide quelle attualmente impostate
                </div>";
                //return;
                };
    
                $params[]= $id_scad_impostate;
                $types .= "i";
    
                $set = implode(",", $fields);
                $query_update = "UPDATE gbgar_scad_periodo SET $set WHERE id=?;";
                $stmt = $Conn->prepare($query_update);
                $stmt->bind_param($types, ...$params);
                if($stmt->execute()){
                    echo"<div class='risposta'>Date modificate con successo !</div>";
                    }else{echo"<div class='risposta'>Errore durante la modifica". $stmt->error ."</div>";
                }
            }if(!isset($imposta_periodo)){
                echo"<div class='risposta'>Le periodicità restano invariate</div>";
            }    
        ?>
        
        <?php
       
        //Blocco per prelievo date periodi dal database
        /*Va be qua, anche se ovviamente sono da modificare la query SELECT e le variabili, 
        in concetto era che a prescindere dal fatto che a monte fosse avvenuta una update
        sulla tabella gbgar_scadenze_periodo, sulla stessa tabella cmq devono essere prelevati
        questi dati per essere messi sotto relative variabili e inseriti anche in $_SESSION 
        per rendere disponibili i valori nei file selezione_corse.php e webapp_gest_servizi.php*/
    
        $select_sql = "SELECT start_inv,end_inv,start_est,end_est  FROM gbgar_scad_periodo;";
    
        $risultato_select=$Conn->query($select_sql);
    	if($risultato_select == FALSE){
    	die("Errore nell'esecuzione della query: " . $select_sql);
    	}
    
        while($periodi=$risultato_select->fetch_assoc()){
            $inizio_invernale=$periodi["start_inv"];
            $fine_invernale=$periodi["end_inv"];
            $inizio_estivo=$periodi["start_est"];
            $fine_estivo=$periodi["end_est"];
        }
        ?>
    
        <?php
            //inseriamo nella variabile di sessione i valori delle date che arrivano dal form.
            $_SESSION['data'] = $data;
            $_SESSION['inizio_invernale'] = $inizio_invernale;
            $_SESSION['fine_invernale'] = $fine_invernale;
            $_SESSION['inizio_estivo'] = $inizio_estivo;
            $_SESSION['fine_estivo'] = $fine_estivo;
            
        ?>
    
    
    //Quello che segue qui invece serve solo a mostrare a browser le date in formato più facilmente leggibile
    
            <?php
        
            $data_inizio_inverno = new DateTime($inizio_invernale);
            $data_fine_inverno = new DateTime($fine_invernale);
            $data_inizio_estate = new DateTime($inizio_estivo);
            $data_fine_estate = new DateTime($fine_estivo);
            
    
            
            echo"
                <div class='risposta risp_var'>
                    L'orario invernale attuale è compreso tra il <span>".
                     $formatter->format($data_inizio_inverno) 
                     ."</span> e il <span>". 
                     $formatter->format($data_fine_inverno) ."</span> ;<br> 
                    L'orario estivo è compreso tra il <span>". 
                    $formatter->format($data_inizio_estate) ."</span>
                    e il <span>". 
                    $formatter->format($data_fine_estate) ."</span> .
                </div>
            ";
        ?>    
    
        <?php
            if(isset($data)){
            $data_grezza = new DateTime($data);}
    
            if(!empty ($_SESSION['data'])){
            echo "<div class='risposta'> OK ! I servizi che verranno registrati saranno riferiti alla data <br><b><u>" . $formatter->format($data_grezza) . 
            " ! </b></u>"; 
            echo"<br> Vai alla maschera di gestione servizi attraverso il link sottostante </div>";
            }
            else{echo"<div class='risposta'> Non hai ancora impostato la data dei servizi da assegnare!  </div>";}
        ?>
        <div class="bottone_new_srv">
            <a href="../gestione-servizi/form-gest_serv-dev.php">Vai alla maschera di gestione servizi</a>
        </div>
    </body>
    </html>

    Sistemato questo aspetto, poi torno a lavorare sul file selezione_corse per aggiungere tutta la questione legata alle domeniche festività fisse e variabili etcc...

    Un bel casino insomma.

    :-)

    Buona serata

  • La tabella dei periodi è del tipo

    Id.  Inizio.  Fine

    Oppure

    Id.  Inizioinv.  Fineinv.   Inizio estate.   Fine estate.  Ecc...

    Fammi sapere

  • 25/06/2026 - sihsandrea ha scritto:

    La tabella dei periodi è del tipo

    Id.  Inizio.  Fine

    La. Tabella, dopo  tuo suggerimento l'ho modificata, ora i campi sono

    id_periodo, descrizione, inizio, fine. 

    Grazie. 

Devi accedere o registrarti per scrivere nel forum
45 risposte