webForumDet fria alternativet

hel och halvtimme!

3 svar · 546 visningar · startad av crisse6

crisse6Medlem sedan dec. 20002 526 inlägg
#1

Tjena!

Funderar på hur jag ska lösa följande:

En person väljer ett val i en dropdown. Det finns två val å välja bland.

Beroende på vilket val man väljer uppdateras en annan lista med olika tider (via javascript).

Te x:
Selectlist 1: Val 1

Selectlist 2 (tiderna):
09.00-10.00
10.00-11.00 etc

Selectlist 1: Val 2

Selectlist 2 (tiderna):
09.30-10.00
10.00-10.30

Att kolla sedan om det finns något på Val 1 valt i databasen mot tiderna när det är hela timmar är inga problem. Men om det finns tid på Val 1 säg, 10.00-11.00 och man väljer Val 2 10.00-10.30 så ska inte det gå heller.
Hur bör man lösa detta?

hampus_bMedlem sedan dec. 200539 inlägg
#2

uppfattar frågan så här:

  1. du ska kolla i db:n innan du visar alternativen
  2. man kan "boka" både hela timmar (9-10) och halva timmar (9-9.30 resp 9.30-10)
  3. en "bokning" på 9-10 omöjliggör bokningar på de andra alternativen

Isåfall finns det fyra scenarier som måste unvikas:
* slutar efter att en annan bokning börjar men innan den slutar
* startar efter en annan bokning börjar, men innan de slutar
* börjar innan annan bokning slutar, men slutar efter
* börjar före och slutar efter annan bokning börjar/slutar

löses kodmässigt såhär (t.ex.)

SELECT * FROM db_bokning WHERE 
$stoptid > db_starttid AND $stoptid <= db_stoptid OR
$starttid >= db_starttid AND $startid <= db_stoptid OR
$starttid <= db_starttid AND $stoptid >= db_stoptid

om du får en träff på denna sökning så är positionen upptagen.

Detta är bara ett sätt att lösa det. Ett annat är att plocka ut alla bokningar i en lista och göra ett likande test:

		foreach ($array AS $v) {
		$startt = strtotime($v['booking_starttime']);
		$stopt = strtotime($v['booking_stoptime']);
			if ( ( ($comp_startt >= $startt) AND ($comp_startt <= $stopt) ) OR
				   ( ($comp_stopt  >= $startt) AND ($comp_stopt  <= $stopt) ) ) {
				return "booked";
			}
		}
crisse6Medlem sedan dec. 20002 526 inlägg
#3

Okej. Det där funka ju fint med sql-satsen... Tack för det!
Okej. Ytterligare ett problem som dök upp när man satt å funderade lite...

Korrekta tider att boka på:

08.00-09.30, 10:30-12.00, 13.30-16.00

Sen har det dykt upp ett alternativ till. Men har möjligheten att välja +15 min extra på sin bokning.
Okej. Nu till problemet, vad händer om Kalle bokar 08.00-08.45 (om han har valt å lägga till de där 15 min), då kan ju inte nästa boka förän 09.00-09.30. Det innebär att det blir ledigt 15 min där mellan 08.45-09.00 som inte går att använda. Hur lösa så att det inte blir några glapp? :)

crisse6Medlem sedan dec. 20002 526 inlägg
#4

Tjo!

Efter x antal timmars meckande så fick man ju fram en lösning.. Hehe...

<?php
$boknings_langd = 31; //Antal minuter man vill boka

$arr_perioder[1]['start'] = mktime(8,0,0,$month,$day,$_GET['year']);
$arr_perioder[1]['stop'] = mktime(9,30,0,$_GET['month'],$_GET['day'],$_GET['year']);
$arr_perioder[2]['start'] = mktime(10,0,0,$_GET['month'],$_GET['day'],$_GET['year']);
$arr_perioder[2]['stop'] = mktime(11,30,0,$_GET['month'],$_GET['day'],$_GET['year']);
$arr_perioder[3]['start'] = mktime(13,0,0,$_GET['month'],$_GET['day'],$_GET['year']);
$arr_perioder[3]['stop'] = mktime(16,0,0,$_GET['month'],$_GET['day'],$_GET['year']);

$key=0;
for($j = 1; $j <= sizeof($arr_perioder); $j++) {

$period_total = round(($arr_perioder[$j]['stop'] - $arr_perioder[$j]['start'])/60);
$minuter = 0;
$radio = 0;
$test_time = $arr_perioder[$j]['start'];

for($i = 0; $i<=$period_total+2; $i++) {

	   
  	$minuter++;	

	if($minuter == $boknings_langd ) {
	  
	  echo "<input type=\"radio\" name=\"time\" value=\"" . ($test_time-(($boknings_langd-1)*60)) . "-" . ($test_time) . "\">";
	  $radio++;
	  echo "Tillgänglig " . date("H:i", $test_time-(($boknings_langd-1)*60)) . "-" . date("H:i", $test_time).  "<br/>";
	  $minuter = 1;
	}	
	
  if($arr_bokat[$key]['start'] == $test_time) {
		$minuter = 0;
		
		$test_time = $arr_bokat[$key]['stop']-60;
		
		$bokad_total = ($arr_bokat[$key]['stop'] - $arr_bokat[$key]['start'])/60;
		$i += $bokad_total;
		$key++;
		
	}
	$test_time += 60;

	
}
}
?>
130 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)