Determinazione data

di pierpippo il
76 risposte

76 Risposte - Pagina 6

  • Ni,

    la query funziona in sql ma portata in php ancora no.

    sto cercando di capire perchè ma credo che il problema sia di come va scritto esattamente il parametro @giorno_servizio, 

    pensavo di sostituirla con "?" visto che poi con bind_param('s',$fata_servizio) viene sostituito dal valore di $data_servizio, ma sicuro ho capito ancora una volta male qualche cosa

    Ti giro lo script:

    <?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>Script per selezione corse</title>
    </head>
    <body>
    <!-- Questo script sostituisce il file precedente selezionando le corse usando una struttara sql
    tale da sostituire e alleggerire il codice php-->
    
    <?php
    //serve solo questa variabile php, il resto lo fa totalmente sql.
    $data_servizio = $_SESSION['data'];
    
    //echo $data_servizio;
    
    $sql="WITH parametri as (
            SELECT CAST(? AS DATE) AS data_servizio
            ),
    
            -- Mappatura dinamica di tutte i periodi validi per il giorno di servizio
    
            periodo AS (
            SELECT
            descrizione_periodo,
            CASE descrizione_periodo
                    WHEN 'periodo_pasquale'   THEN 'pasquale'
                    WHEN 'periodo_natalizio'  THEN 'natalizio'
                    WHEN 'periodo_estivo'     THEN 'estivo'
                    WHEN 'periodo_invernale'  THEN 'invernale'
            END AS periodo
            FROM gbgar_periodi gp
            CROSS JOIN parametri x
            WHERE x.data_servizio BETWEEN gp.data_inizio AND gp.data_fine
            ORDER BY
            CASE descrizione_periodo
                    WHEN 'periodo_pasquale'   THEN 1
                    WHEN 'periodo_natalizio'  THEN 2
                    WHEN 'periodo_estivo'     THEN 3
                    WHEN 'periodo_invernale'  THEN 4
                    ELSE 99
            END
            LIMIT 1
            ),
    
            -- Mappatura dinamica di tutte le frequenze valide per il giorno di servizio
    
            giorno_frequenze AS (
    
            SELECT 'giornaliera' AS frequenza -- Valida sempre, per qualsiasi giorno
    
            UNION ALL
    
            SELECT
            CASE 
            -- SE È FESTIVO (Domenica o Tabella Festività)
                    WHEN DAYOFWEEK(x.data_servizio) = 1
                    OR EXISTS (SELECT 1 FROM gbgar_festivita f WHERE f.GIORNO = x.data_servizio)
                    THEN 'festiva'
            
            -- SE È SABATO
                    WHEN DAYOFWEEK(x.data_servizio) = 7 
                    THEN 'sabato'
            
            -- SE È LUNEDÌ-VENERDÌ
                    ELSE 'feriale'
            END AS frequenza
            
    
            UNION ALL
    
            -- Aggiungiamo le frequenze specifiche richieste per il periodo invernale scolastico
            SELECT 'scolastica' AS frequenza WHERE DAYOFWEEK(x.data_servizio) BETWEEN 2 AND 7
    
            UNION ALL
    
            SELECT 'sab-scol' AS frequenza WHERE DAYOFWEEK(x.data_servizio) = 7
    
            UNION ALL
    
            SELECT 'lun-ven-scol' AS frequenza WHERE DAYOFWEEK(x.data_servizio) BETWEEN 2 AND 6
    
            UNION ALL
            SELECT 'sab-scol' AS frequenza 
            WHERE DAYOFWEEK(x.data_servizio) BETWEEN 2 AND 6
            )
            SELECT
            c.ID_CORSA,
            tm.TABELLA AS ID_TM,
            c.LINEA,
            ic.UBICAZIONE AS PARTENZA,
            c.ORARIO_CORSA,
            fc.UBICAZIONE AS ARRIVO,
            c.FINE_CORSA,
            c.KM,
            p.periodo,
            tm.FREQUENZA AS frequenza_tabella
    
            FROM gbgar_corse c
            INNER JOIN gbgar_fermate ic   ON c.PARTENZA = ic.ID_FERMATA
            INNER JOIN gbgar_fermate fc   ON c.ARRIVO = fc.ID_FERMATA
            INNER JOIN gbgar_tab_marcia tm ON tm.ID_TM = c.ID_TM    
            CROSS JOIN periodo p
            INNER JOIN giorno_frequenze gf ON tm.FREQUENZA = gf.frequenza
            WHERE
            tm.PERIODO = p.periodo
            AND NOT EXISTS(
            SELECT 1 FROM gbgar_serv_master m
            JOIN gbgar_serv_detail d ON m.id_master=d.id_master
            WHERE d.id_corsa=c.id_corsa
            AND m.data=?)
            ORDER BY
            c.ORARIO_CORSA;
    ";
    
    $stmt = $Conn->prepare($sql);
    
    if (!$stmt) {
            die("Errore prepare: " . $Conn->error);
    }
    
    $stmt->bind_param("s", $data_servizio);
    
    $stmt->execute();
    
    $corse_da_svolgere = $stmt->get_result();
    
    $stmt->close();
    
    ?>
    </body>
    </html>
    //il prelievo nel ciclo while qua nn serve, è già nel codice del form.

    Sto cercando di individuare l'errore. cosi com'è la pagina del form è vuota e nn appare giustamente il  form, in quanto il file che contiene questo script è incluso nell file del form stesso.

    Sempre grazie 

    Filippo P.

  • Ora posso dire di aver risolto.

    Direi che si può chiudere questo thread.

    Le correzioni da fare erano queste:

    prima di tutto nella CTE "giorno_frequenza", per ognuna delle select unite, mancava il riferimento a parametri (FROM parametri x), per dare modo alle varie select di leggere x.data_servizio.

    Poi, siccome ho anche usato due volte il segnaposto ? , di cui l'ultima nella "not exists" finale,  
    mi son dimenticato che in bind_param occorrevano due stringhe ("ss",$data_servizio,$data_servizio).

    Ora ho potuto sostituire il contenuto del vecchio file select_corse.php con quello aggiornato .

    Resta solo di aggiornare tutta la documentazione sul progetto per consolidare le nuove conoscenze acquisite.

    Mi son davvero divertito un sacco e mi sono reso conto, che prima di php, sul quale mi ero concentrato, sarebbe stato meglio approfondire, e non di poco, le conoscenza su sql. 

    Grazie davvero tanto per il supporto avuto in questo forum.

    Filippo.

Devi accedere o registrarti per scrivere nel forum
76 risposte