Problema con le prenotazioni

  • Creatore Discussione Creatore Discussione Max61
  • Data di inizio Data di inizio

Max61

Utente Attivo
2 Mar 2014
760
4
18
Buongiorno, sto tentando di fare un programma di prenotazioni e mi sono arenato nella verifica se la prenotazione esiste già, in parte l'ho risolta, infatti se il giorno risulta già nel DB, me lo segnala, il problema rimane quello delle ore e non riesco a venirne a capo.
Allego query che utilizzo per la verifica:

PHP:
//VERIFICA SE ESISTE LA PRENOTAZIONE NEL DB
$db = mysql_connect($host, $user, $password); 
if ($db == FALSE) 
die ("Errore nella connessione."); 
mysql_select_db($database, $db) 
or die ("Errore nella selezione del database."); 

	 $id = ['id'];
	 $nominativo = ['nominativo'];
     $str_data = strtotime($_POST['data']);
     $oggi = strtotime($_POST['oggi']);
     $orainizio = strtotime($_POST['orainizio']);
     $orafine = strtotime($_POST['orafine']);

 
	$VerificaSePrenotato = "SELECT COUNT(*) FROM tblprenotazioneauto WHERE str_data = '{$str_data}'";
    $query = mysql_query($VerificaSePrenotato) or die(mysql_error());

    if (mysql_result($query, 0) == 0) {
		
		require 'InserisciPrenotazione.php';
        die('Hai già inserito questo record.');
		echo "<span style=\"color:blue height:1;width:1; background-color:white\">
	<b><i><span style=\"color:white; font-size: 14pt\"><span style=\"color:red height:1;width:1; background-color:red\">&nbsp;Giorno prenotato...&nbsp;</b></span>";			
	
	}
 	
			

	     $VerificaSePrenotato = "SELECT * from tblprenotazioneauto WHERE str_data = '{$str_data}'";
	     $result = mysql_query($VerificaSePrenotato) or die (mysql_error());
  
if(mysql_num_rows($result) > 0)
	 {
    while($fetch = mysql_fetch_array($result))
    {
      $id = stripslashes($fetch['id']);
	  $nominativo = stripslashes($fetch['nominativo']);
      $orainizio = stripslashes($fetch['orainizio']);
	  $orafine = stripslashes($fetch['orafine']);
	  $telefono = stripslashes($fetch['telefono']);
	  $note = stripslashes($fetch['note']);
	  $data = date("d-m-Y", $fetch['str_data']); 
	  echo "<br><span style=\"color:blue; font-size: 14pt\"><span style=\"color:white height:1;width:1; background-color:white\"> $nominativo, ", $data, "  ", $orainizio, "  ", $orafine, "";
	
	}
	}
//FINE VERIFICA SE ESISTE LA PRENOTAZIONE NEL DB

Gli altri campi da verificare sono $orainizio e $orafine, ho provato ad aggiungerli alla query sia con AND che con OR, ma con nessun risultato utile.

Grazie a chi saprà darmi una dritta

Max61
 
non so se il problema lo hai risolto, ma provo con una soluzione,

suppongo che nel db, per una prenotazione esiste il giorno ed anche l'ora di inizio e di fine

dovresti quindi verificare queste 3 situazioni,

la prenotazione si sovrappone ad un periodo già prenotato stando al suo interno
DB_orainizio $orainizio $orafine DB_orafine

la prenotazione copre parzialmente un peridodo già prenotato
$orainizio DB_orainizio $orafine

la prenotazione copre parzialmente un peridodo già prenotato
$orainizio DB_orafine $orafine

puoi fare un'unica query mettendo le 3 situazioni in or tra loro

prova anche a scambiare le ore DB con $, dovresti avere lo stesso risultato
ciao
Marino
 
non so se il problema lo hai risolto, ma provo con una soluzione,

suppongo che nel db, per una prenotazione esiste il giorno ed anche l'ora di inizio e di fine

dovresti quindi verificare queste 3 situazioni,

