Problema query controllo date

di il
2 risposte

Problema query controllo date

Ciao a tutti

sto realizzando un sito per un b&b di 3 camere.... ho fatto tutto ma sono fermo a un problema alquanto strano...
la logica è questa: tramite questa query

"SELECT * FROM prenotazioni WHERE Archiviata='NO' AND (DataArrivo BETWEEN '$dac' AND '$dpc') || (DataPartenza BETWEEN '$dac' AND '$dpc')";
controllo se ci sono prenotazioni esistenti nel DB (dove $dac e $dpc sono rispettivamente data di arrivo e data di partenza inserite dall' utente). Se ci sono prenotazioni esistenti, controllo quante camere sono rimaste disponibili attraverso un ulteriore query di count e comunico le camere disponibili all' utente, altrimenti se non ci sono prenotazioni ho 3 camere disponibili.


Nella tabella prenotazioni ho inserito una prenotazione fittizia...

Data Arrivo Data Partenza
2014-07-03 2014-07-07

Iniziamo il controllo (articolo le prove con i numeri)

1 - inserisco data arrivo=2014-07-01 data partenza=2014-07-02 -----> la prenotazione non esiste (la query è OK)
2 - inserisco data arrivo=2014-07-02 data partenza=2014-07-03 -----> la prenotazione esiste(la query è OK)
3 - inserisco data arrivo=2014-07-03 data partenza=2014-07-04 -----> la prenotazione esiste(la query è OK)
4 - inserisco data arrivo=2014-07-04 data partenza=2014-07-05 -----> la prenotazione non esiste(invece ESISTE, ma non la intercetta)
5 - inserisco data arrivo=2014-07-05 data partenza=2014-07-06 -----> la prenotazione esiste(la query è OK)
6 - inserisco data arrivo=2014-07-06 data partenza=2014-07-07 -----> la prenotazione esiste(la query è OK)

La query quindi funziona in tutti i casi tranne che nel caso numero 4...... come mai? e poi perché nel caso numero 5 funziona?? (non dovrebbe funzionare visto che la casistica è uguale al caso numero 4 [la differenza è sempre di un giorno]).... a questo punto cosa potrebbe essere???


grazie in anticipo a chi mi aiuterà....

2 Risposte

  • Re: Problema query controllo date

    Ciao, intanto una domanda :
    - come hai definito i campi delle date: date o varchar2 ?
  • Re: Problema query controllo date

    Beh il problema della query numero 4 è il seguente:
    tu hai come DataArrivo il 3 luglio, ed è falso che 3 luglio è "between 4 luglio AND 5 luglio". Lo stesso vale per il campo DataPartenza. Il punto è che lo stesso discorso vale anche per la query numero 5, per cui ci sarà qualche altro errore altrove (ho anche provato la stessa query con gli stessi dati sul mio pc, ed effettivamente non restituisce alcuna prenotazione). Quindi dovresti fare al contrario, ovvero controllare se $dac e $dpc rientrano all'interno di una prenotazione:
    
    SELECT * FROM prenotazioni WHERE archiviata = 'NO' AND (($dac BETWEEN DataArrivo and DataPartenza) || ($dpc BETWEEN DataArrivo and DataPartenza));
    
    Inoltre attenzione perché un utente malintenzionato potrebbe fare della SQLinjection se non filtri l'input o non usi i prepared statements!
Devi accedere o registrarti per scrivere nel forum
2 risposte