Visualizzazione risultati 1 fino 13 di 13

Discussione: [mysql] errore sintassi in query per effettuare prenotazioni

  1. #1
    Guest

    Predefinito [mysql] errore sintassi in query per effettuare prenotazioni

    Ciao ragazzi, devo scrivere una query per controllare la disponibilità di una casa in delle date passate in input: in questo db ci sono due tabelle, case e prenotazioni: la tabella prenotazioni è cosi composta:

    `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
    `emailUtente` INT( 11 ) NOT NULL ,
    `id_casa` INT( 11 ) NOT NULL ,
    `commento_rilasciato` VARCHAR( 255 ) NOT NULL ,
    `dataCheckin` date NOT NULL ,
    `dataCheckout` date NOT NULL ,
    PRIMARY KEY ( `id` )

    La query che uso è la seguente:

    Codice PHP:
    $queryRicerca = "SET @inizioPeriodo = '{$_SESSION['dataArrivo']}';
    SET @finePeriodo = '
    {$_SESSION['dataPartenza']}';
    SELECT * FROM archivioCase c
    WHERE luogo='
    $luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni'
    AND NOT EXISTS(SELECT * FROM prenotazioni p WHERE p.idCasa = c.id AND p.dataCheckin<@finePeriodo AND @inizioPeriodo < p.dataCheckout)"
    ;
    Sul browser esce questo errore:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM archivioCase c WHERE luogo='milano' AND maxOspiti>='2' AND' at line 2
    a cosa è dovuto? Grazie
    Ultima modifica di dreadnaut : 17-11-2012 alle ore 21.50.54 Motivo: + tag [php]

  2. #2
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Non fai prima a passare le variabili direttamente in PHP come hai fatto con le altre?
    Codice PHP:
    $queryRicerca = "SELECT * FROM archivioCase c
    WHERE luogo='
    $luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni'
    AND NOT EXISTS(SELECT * FROM prenotazioni p WHERE p.idCasa = c.id AND p.dataCheckin<
    {$_SESSION['dataPartenza']} AND {$_SESSION['dataArrivo']} < p.dataCheckout)";
    Ultima modifica di dreadnaut : 17-11-2012 alle ore 21.51.04
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  3. #3
    Guest

    Predefinito

    Io pure la vedo come Luffio passerei come PHP il recupero dei dati dalla sessione

    Codice PHP:
    $inizioperiodo = $_SESSION['dataArrivo'];
    $fineperiodo = $_SESSION['dataPartenza'];

    $queRicerca = "SELECT * FROM archivioCase C WHERE Luogo='$luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni'
    AND NOT EXISTS (SELECT * FROM prenotazioni p WHERE p.idCasa = c.id AND p.dataCheckin<'
    $fineperiodo' AND '$inizioperiodo' < p.dataCheckout)";
    Però c'è ancora qualcosa che non mi convince sulla punteggiatura\parentesi
    Ultima modifica di dreadnaut : 17-11-2012 alle ore 21.51.14

  4. #4
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Citazione Originalmente inviato da gdrlosangeles Visualizza messaggio
    Però c'è ancora qualcosa che non mi convince sulla punteggiatura\parentesi
    Scusa in che senso? A me pare corretta, la sua query
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  5. #5
    Guest

    Predefinito

    Ciao ragazzi grazie per le risposte, ho fatto come avete suggerito, mettendo le date direttamente nella query, che ho leggermente modificato:
    Codice:
    	$queryRicerca = "SELECT * FROM archivioCase c
    				  WHERE luogo='$luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni'
    				  AND NOT EXISTS(SELECT * FROM prenotazioni WHERE id_casa = c.id AND dataCheckin<'{$_SESSION['dataArrivo']}' AND dataCheckout>'{$_SESSION['dataPartenza']}')";
    Il problema è che non funziona bene: non da errore, ma prende case dove ci sono prenotazioni. Ho provato a fare solo la query riguardante le prenotazioni:

    Codice:
    	$queryPrenotazioni = "SELECT * FROM prenotazioni WHERE id_casa = 2 AND dataCheckin<'{$_SESSION['dataArrivo']}' AND dataCheckout>'{$_SESSION['dataPartenza']}';";
    e funziona, ovvero mettendo determinate date restituisce le prenotazioni che si accavallano, ma quando la metto nella query principale non funziona, nel senso che il vincolo NOT EXIST non è rispettato. Sapete dirmi come mai? Grazie ancora

  6. #6
    Guest

    Predefinito

    Può essere un idea:

    Codice:
    SELECT * FROM archivioCase c left join (SELECT * FROM prenotazioni WHERE p.dataCheckin<@finePeriodo AND @inizioPeriodo < p.dataCheckout) p on p.idCasa = c.id
    WHERE luogo='$luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni' and p.idCasa is null
    Ciao
    Mik

  7. #7
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Premettendo che in questo caso la query annidata non era necessaria -vista la semplicità della richiesta- forse nella query interna ti serve mettere un OR tra le due condizioni di selezione, anzichè un AND (con opportune parentesi). In ogni caso, se mi dici lo schema delle due tabelle (cioè le colonne), a cosa corrispondono le due variabili di sessione e le dataCheckIn e CheckOut, e anche cosa vuoi ottenere, te la risolvo in 2 minuti ^^
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  8. #8
    Guest

    Predefinito

    Grazie mille Liuffo, ecco i campi delle tabelle:

    tabella archivioCase
    `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
    `nome` VARCHAR( 255 ) NOT NULL,
    `emailProprietario` VARCHAR( 255 ) NOT NULL,
    `luogo` VARCHAR( 255 ) NOT NULL ,
    `indirizzo` VARCHAR( 255 ) NOT NULL ,
    `tipologia` VARCHAR( 255 ) NOT NULL ,
    `maxOspiti` INT( 11 ) NOT NULL,
    `numeroBagni` INT( 11 ) NOT NULL,
    `numeroDocce` INT( 11 ) NOT NULL,
    `giardino` VARCHAR( 255 ) NOT NULL,
    `terrazzo` VARCHAR( 255 ) NOT NULL,
    `prezzoGiornaliero` INT( 11 ) NOT NULL,
    `minGiorni` INT( 11 ) NOT NULL,
    `maxGiorni` INT( 11 ) NOT NULL,
    `descrizione` TEXT( 5000 ) NOT NULL,
    PRIMARY KEY ( `id` )

    tabella prenotazioni
    `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
    `emailUtente` INT( 11 ) NOT NULL ,
    `id_casa` INT( 11 ) NOT NULL ,
    `commento_rilasciato` VARCHAR( 255 ) NOT NULL ,
    `dataCheckin` date NOT NULL ,
    `dataCheckout` date NOT NULL ,
    PRIMARY KEY ( `id` )

    In pratica sto facendo un progetto per un esame universitario, devo fare un sito che permette la prenotazione di appartamenti per le vacanze. Questa query serve per tirare fuori dal db solo le case libere nei gironi selezionati dall'utente, la query annidata cerca se ci sono prenotazioni che coincidono, controlla che la data di arrivo dell'utente sia compresa tra checkin e checkout della prenotazione già inserita, quindi non dovrebbe mostrare quella casa.
    DIci che si può fare anche senza query annidata?
    Grazie per il tuo aiuto

  9. #9
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Ah ma allora forse sei un collega! ^^ Che cosa studi? Io sto facendo ingegneria informatica :D

    Mi sembra che ci sia un problema, cioè tu verifichi solo se le date sono comprese, ma forse ti serve anche se le date si accavallano, cioè se ad es. la casa è prenotata dal 15 al 18 e tu arrivi il 12, però parti il 17, quella casa non ti serve. Dimmi se sbaglio.

    PS: Il mio nick è "Luffio", non "Liuffo" :P
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  10. #10
    Guest

    Predefinito

    Si devo verificare anche se la data di fine si accavalla, ho cominciato a farla così con l'intenzione di completarla una volta che questa funzionasse.

    Cmq io studio informatica :)

  11. #11
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Citazione Originalmente inviato da TITANUM Visualizza messaggio
    Si devo verificare anche se la data di fine si accavalla, ho cominciato a farla così con l'intenzione di completarla una volta che questa funzionasse.

    Cmq io studio informatica :)
    Non solo quella di fine, anche quella d'inizio, più che altro devi verificare che siano entrambe prima o entrambe dopo l'intervallo, per impedire intersezioni. Non so che date tu abbia inserito finora per verificare, ma secondo è solo quello il problema :D e fai meglio a farlo senza query annidata sennò è un casino
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  12. #12
    Guest

    Predefinito

    Ciao Luffo, ho modificato la query in questo modo:

    Codice:
    	$queryRicerca = "SELECT * FROM archivioCase c
    					  WHERE luogo='$luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni'
    					  AND NOT EXISTS(SELECT * FROM prenotazioni WHERE id_casa = c.id AND dataCheckin>'{$_SESSION['dataArrivo']}' AND dataCheckin<'{$_SESSION['dataPartenza']}')
    					  AND NOT EXISTS(SELECT * FROM prenotazioni WHERE id_casa = c.id AND dataCheckout>'{$_SESSION['dataArrivo']}' AND dataCheckout<'{$_SESSION['dataPartenza']}')";
    Ho fatto molte prove e sembra funzionare, che ne pensi? Non ho capito come fare la stessa query senza query annidate, mi faresti vedere un esempio?
    Grazie

  13. #13
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Ciao TITANUM, il tuo codice è corretto ;)

    Senza query annidata viene così:
    Codice PHP:
    $queryRicerca = "SELECT * FROM archivioCase c
    WHERE luogo='
    $luogo' AND maxOspiti>='$ospiti' AND minGiorni<='$giorni'
    AND (('
    {$_SESSION['dataArrivo']}'<dataCheckin AND '{$_SESSION['dataPartenza']}'<=dataCheckin)
    OR ('
    {$_SESSION['dataArrivo']}'>=dataCheckout AND '{$_SESSION['dataPartenza']}'>dataCheckout))";
    PS: Il mio nick "Luffio" non "Luffo" -.-
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

Regole di scrittura

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