la prenotazione si sovrappone ad un periodo già prenotato stando al suo interno
DB_orainizio $orainizio $orafine DB_orafine

la prenotazione copre parzialmente un peridodo già prenotato
$orainizio DB_orainizio $orafine

la prenotazione copre parzialmente un peridodo già prenotato
$orainizio DB_orafine $orafine

puoi fare un'unica query mettendo le 3 situazioni in or tra loro

prova anche a scambiare le ore DB con $, dovresti avere lo stesso risultato
ciao
Marino


Ciao Marino e grazie per l'interessamento, il problema non l'ho risolto, ma non mi è chiaro -DB_orainizio-DB_orafine- e scambiare le ore DB con $.

Io ho questa query che mi controlla il giorno senza guardare l’orario:
PHP:
$VerificaSePrenotato = "SELECT * from tblprenotazioneauto WHERE str_data = '{$str_data}'"; 
         $result = mysql_query($VerificaSePrenotato) or die (mysql_error()); 
   
if(mysql_num_rows($result) > 0) 
     { 
    while($fetch = mysql_fetch_array($result)) 
    { 
      $id = stripslashes($fetch['id']); 
      $nominativo = stripslashes($fetch['nominativo']); 
      $orainizio = stripslashes($fetch['orainizio']); 
      $orafine = stripslashes($fetch['orafine']); 
      $telefono = stripslashes($fetch['telefono']); 
      $note = stripslashes($fetch['note']); 
      $data = date("d-m-Y", $fetch['str_data']);  
      echo "<br><span style=\"color:blue; font-size: 14pt\"><span style=\"color:white height:1;width:1; background-color:white\"> $nominativo, ", $data, "  ", $orainizio, "  ", $orafine, "";

Se mi puoi modificare la query come credi che debba essere fatto…
Grazie
Max61
 
ti ho indicato con $... i nomi delle variabili php e con DB_..... i nomi delle colonne nel database

per semplificare e per certezza potresti scrivere 4 clausole da inserire nella where,
Codice:
(DB_orainizio <= $orainizio <= DB_orafine) OR
(DB_orainizio <= $orafine <= DB_orafine) OR
($orainizio <= DB_orainizio <= $orafine) OR
($orainizio <= DB_orafine <= $orafine)
nelle parentesi deve essere usato AND
in questo modo viene verificata la sovrapposizione delle prenotazioni
ciao
Marino
 
ti ho indicato con $... i nomi delle variabili php e con DB_..... i nomi delle colonne nel database

per semplificare e per certezza potresti scrivere 4 clausole da inserire nella where,
Codice:
(DB_orainizio <= $orainizio <= DB_orafine) OR
(DB_orainizio <= $orafine <= DB_orafine) OR
($orainizio <= DB_orainizio <= $orafine) OR
($orainizio <= DB_orafine <= $orafine)
nelle parentesi deve essere usato AND
in questo modo viene verificata la sovrapposizione delle prenotazioni
ciao
Marino



Grazie e scusa per la mia ignoranza in materia ma è da poco che mi cimento con PHP e MYSQL, quindi so fare poche cose, però mi piace programmare e quindi ci provo.

Ho testato il tuo codice:
PHP:
$sql = "SELECT * from tblprenotazioneauto WHERE str_data = '{$str_data}' AND (DB_orainizio <= $orainizio <= DB_orafine) OR
(DB_orainizio <= $orafine <= DB_orafine) OR
($orainizio <= DB_orainizio <= $orafine) OR
($orainizio <= DB_orafine <= $orafine)";

ma mi da questo errore di sintassi che non comprendo:
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 '<= DB_orafine) OR (DB_orainizio <= <= DB_orafine) OR ( <= DB_orainizio <= ) OR ' at line 1


Grazie ancora per la pazienza...
Max61
 
Ultima modifica:
Ho fatto altre prove mettendo il $ al posto di DB_ e non mi da più errore, ma nel caso il giorno sia già prenotato (non verifica l'orario) mi mostra tutte le prenotazioni presenti nel DB.
La query che ho usato è questa:
PHP:
$sql = "SELECT * from tblprenotazioneauto WHERE str_data = '{$str_data}' AND ($orainizio <= $orainizio <= $orafine) OR
($orainizio <= $orafine <= $orafine) OR
($orainizio <= $orainizio <= $orafine) OR
($orainizio <= $orafine <= $orafine)";

Dove sbaglio?

Grazie
Max61
 
scusa ma non conoscendo i nomi dei campi nel db avevo scritto solo l'indicazione per la costruzione delle clausole
la select la comporrei in questa forma,

Codice:
SELECT * from tblprenotazioneauto WHERE str_data=$str_data AND (
($orainizio BETWEEN DB_orainizio AND DB_orafine) OR
($orafine   BETWEEN DB_orainizio AND DB_orafine) OR
(DB_orainizio BETWEEN $orainizio AND $orafine)   OR
(DB_orafine   BETWEEN $orainizio AND $orafine)   )

devi sostituire i nomi "DB_orainizio" e "DB_orafine" con i nomi usati nel database
ciao
Marino
 
Ciao Marino, ho provato come mi hai suggerito, ma la verifica la ancora soltanto sul giorno a meno che non abbia sbagliato a fare la query...che allego:
PHP:
$sql = "SELECT * from tblprenotazioneauto WHERE str_data=$str_data AND (
($orainizio BETWEEN $orainizio AND $orafine) OR
($orafine   BETWEEN $orainizio AND $orafine) OR
($orainizio BETWEEN $orainizio AND $orafine) OR
($orafine   BETWEEN $orainizio AND $orafine))";

I campi sono nel DB sono:
$orainizio
$orafine

Grazie
Max61
 
direi che sono sbagliati i nomi che hai sostituito,
nella tabella "tblprenotazioneauto" hai la colonna "str_data", nella stessa tabella come si chiamano le colonne relative all'ora di inizio e all'ora di fine ?
certamente quando inserisci un nome preceduto da "$" ti riferisci alla variabile php non certo alla colonna del db
puoi postare le definizioni della tabella "tblprenotazioneauto" ?
ciao
Marino
 
Il campo $str_data fa parte della tabella "tblprenotazioneauto".
Questo è il DB completo:

PHP:
-- phpMyAdmin SQL Dump
-- version 4.0.4.1
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generato il: Ago 28, 2015 alle 16:18
-- Versione del server: 5.6.11
-- Versione PHP: 5.5.3

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `prenotazioneauto`
--

-- --------------------------------------------------------

--
-- Struttura della tabella `tblprenotazioneauto`
--

CREATE TABLE IF NOT EXISTS `tblprenotazioneauto` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `nominativo` varchar(100) NOT NULL,
  `str_data` varchar(20) NOT NULL,
  `oggi` varchar(250) NOT NULL,
  `datautilizzoauto` varchar(50) NOT NULL,
  `orainizio` varchar(50) NOT NULL,
  `orafine` varchar(50) NOT NULL,
  `telefono` varchar(50) NOT NULL,
  `note` text NOT NULL,
  `data` varchar(100) NOT NULL,
  `titolo` varchar(250) NOT NULL,
  `testo` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=84 ;

--
-- Dump dei dati per la tabella `tblprenotazioneauto`
--

INSERT INTO `tblprenotazioneauto` (`id`, `nominativo`, `str_data`, `oggi`, `datautilizzoauto`, `orainizio`, `orafine`, `telefono`, `note`, `data`, `titolo`, `testo`) VALUES
(63, 'Pippo', '1440972000', '1440712800', '1440972000', '07.30', '09.30', '333', '', '', '', ''),
(79, 'Pluto', '1440540000', '1440712800', '1440540000', '09.30', '10.00', '333', '', '', '', '');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Ciao
Max61
 
Ultima modifica:

Discussioni simili