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.