[PHP] Controllare dati database tra due valori

Discussione in 'PHP' iniziata da keyz23, 24 Settembre 2018.

Tag (etichette):
  1. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Buongiorno ragazzi. Sto cercando di effettuare un controllo ai dati del database prima di inserirli nello stesso.
    In sostanza ho 3 parametri all'interno di un form
    data (type=data)
    orario_inizio (type=time)
    orario_fine (type=time)

    Quello che devo fare prima dell'inserimento è controllare che nella "data" inserita dall'utente, tra "orario_inizio" scelto e "orario_fine" ci sia disponibilità ( quindi che non siano state effettuate precedentemente altre prenotazioni ).

    Per esempio
    Utente1 vuole prenotare per giorno 24 Settembre dalle ore 10:30 alle 12:30. Quindi devo andare a fare un controllo, prima di inserire questa prenotazione, in modo da vedere se per questo stesso giorno ci sono prenotazioni, già effettuate, che vanno dalle 10:30 alle 12:30. Se non ci sono altre prenotazioni allora posso inserirla nel database.

    Io avevo pensato di fare un SELECT COUNT e poi lavorare sulle date utilizzando un BETWEEN solo che non riesco a fare quadrare le cose.

    PHP:
    <?php
    //Connecting to db here

    $servername "localhost";
    $username "root";
    $password "123456789";
    $dbname "Project";

    // Create connection
    $conn = new mysqli($servername$username$password$dbname);

    // Check connection
    if ($conn->connect_error) {
        die(
    "Connection failed: " $conn->connect_error);
    }
    echo 
    "Connected successfully";

    // Richiedente
    $nominativo $_POST['nominativo'];

    $email $_POST['email'];
    $oggetto $_POST['oggetto'];
    $data $_POST['data'];
    $orario_inizio $_POST['orario_inizio'];
    $orario_fine $_POST['orario_fine'];

    //Qua va inserito il controllo

    $query1 "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto')";

    $result1 mysqli_query($conn$query1 );


    ?>
    Sapete come posso fare? grazie a tutti del tempo dedicato.
     
  2. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    puoi usare questa query,
    che ritornando zero indica che non esistono prenotazioni per l'intervallo voluto
    Codice:
    SELECT count(*) as prenotato
      FROM Prenotazione
     WHERE data='$data'
       AND NOT ('$orario_fine' < orario_inizio OR orario_fine < '$orario_inizio')
    ps, attento, con la struttura del db che hai impostato non puoi lavorare a cavallo di date ....
    per spegarmi, gli intervalli devono essere all'interno della stessa guornata
     
  3. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Grazie come sempre per la tua risposta! Quindi in sostanza io ho provato a fare qualcosa di simile:

    PHP:
    $checkdata "SELECT count(*) as prenotato
      FROM Prenotazione
     WHERE data='
    $data'
       AND NOT ('
    $orario_fine' < orario_inizio OR orario_fine < '$orario_inizio')";

    $resultcheck mysqli_query($conn$checkdata);
    if(
    prenotato 0){
    $query1 "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile')";
    $result1 mysqli_query($conn$query1 );

    }
    else {
        
    alert("Impossibile effettuare prenotazione.");
    }

    // Ho provato pure cosi:
    $checkdata "SELECT count(id)
      FROM Prenotazione
     WHERE data='
    $data'
       AND NOT ('
    $orario_fine' < orario_inizio OR orario_fine < '$orario_inizio')";

    $result_set=mysqli_query($conn$checkdata);
    $checkIfValid=mysqli_fetch_array($conn$result_set)[0];

    if(
    $checkIfValid 0){
    alert("Impossibile effettuare prenotazione.");

    }
    else {
       
        
    $query1 "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile')";
    $result1 mysqli_query($conn$query1 );
    }
    Nel primo caso non inserisce niente :/
    Nel secondo caso invece inserisce tutto ( ho provato ad effettuare una prenotazione giorno 25 dalle 9:30 alle 12:30, poi provando ad effettuare un'altra prenotazione sempre giorno 25 dalle 10:30 alle 13:30 è stata aggiunta ugualmente. )
     
    Ultima modifica: 25 Settembre 2018
  4. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    intanto ho scritto,
    per cui dovresti fare l'inserimento quando "prenotato" é uguale a zero, in particolare
    PHP:
    if(prenotato === 0)
    nel caso fosse maggiore di zero non dovresti accettare la prenotazione e gestire l'errore
     
    A keyz23 piace questo elemento.
  5. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    poi controlla il risultato che ricevi dal db perché la query funziona !
    upload_2018-9-25_10-13-21.png

    ps, lascia la query come l'ho indicata io, senza modifiche ….
     
    A keyz23 piace questo elemento.
  6. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Hai ragione :confused: Ho letto male e quindi di conseguenza interpretato al contrario :(
    Ho provato e adesso non fa aggiungere la prenotazione!!
     
  7. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    riposta il tuo codice
     
    A keyz23 piace questo elemento.
  8. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    PHP:
    <?php
    //Connecting to db here

    $servername "localhost";
    $username "root";
    $password "123456789";
    $dbname "Project";

    // Create connection
    $conn = new mysqli($servername$username$password$dbname);

    // Check connection
    if ($conn->connect_error) {
        die(
    "Connection failed: " $conn->connect_error);
    }


    // Richiedente
    $nominativo $_POST['nominativo'];

    $email $_POST['email'];
    $oggetto $_POST['oggetto'];
    $data $_POST['data'];
    $orario_inizio $_POST['orario_inizio'];
    $orario_fine $_POST['orario_fine'];

    // Personale Interno
    $nominativoi $_POST['nominativoi'];
    $emaili $_POST['emaili'];

    // Persona Esterno
    $nominativoe $_POST['nominativoe'];
    $emaile $_POST['emaile'];

    //inserting data order
    $checkdata "SELECT count(*) as prenotato
      FROM Prenotazione
     WHERE data='
    $data'
       AND NOT ('
    $orario_fine' < orario_inizio OR orario_fine < '$orario_inizio')";

    $resultcheck mysqli_query($conn$checkdata);
    if(
    prenotato === 0){
    $query1 "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile')";
    $result1 mysqli_query($conn$query1 );
    $message "La prenotazione: $oggetto in  $data / $orario_inizio - $orario_fine sarà controllata.";
        echo 
    "<script type='text/javascript'>alert('$message');</script>";

    }
    else {
        
    $message "Impossibile effettuare prenotazione in questa $data / $orario_inizio - $orario_fine";
        echo 
    "<script type='text/javascript'>alert('$message');</script>";
     
    }


    ?>
     
  9. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    prova a sostituire così
    PHP:
    //inserting data order
    $checkdata "SELECT count(*) as prenotato
      FROM Prenotazione
     WHERE data='
    $data'
       AND NOT ('
    $orario_fine' < orario_inizio OR orario_fine < '$orario_inizio')";

    $prenotato $conn->query($checkdata)->fetch_row()[0];

    if(
    $prenotato === 0)
    {
        
    $query1 "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile')";
        
    $result1 mysqli_query($conn$query1 );
        
    $message "La prenotazione: $oggetto in  $data / $orario_inizio - $orario_fine sarà controllata.";
        echo 
    "<script type='text/javascript'>alert('$message');</script>";
    }
    else
    {
        
    $message "Impossibile effettuare prenotazione in questa $data / $orario_inizio - $orario_fine";
        echo 
    "<script type='text/javascript'>alert('$message');</script>";
    }
    ma non ho MySqli quindi l'ho cercato …. ma non provato

    nel tuo script ci sono errori anche di sintassi vedi "prenotato" senza "$"
     
    A keyz23 piace questo elemento.
  10. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Grazie davvero per la tua disponibilità ma niente neanche cosi va. Ho una prenotazione che va dalle 9:30 alle 11:30. Ora ho provato ad inserirne un'altra dalle 12:30 alle 15:30 ma mi restituisce solo il messaggio dell'else e non l'aggiunge al db.

    Edit.
    E' vero, ma ho incollato direttamente il tuo codice!
     
  11. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    la query funziona ….
    upload_2018-9-25_11-14-6.png

    inserisci tra le due righe un controllo
    PHP:
    $prenotato $conn->query($checkdata)->fetch_row()[0];

    var_dump($prenotato);

    if(
    $prenotato === 0)
    vedi il risultato della query
     
    A keyz23 piace questo elemento.
  12. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Mi restituisce: string(1) "0"
    Ma non lo inserisce nel DB
     
  13. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    inserisci l'echo
    PHP:
    if($prenotato === 0)
    {
        echo 
    "<script type='text/javascript'>alert('INSERIMENTO');</script>";

        
    $query1 "INSERT INTO ….
     
    A keyz23 piace questo elemento.
  14. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Ho inserito questo echo ma non è cambiato nulla ( avrebbe dovuto stampare un messaggio "Inserimento" giusto ? )
    Comunque davvero non capisco, perchè provando del db la query:
    Codice:
    SELECT count(*) as prenotato FROM Prenotazione WHERE data='2018-09-25' AND NOT ('15:30:00' < orario_inizio OR orario_fine < '13:30:00')
    Mi restituisce 0 quindi dovrebbe farmelo inserire tranquillamente.
     
    Ultima modifica: 25 Settembre 2018
  15. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    si, invece cosa ha fatto ?
     
    A keyz23 piace questo elemento.
  16. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Non ha fatto nulla. Neanche viene visualizzato. Quindi è come se non leggesse quel blocco, il ciclo if e va direttamente all'else.
    Anche perché ho provato ad utilizzare un'altra data e la situazione è uguale.
     
  17. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    sostituisci togliendo un'uguale
    if($prenotato == 0)
     
    A keyz23 piace questo elemento.
  18. keyz23

    keyz23 Nuovo Utente

    Registrato:
    18 Luglio 2018
    Messaggi:
    30
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Perfetto. Era questo il problema. Grazie come sempre
     
  19. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.550
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    una informazione in più ….

    se volessi conoscere le prenotazioni presenti, che interferiscono con la nuova prenotazione, puoi eseguire la stessa query con
    " SELECT * " incece del count, gestendo il risultato ottieni l'elenco delle prenotazioni presenti che interferiscono
     
    A keyz23 piace questo elemento.
Sto caricando...

Condividi questa Pagina