- Home
- Categorie
- Coding e Sistemistica
- PHP
- Creare tot record da un invio di un range di date
-
Creare tot record da un invio di un range di date
Salve a tutti
devo creare la gestione di uno stop booking di hotel per un mio sito
Volevo creare un pannello di controllo dove selezionavo l'hotel, creavo un campo di testo per la data di inizio ed un campo di testo per la data di fine
Supponiamo che l'hotel è al completo dal 2 al 6 giugno, io vorrei riempire un unico modulo e quindi settare 2 giugno sul primo campo e 6 giugno sul secondo campo.
Premendo invio vorrei inserire nel database le 5 date, 1 per ogni record e quindi qualcosa tipo:
id_hotel: 2 - data_chiusa: 2019-06-02
id_hotel: 2 - data_chiusa: 2019-06-03
id_hotel: 2 - data_chiusa: 2019-06-04
id_hotel: 2 - data_chiusa: 2019-06-05
id_hotel: 2 - data_chiusa: 2019-06-06Qualcuno potrebbe farmi un esempio di come inserire ogni giorno di questi nel database?
Grazie
-
Ciao ti spiego in breve come gestisco la cosa nei piccoli booking engine che ho realizzato per i miei clienti.
Quando aggiungo una camera, inserisco un nuovo record nella tabella camere e 365 record nella tabella prezzi (ciascuno dei quali mi rappresenta un giorno dell'anno a partire dalla data corrente).
La tabella prezzi contiene i seguenti campi (in realtà ne contiene di più ma è per semplificare):
- un campo id_camera come chiave esterna, legato alla tabella camere
- un campo di tipo DATE per la data
- un campo di tipo INT per la disponibilità
- un campo di tipo DOUBLE per il prezzo
Quando devo chiudere la disponibilità, imposto a 0 il campo disponibilita per il periodo di date che mi interessa
Prendendo le date del tuo esempio avrò la seguente query
UPDATE camere SET disponibilita = 0 WHERE data >= '2019-06-02' AND data <= '2019-06-06'
Per inserire i 365 record nella tabella prezzi quando crei la camera, potresti usare la classe DateTime, dai un'occhiata a questo codice che ho appena pubblicato su Pastebin pastebin.com/wCuUiLPp
Spero ti abbia chiarito un pò le idee
-
Ciao, non è proprio quello che cercavo, ho risolto con un ciclo for.
A me non è un vero e proprio booking engine, mostra solo la disponibilità delle strutture.In ogni caso ho risolto cosi':
[php]
$inizio_stop = $_POST['inizio_stop'];
$fine_stop = $_POST['fine_stop'];//converto le date per inserirle nel formato americano nel database
function convertiData($dataEur){
$rsl = explode ('/',$dataEur);
$rsl = array_reverse($rsl);
return implode($rsl,'-');
}
$inizio_stop=convertiData("$inizio_stop");
$fine_stop=convertiData("$fine_stop");
for ($data_chiusa= $inizio_stop; $data_chiusa <=$fine_stop ; $data_chiusa++) {
$sql = "insert into stop_booking
(id_stop, id_hotel, data_chiusa, data_chiusura)
values
(NULL,"$id_hotel","$data_chiusa",NOW())";
$risultato = @mysql_query($sql) or die (mysql_errno() . ": " . mysql_error());
}
[/php]
-
Adesso pero' ho un problema.
La gestione dello stop booking è ok, fa quello che deve fare a livello di database.Adesso dovrei associarlo alla query che mostra i miei risultati e quindi scartare gli hotels (id_hotel) e le date (data_chiusa) .
Una volta riempito il modulo di ricerca, quando si arriva sulla pagina cerca.php, che condizione devo dare alla query di ricerca?
Presumo che devo estrarre cmq tutti i record presenti nella tabella stop_booking, giusto?
Al momento ho questa query per la ricerca:
[php]
$query="select offerte.id_offerta, DATE_FORMAT(offerte.valida_da, '%d/%m/%Y') AS valida_da_ita, DATE_FORMAT(offerte.valida_fino, '%d/%m/%Y') AS valida_fino_ita, offerte.tipo_offerta, offerte.prezzo, offerte.prezzo_hotel, offerte.prezzo_come, offerte.trattamento, offerte.note_offerta, offerte.tipo_camera, offerte.id_albergo, offerte.incluso, offerte.supplementi_riduzioni, offerte.operativo, offerte.applica_sconto, offerte.supplemento_singola, offerte.supplemento_singola_come, offerte.terzo_letto_bambino, offerte.eta_bambini, offerte.quarto_letto_bambino, eta_quarto_letto_bambino, eta_quarto_letto_bambino_piccolo, offerte.terzo_letto_adulto, offerte.commissione_manuale, offerte.paga_in_loco, hotel.id_hotel, hotel.hotel, hotel.tipologia, hotel.stelle, hotel.zona, hotel.directory, hotel.consigliato, hotel.family, hotel.lusso, hotel.mostra_scheda from offerte INNER JOIN hotel ON offerte.id_albergo = hotel.id_hotel where attivo="1" and cancellata="0" and "$arrivo" between DATE_ADD(valida_da, INTERVAL -0 DAY) AND valida_fino and DATE_ADD(STR_TO_DATE('$arrivo', '%Y-%m-%d'), INTERVAL +0 DAY) <= valida_fino ";
[/php]
Cosa dovrei aggiungere?
-
Scusa se sono diretto ma quel codice non si può proprio vedere...
Usi ancora le funzioni native di MySQL, dovresti passare a PDO o quantomeno a mysqli. La query dell'ultimo post poi è illeggibile almeno indentala un pò, e usa il maiuscolo per le parole chiave (SELECT, FROM, AND, etc...).
Bisognerebbe capire come hai costruito il design del DB, tabelle, campi, relazioni, chiavi esterne, indici. Così è veramente difficile darti una mano.
-
Si lo so, ma utilizzo ancora php 5 ed andare a cambiare tutto adesso è un casino.
Dovrei lavorarci in locale piano piano per poi andare online.
PDO poi non lo conosco, dovrei aggiornarmi un po'Cmq ho queste tabelle
tabella offerte:
CREATE TABLE IF NOT EXISTS `offerte` ( `id_offerta` int(6) NOT NULL AUTO_INCREMENT, `valida_da` date NOT NULL, `valida_fino` date NOT NULL, `tipo_offerta` int(1) NOT NULL, `citta` int(11) NOT NULL, `prezzo` float NOT NULL, `prezzo_hotel` float NOT NULL, `prezzo_come` int(2) NOT NULL, `trattamento` int(1) NOT NULL, `note_offerta` varchar(150) CHARACTER SET utf8 NOT NULL, `tipo_camera` varchar(150) CHARACTER SET utf8 NOT NULL, `id_albergo` int(5) NOT NULL, `supplementi_riduzioni` text CHARACTER SET utf8 NOT NULL, `incluso` text CHARACTER SET utf8 NOT NULL, `operativo` varchar(250) COLLATE utf8_unicode_ci NOT NULL, `allotment` float NOT NULL, `scadenza_allotment` varchar(2) COLLATE utf8_unicode_ci NOT NULL, `applica_sconto` int(1) NOT NULL DEFAULT '2', `cancellata` int(1) NOT NULL, `supplemento_singola` float NOT NULL DEFAULT '0', `supplemento_singola_come` int(1) NOT NULL, `terzo_letto_bambino` float NOT NULL DEFAULT '100', `eta_bambini` varchar(30) COLLATE utf8_unicode_ci NOT NULL DEFAULT '2-12 anni (non compiuti)', `terzo_letto_adulto` float NOT NULL, `quarto_letto_bambino` float NOT NULL, `eta_quarto_letto_bambino` varchar(30) COLLATE utf8_unicode_ci NOT NULL, `eta_quarto_letto_bambino_piccolo` varchar(30) COLLATE utf8_unicode_ci NOT NULL, `festivita` int(2) NOT NULL, `commissione_manuale` float NOT NULL, `paga_in_loco` int(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id_offerta`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=673 ;
tabella stop_booking
CREATE TABLE IF NOT EXISTS `stop_booking` ( `id_stop` int(5) NOT NULL AUTO_INCREMENT, `id_hotel` int(3) NOT NULL, `data_chiusa` date NOT NULL, `data_chiusura` datetime NOT NULL, `stop_attivo` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id_stop`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
Poi ho la tabella hotel dove inserisco le informazioni sugli hotels e da dove prendo il famoso id_hotel per associare offerte e stop booking
-
Ciao,
di male in peggio
Usi ancora MyISAM, passa a InnoDB! Così puoi usare le chiavi esterne. Se non le conosci it.wikipedia.org/wiki/Chiave_esterna
Mi fermo qua e provo a risponderti
Adesso dovrei associarlo alla query che mostra i miei risultati e quindi scartare gli hotels (id_hotel) e le date (data_chiusa) .
Dovresti utilizzare WHERE NOT IN.
Provo a semplificare con un esempio tra 2 insiemi:
- Insieme A (tutti gli hotel)
- Insieme B (hotel non disponibili in alcune date)
La query risultante sarà del tipo
SELECT id FROM A WHERE id NOT IN ( SELECT id_A FROM B WHERE data = :qualcosa )
Spero di aver capito quello che vuoi fare e di essermi fatto capire
-
provo a seguire questa strada sperando di riuscirci
grazie