[PHP] Controllare dati database tra due valori

keyz23

Nuovo Utente
18 Lug 2018
30
0
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.
 
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
 
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

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:
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 ….
 
  • Like
Reactions: keyz23
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
Hai ragione :confused: Ho letto male e quindi di conseguenza interpretato al contrario :(
Ho provato e adesso non fa aggiungere la prenotazione!!
 
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>";
 
}


?>
 
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 "$"
 
  • Like
Reactions: keyz23
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!
 
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
 
  • Like
Reactions: keyz23
inserisci l'echo
PHP:
if($prenotato === 0)
{
    echo "<script type='text/javascript'>alert('INSERIMENTO');</script>";

    $query1 = "INSERT INTO ….
 
  • Like
Reactions: keyz23
inserisci l'echo
PHP:
if($prenotato === 0)
{
    echo "<script type='text/javascript'>alert('INSERIMENTO');</script>";

    $query1 = "INSERT INTO ….
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:
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
 
  • Like
Reactions: keyz23

Discussioni simili