• Super User

    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-06

    Qualcuno potrebbe farmi un esempio di come inserire ogni giorno di questi nel database?

    Grazie


  • User Attivo

    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 🙂


  • Super User

    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]


  • Super User

    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?


  • User Attivo

    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 :rollo: 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.


  • Super User

    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


  • User Attivo

    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 🙂


  • Super User

    provo a seguire questa strada sperando di riuscirci 🙂
    grazie