Pętla while w sekcji select


(Pumson99) #1

Witam aktualnie tworzę formularz do ustalania wizyty w poradni rehabilitacyjnej (projekt do szkoły), no i tam tworzę możliwość ustalania terminu jaki tylko sie chce. Używając menu wyboru select chciałem zrobić rozwijaną listę do wyboru roku, miesiąca, dnia oraz godziny. W celu uniknięcia dużej ilości powtarzania option chciałem zrobić by to pętla while je powtarzała. Stworzyłem taką oto pętle: http://wklejto.pl/511493 lecz ona nie działa (żadna opcja się nie wyświetla). Ktoś wie jak to poprawić? Z góry dziękuję za pomoc :slight_smile:
PS: Tak, $dzis po ustaleniu typu na int zawiera sam rok.


(07-03-2018) #2

Na 4programmers.net prędzej Tobie odpowiedzą.


(Pumson99) #3

kila razy już zakładałem tutaj temat tego typu, zawsze w przeciągu 24h dostawałem odpowiedź :slight_smile:


(Fizyda) #4

Nie możesz tak iterować po dacie którą masz w formie stringa. Najpierw zapisujesz do zmiennej date datę w formacie Y-m-d, później rzutujesz strinka na inta, a taka konwersja może być lekko upośledzona w pewnych przypadkach i tak jest w Twoim. Masz stringa 2018-03-18 konwertując go do inta brane są pod uwagę tylko pierwsze cyfry tego właśnie łańcucha znaków czyli 2018 i one zamieniane są na inta. Stąd po konwersji masz tylko sam rok.

Teraz tak gdy nie robisz konwersji to iterujesz stringa i to jeszcze tylko jeśli spełni on warunek "2018-03-18" >= 2050 czyli twój strong w pętli jest niejawnie konwertowany na typ int by dokonać porównanie więc nigdy 2018 nie jest większe lub równe 2050, czyli pętla nigdy się nie wykona.

Aby iteracja po dacie miała jakiś sens i była skuteczna proponuję operować na dacie w formacie linuxa. Przykład:

<?php

	$current = time();
	
	$oneDay = 24 * 60 * 60	// 24 hours; 60 mins; 60 secs
	
	// nie wiem co to za liczba 2050 zgaduje że moze rok
	for($i = $current; $i >= mktime(0,0,0,1,1,2050); $i += $oneDay)
	{
		// $i trzyma czas który iterujemy w pętli o jeden dzień
		// ponieważ jest to tak zwany timestamp musimy go przekonwertować
		// do normalnego formatu
		//
		// timestamp to czas w formacie linuxa czyli liczba sekund
		// jakie upłynęły od 1 stycznia 1970 roku, jest to wartość
		// int więc łatwo po niej iterowac
		$today = date('Y-m-d', $i);
		
		echo'<option value="'.$today.'">'.$today.'</option>';
	}
?>

PS. Ten warunek pętli jest bez sensu bo tworzy nam nieskończoną pętlę ponieważ iterujemy do przodu - zwiększamy wartość, a sprawdzamy minimalną granicę, więc chyba się machnąłeś i powinno być <= zamiast >=, w tedy wypiszesz tyle wartości rok-miesiąc-dzień ile jest od dzisiaj do 1 stycznia 2050 roku.

EDIT:
Jeszcze lepszym sposobem na iterowanie może być użycie klasy date time (http://php.net/manual/en/class.datetime.php). A nawet powiedziałbym, że polecam użyć właśnie jej.


(Pumson99) #5

Tak chodziło mi o to by do inta zamienić sam rok, pisząc w warunek $dzis myślałem że skrypt będzie czytał już przekonwertowaną zmienną czyli sam rok, a w sprawie znaku w liczniku to rzeczywiście pomyliłem się :smiley: Dzięki za odpowiedź. Chodziło mi tylko o to by na liście rozwijanej były tylko lata, 2018, 2019… Ale to już mam nadzieję że sam sobie ogarnę dzięki Twoim poradom :slight_smile: Dzięki wielkie jeszcze raz :slight_smile:


(AnonimX) #6

A mogę zadać głupie pytanie?
Po co select z milionem pozycji (od 2018 do 2050 to jest jakieś 11610), skoro jest takie coś jak input type=date?
https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_date
Potem należy pomyśleć o sprawdzaniu, czy wybrana data nie jest sobotą lub niedzielą. Omijanie świat to już wyższa szkoła jazdy.