Visualizzazione risultati 1 fino 8 di 8

Discussione: Confronto Date PHP - MySQL

  1. #1
    Guest

    Predefinito Confronto Date PHP - MySQL

    Ciao a tutti, volevo un informazione riguardante il confronto di date con MySQL!
    In poche parole mi è stato chiesto di creare un piccolo form per un sito di prenotazioni di due appartamenti, se un cliente prenota dal 7 Luglio al 10 Luglio, ovviamente il risultato dovrebbe essere che se qualcun'altro prenotasse dal 3 Luglio al 18 Luglio, dovrebbe apparire qualcosa tipo "Spiacente, ma i giorni 7, 8, 9 e 10 Luglio sono già prenotati", questo magari per uno dei due appartamenti, mentre invece l'altro potrebbe risultare libero, spero di essere stato chiaro.
    Grazie anticipatamente.

  2. #2
    Guest

    Predefinito

    Ciao ti avevo risposto sta notte ma avevo sonno e avevo scritto delle cavolate, ahahahaha, non era preciso il codice c'era una logica sbagliata di possibile prenotazione oppure errore appartamento non disponibile, adesso invece sembra funzionare molto meglio.
    Io non sono un programmatore SQL quindi non ti posso aiutare per le tabelle e programmazione SQL, ho fatto tutto dal PHP partendo dal presupposto che in SQL ho una tabella con due ID uno per appartamento 1 ed uno per appartamento 2, data_inizio prenotazione(nel formato 01/01/0001)
    e data_fine prenotazione (nel formato 01/01/0001 d/m/Y) un utente inserirà nel form HTML in base all'appartamento scelto una data inizio prenotazione e data fine prenotazione, lo script PHP cosa fa?

    Fa una select delle date presenti in tabella(cioè prenotazioni avvenute in base all'ID appartamento scelto) e controlla in base ai mesi inseriti dall'utente e ai mesi presenti in tabella di avvenuta prenotazione la disponibilità dei giorni, o se si accavallano le prenotazioni etc...
    I controlli in questo script sono effettuati se l'utente inserisce il mese di inizio e di fine prenotazione coincidenti quindi prenoto dal 01/06/2015 al 10/06/2015 oppure se i mesi sono accavallati di un mese cioè prenoto dal 20/06/2015 al 30/07/2015
    NON CONTROLLA SE PRENOTO DAL 20/06/2015 al 10/08/2015 cioè per tutto luglio e un pò di giugno e Agosto, devi farlo tu, lì c'è da vedere perchè se uno prenota online per 4 mesi forse è il caso di mettere un controllo bloccare e fare una TELEFONATA così eviti i furbetti.
    Adesso io ho fatto un pò di controlli tu ovviamente devi studiarci di più e tutti i possibili casi però la logica è questa, cioè prendo la data di avvenuta prenotazione e quella di possibile prenotazione inserita dall'utente inserisco nel php dopo aver effettuato la select un ARRAY, ti serve un array(almeno io ho risolto così) ad ogni controllo possibile se va in KO inserisce il KO nell'ARRAY se invece non va in KO vuol dire che c'è disponibilità, alla fine della select e del fetch interrogo l'array se ci sono dei KO vuol dire che la prenotazione non è possibile perchè già prenotata se invece non entra mai nei KO vuol dire che i controlli sono andati bene.
    Per ogni controllo inserisco con array_push i possibili KO alla fine se il KO è presente nell'array allora vuol dire che i giorni non sono disponibili( if in_array KO allora devi cambiare il range di giorni)....Io l'ho risolta con questa logica.

    OVVIAMENTE DEVI FARE ANCHE ALTRI CONTROLLI....non è finito è una BOZZA, una brutta copia perchè devi anche valutare se non ci sono mesi prenotati in tabella....Comunque un modo per poterlo strutturare è questo sotto usando un array e valorizzando l'arrayin base ai possibili casi.
    Ho preparato in tabella tre prenotazioni avvenute:

    01/06/2015 10/06/2015
    11/06/2015 20/06/2015
    27/06/2015 05/07/2015

    L'utente invece sta inserendo dal form una prenotazione che va dal 02/06/2015 al 15/07/2015 ed ovviamente non può prenotare perchè quell'appartamento è occupato.

    Sotto il form....tu puoi farti una tabella inserisci le tue date nel formato giorno/mese/anno 01/01/0001 in numeri e provi lo script e te lo adatti come meglio credi....A me è venuto in mente di farlo così poi non so, forse altri hanno anche altre idee...Ciao spero ti sia utile

    ps:decommenta print_r($array) per vedere quando va in KO, non tenere in considerazione security_session e new connessione perchè non sono altro che il login al mio progetto personale e la classe che mi apre la connessione al mio DB, tu userai la tua connessione al DB.
    La select ovviamente la devi aggiornare con i dati della tua tabella e se vuoi inserire anche tutti e due gli appartamenti dovrai scriverla

    SELECT data_inizio,data_fine from TUATABELLAAPPARTAMENTI where IDAPPARTAMENTO IN (1,2)
    Ultima modifica di fractalcosmo : 21-06-2015 alle ore 17.32.55

  3. #3
    Guest

    Predefinito

    Codice PHP:


    error_reporting
    (E_ALL);
    security_session();
    $db = new connessione();
    $db = $db->apriConnessione();


    $dataPrenotazioneInizio = '02/06/2015';
    $dataPrenotazioneFine = '15/07/2015';

    //NOTA BENE DEVI CONTROLLARE ANCHE CHE LA DATA INIZIO PRENOTAZIONE SIA INFERIORE ALLA DATA FINE PRENOTAZIONE
    //IN QUESTO PUNTO...IO NON LO FACCIO ADESSO MA TU DEVI FARLO.

    $dataInseritaInizio = date_parse_from_format('d/m/Y',$dataPrenotazioneInizio);
    $dataInseritaFine = date_parse_from_format('d/m/Y',$dataPrenotazioneFine);

    $dataInseritaInizioGiorno = str_pad($dataInseritaInizio['day'], 2 , '0', STR_PAD_LEFT);
    $dataInseritaInizioMese = str_pad($dataInseritaInizio['month'], 2 , '0', STR_PAD_LEFT);
    $dataInseritaInizioAnno = str_pad($dataInseritaInizio['year'], 4 , '0', STR_PAD_LEFT);

    $dataInseritaFineGiorno = str_pad($dataInseritaFine['day'], 2 , '0', STR_PAD_LEFT);
    $dataInseritaFineMese = str_pad($dataInseritaFine['month'], 2 , '0', STR_PAD_LEFT);
    $dataInseritaFineAnno = str_pad($dataInseritaFine['year'], 4 , '0', STR_PAD_LEFT);

    $sql= $db->prepare('SELECT data_inizio,data_fine from TUATABELLAAPPARTAMENTI where IDAPPARTAMENTO = 1');

    $risultati = $sql->execute();

    $sql-> bind_result($data_inizio,$data_fine);


    $array=array();
    $ko1='';
    $ko2='';
    $ko3='';
    $ko4='';
    $ko5='';
    $ko6='';
    $ko7='';

    while (
    $sql -> fetch()){

    print
    '<br>' .$data_inizio .' ' .$data_fine ;

    $data_inizio = date_parse_from_format('d/m/Y',$data_inizio);
    $data_fine = date_parse_from_format('d/m/Y',$data_fine);

    $dataPrenotataInizioGiorno = str_pad($data_inizio['day'], 2 , '0', STR_PAD_LEFT);
    $dataPrenotataInizioMese = str_pad($data_inizio['month'], 2 , '0', STR_PAD_LEFT);
    $dataPrenotataInizioAnno = str_pad($data_inizio['year'], 4 , '0', STR_PAD_LEFT);

    $dataPrenotataFineGiorno = str_pad($data_fine['day'], 2 , '0', STR_PAD_LEFT);
    $dataPrenotataFineMese = str_pad($data_fine['month'], 2 , '0', STR_PAD_LEFT);
    $dataPrenotataFineAnno = str_pad($data_fine['year'], 4 , '0', STR_PAD_LEFT);

    //Controllo le prenotazioni fatte all'interno di un mese specifico quindi mese inserito inizio prenotazione e mese inserito fine prenotazione
    //coincidono
    if ($dataPrenotataInizioMese == $dataInseritaInizioMese
    && $dataInseritaInizioMese == $dataInseritaFineMese
    && $dataInseritaInizioAnno == $dataPrenotataInizioAnno){


    if (
    $dataInseritaInizioGiorno > $dataPrenotataInizioGiorno && $dataInseritaFineGiorno < $dataPrenotataFineGiorno){
    $ko1='ko1';
    $array[]=array_push($array,$ko1);
    }
    elseif (
    $dataInseritaInizioGiorno < $dataPrenotataInizioGiorno && $dataInseritaFineGiorno > $dataPrenotataInizioGiorno){
    $ko2='ko2';
    $array[]=array_push($array,$ko2);
    }
    elseif (
    $dataInseritaInizioGiorno < $dataPrenotataFineGiorno && $dataInseritaFineGiorno > $dataPrenotataFineGiorno ){
    $ko3='ko3';
    $array[]=array_push($array,$ko3);
    }
    }
    //Controllo la disponibilità se una persona prenota a cavallo del mese successivo esempio dal 20/06/2015 al 10/07/2015
    //quindi mese inizio prenotazione e mese fine prenotazione non coincidono e l'appartamento è occupato esempio dal 25/06/2015 al 04/07/2015
    if($dataPrenotataInizioMese == $dataInseritaInizioMese
    && $dataPrenotataFineMese == $dataInseritaFineMese
    && $dataInseritaInizioMese != $dataInseritaFineMese
    && $dataInseritaInizioAnno == $dataPrenotataInizioAnno){

    if (
    $dataInseritaInizioGiorno > $dataPrenotataInizioGiorno
    && $dataPrenotataInizioMese == $dataInseritaInizioMese
    && $dataInseritaFineGiorno < $dataPrenotataFineGiorno
    && $dataPrenotataFineMese == $dataInseritaFineMese){

    $ko4='ko4';
    $array[]=array_push($array,$ko4);

    }
    elseif (
    $dataInseritaInizioGiorno < $dataPrenotataInizioGiorno
    && $dataPrenotataInizioMese == $dataInseritaInizioMese
    && $dataInseritaFineGiorno < $dataPrenotataFineGiorno
    && $dataPrenotataFineMese == $dataInseritaFineMese){

    $ko5='ko5';
    $array[]=array_push($array,$ko5);

    }
    elseif (
    $dataInseritaInizioGiorno > $dataPrenotataInizioGiorno
    && $dataPrenotataInizioMese == $dataInseritaInizioMese
    && $dataInseritaFineGiorno > $dataPrenotataFineGiorno
    && $dataPrenotataFineMese == $dataInseritaFineMese){

    $ko6='ko6';
    $array[]=array_push($array,$ko6);
    }
    elseif (
    $dataInseritaInizioGiorno < $dataPrenotataInizioGiorno
    && $dataPrenotataInizioMese == $dataInseritaInizioMese
    && $dataInseritaFineGiorno > $dataPrenotataFineGiorno
    && $dataPrenotataFineMese == $dataInseritaFineMese){

    $ko7='ko7';
    $array[]=array_push($array,$ko7);

    }
    }
    }

    if (
    in_array($ko1, $array) || in_array($ko2,$array)|| in_array($ko3,$array) ||
    in_array($ko4, $array) || in_array($ko5,$array)|| in_array($ko6,$array) || in_array($ko7, $array)){
    print
    '<br>'.'Camera non disponibe';
    }
    else{
    print
    "<br>Giorni liberi procedi la prenotazione clicca qui crea bottone e insert in tabella di nuova prenotazione<br>";
    }

    //print_r($array);
    ps:Non controlla se inserisci una prenotazione da Maggio perchè in tabella le prenotazioni iniziano a Giugno e fa i controlli comparando i mesi di inizio e fine prenotazione mese inizio Maggio in tabella non c'è quindi non entra nei controlli per controllare anche se il mese inserito non c'è in tabella dovrai crearti il caso specifico ed il relativo controllo però devi anche tener conto dei giorni potresti fare così inserisci ko8


    Vuol dire la data di prenotazione fine mese esiste in tabella ma non c'è la data prenotazione del mese di inizio vuol dire rientriamo nel caso che le prenotazioni in tabella partono da Giugno arrivo io e prenoto da Maggio a Giugno, devi aggiornare lo script...Lo stesso per i mesi sucessivi...Non è difficile devi solo tenere in considerazione i possibili casi, fatti uno schema di controlli e poi li vai a gestire in PHP valorizzando l'array....È una soluzione...Non è una cosa che si fa in un giorno spero ti faccia pagare per questa funzionalità....Ciao ;)
    Codice PHP:
    if ($dataPrenotataInizioMese != $dataInseritaInizioMese && $dataPrenotataFineMese == $dataInseritaFineMese){
    $ko8='ko8';
    $array[]=array_push($array,$ko8);

    }
    Usa <= o >= io ho messo solo minore o maggiore ma se uno prenota negli stessi giorni presenti in tabella non entra nei controlli quindi devi mettere <= o >= ......Se c'è un'orario di entrata in appartamento e uscita appartamento allora dovrai usare anche le ore....Un form di prenotazione ci sono un sacco di controlli.Ciao
    Ultima modifica di fractalcosmo : 21-06-2015 alle ore 17.57.48

  4. #4
    Guest

    Predefinito

    Effettivamente con il date_parse_from_format probabilmente puoi anche comparare i casi senza specificare i giorni e i mesi, perchè dovrebbe farlo il parse in automatico nel senso invece che fare le differenzazioni per giorni e mesi baserebbe fare così..Ed è meno rognoso, però ovviamente c'è da testare tutti i casi e tutti i possibili accavallamenti di date di prenotazioni e inserite...Comunque la logica è sempre la stessa controllo le date e inserisco nell'array i possibili errori e alla fine interrogo l'array...Ciao

    Ps:Qualcuno ha altre soluzioni?Sarebbe interessante vederle, a me è venuto in mente così....

    Codice PHP:
    if ($dataInseritaInizio > $data_inizio && $dataInseritaFine < $data_fine){
    $ko1='ko1';
    $array[]=array_push($array,$ko1);
    }
    if (
    $dataInseritaInizio > $data_inizio && $dataInseritaFine > $data_fine){
    $ko1='ko2';
    $array[]=array_push($array,$ko2);
    }
    if (
    $dataInseritaInizio < $data_inizio && $dataInseritaFine > $data_fine){
    $ko1='ko3';
    $array[]=array_push($array,$ko3);
    }
    Ultima modifica di fractalcosmo : 21-06-2015 alle ore 18.13.14

  5. #5
    Guest

    Predefinito

    Mi è venuta un'altra idea..... :)
    I controlli lato server ed inserire i KO nell'array può effettivamente essere una soluzione, però ovviamente c'è da guardare tutti i controlli etc...etc...
    Però con JQUERY , ecco l'utilità della liberia javascript, potresti fare una cosa più carina e meno rognosa, jquery ha un datepicker, cioè il calendario, tu imponi all'utente di inserire la data dal calendario(ovviamente non può scrivere nella input della data, appena clicca nella input si apre il calendario datepicker e può selezionare le date solo dal calendario), prima di mostrare il calendario con jquery tu puoi disabilitare determinate date, fai la select dal DB e ricavi le date e poi le deselezioni nel datepicker, questo metodo è usato in alcuni web di prenotazione...In questo modo a te non rimane altro che recuperare le date inserite nel DB e deselezionare il range compreso...Il gioco è fatto...È molto meno rognoso, ti posto un link dove puoi dare un'occhiata alla logica...Ciao buona settimana e buona programmazione.


    http://stackoverflow.com/questions/9...e-not-from-arr

  6. #6
    Guest

    Predefinito

    Ciao fractalcosmo, grazie di vero cuore per la disponiblità che hai avuto nel darmi una soluzione al mio problema, anche perchè anch'io devo programmare lo script in php prelevando i valori da un database mysql, e quindi non interamente in sql.
    Volevo chiederti, hai facebook? Così possiamo parlare in tempo reale, vorrei esporti quello che voglio fare in modo dettagliato così da trovare insieme la soluzione, prendendo anche la tua in considerazione, ma prima di procedere vorrei comunque poter mostrare o esporre in modo più accurato come ho impostato il database etc etc.
    Se per te non è un problema, spero mi farai questo grande favore come già hai fatto nei post precedenti, grazie ancora per tutto.
    Ultima modifica di robertolancella : 23-06-2015 alle ore 00.12.20

  7. #7
    Guest

    Predefinito

    Ciao Roberto, ehh però io non sono molto su FB calcola che lavoro tutto il giorno, rientro esco con il cane, cucino, mangio la sera esco di nuovo con il cane, letto e il giorno dopo lavoro, sono appena rientrato dalla passeggiata prima di andare a dormire, non ho tempo su Fb, accendo il computer ma sono in giro per casa, oppure rimane acceso mentre sono fuori con il cane la sera...Cmq se vai sul mio sito fractalcosmo.com trovi il link per FB ma se vuoi possiamo mandarci delle email, sarebbe meglio così quando posso do un'occhiata e ti rispondo.Al lavoro ovviamente non mi connetto su FB anche se non mi direbbero niente però non mi connetto.Se vuoi comunque un'opinione ti rispondo volentieri via email...Mi piace programmare e mi ritengo fortunato di essere su un progetto sviluppato in PHP a lavoro quindi non c'è problema però FB rimane aperta la pagina ma non lo uso molto, non rompo le scatole nemmeno alle donne :)))

  8. #8
    Guest

    Predefinito

    Figurati non ti preoccupare, ti capisco, magari intanto ti espongo il problema o qui o su fb e poi appena puoi mi rispondi.
    Mi farebbe davvero piacere trovare magari la soluzione, sei davvero molto disponibile nonostante sei pieno di impegni, grazie davvero.
    Ora ti aggiungo :)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •