Wątek przeniesiony 2017-11-16 17:47 z PHP przez Patryk27.

Skrypt liczący ilość dni do urodzin

0

Witam. Mam napisać skrypt który będzie obliczał po podaniu daty urodzenia, to za ile dni użytkownik będzie obchodzić urodziny. Kod wygląda tak.

HTML

<body>
<form action="index.php" method="get">
    <p>Wpisz date urodzin (MM-DD-RRRR)</p>
    <input type="text" name="data">
    <input type="submit" value="wyslij" name="submit">
</form>
</body>

PHP

<?php

    if( isset($_GET['submit']) ){
        $str = $_GET['data'];

        if (($t = strtotime($str)) === false  ) {
            echo "Problem z data";
        } else {
            setcookie('data',$t,time()+3600);
            $_COOKIE['data'] = $t;
        }
    }

    if( isset($_COOKIE['data'])){
        $d = $_COOKIE['data'];
        $r = $d - time();
        $d = floor($r / 86400);
        echo 'Za ' . $d . ' dni masz urodziny';
    }
?>

Niestety skrypt liczy tylko poprawnie datę jeżeli podam aktualny rok. W przypadku podania roku innego roku niż 2017 wynik jest błędny i wychodzi na -. Jak zrobić, to aby program nie uwzględniał roku podczas obliczeń ?

0

Chwila, powoli.
Po co Ci tam $_COOKIE? Nie ma nic o tym w poleceniu.

0

Polecenie jest takie:

Napisz skrypt, w którym będzie tworzony plik cookie zapamiętujący wprowadzoną przez formularz datę urodzin użytkownika. Skrypt powinien wyświetlać informację, za ile dni użytkownik będzie obchodził urodziny.

0

Załóżmy, że dzisiaj jest 2017-02-02 - masz do rozpatrzenia trzy przypadki:

  • użytkownik podaje datę w stylu 1990-01-01 (już miał urodziny),
  • użytkownik podaje datę w stylu 1990-02-02 (ma urodziny dzisiaj),
  • użytkownik podaje datę w stylu 1990-03-03 (dopiero będzie miał urodziny).
0

Obliczanie za ile dni będziesz miał urodziny

			$dateOfBirth = new DateTime($str);//sprawdź sobie w dokumentacji jaki format daty należy podać, bo zaraz będziesz krzyczał, że nie działa
			$actualDate = new DateTime();
			$tmpDate = new DateTime();
			
			$d = $dateOfBirth->format('d');
			$m = $dateOfBirth->format('m');					
			$Y = $actualDate->format('Y');			
			
			$tmpDate->setDate($Y , $m , $d);
			
			if(!($tmpDate > $actualDate))
			{
				$tmpDate->modify('+1 year');		
			}
			
			$daysToBirthday = ($tmpDate->getTimestamp() - $actualDate->getTimestamp())/ 86400;
			
			echo 'Za ' . floor($daysToBirthday). ' dni masz urodziny';

Opis:
Bierzesz swoją datę urodzenia i zamieniasz rok na aktualny czyli np. 1998 -> 2017, bo musisz jakoś określić czy już miałeś urodziny czy nie - to co napisał Patryk. Jeżeli już miałeś no to dodajesz rok i obliczasz różnice między aktualną datą a datą następnych urodzin i wyświetlasz wynik.

Oczywiście powinieneś jeszcze uwzględnić warunek jak użytkownik będzie miał akurat w tym dniu urodziny. Np. wyświetlić "Wszystkiego najlepszego z okazji urodzin"

0

Ok. Dzięki za pomoc. Pozostaje jeszcze problem z cookie.
Przy pierwszej wizycie wyświetla się komunikat "Witamy po raz pierwszy. Podaj swoją date urodzenia". Natomiast po wpisaniu daty i wprowadzeniu daty i ponownej wizycie na stronie pojawia się takie coś:

Notice: Undefined variable: str in C:\xampp\htdocs\Robert\index.php on line 24
Za 365 dni masz urodziny

Jak powinienem zmodyfikować ciasteczko, tak by po ponownej wizycie pojawiał się komunikat z ilością dni do urodzin ?

Kod wygląda tak:

<form action="index.php" method="get">
    <p>Wpisz date urodzin (MM-DD-RRRR)</p>
    <input type="text" name="data">
    <input type="submit" value="wyslij" name="submit">
</form>

<?php

    if( isset($_GET['submit']) ){
        $str = $_GET['data'];

        if (($t = strtotime($str)) === false  ) {
            echo "Problem z data";
        } else {
            setcookie('data',$t,time()+3600);
            $_COOKIE['data'] = $t;
        }
    }

    if( isset($_COOKIE['data']))
	{
	
$dateOfBirth = new DateTime($str);
            $actualDate = new DateTime();
            $tmpDate = new DateTime();
 
            $d = $dateOfBirth->format('d');
            $m = $dateOfBirth->format('m');                 
            $Y = $actualDate->format('Y');          
 
            $tmpDate->setDate($Y , $m , $d);
 
            if(!($tmpDate > $actualDate))
            {
                $tmpDate->modify('+1 year');        
            }
 
            $daysToBirthday = ($tmpDate->getTimestamp() - $actualDate->getTimestamp())/ 86400;
 
            echo 'Za ' . floor($daysToBirthday). ' dni masz urodziny';
    }
	else
	{
		echo"Witamy po raz pierwszy. Podaj swoją date urodzenia.";
	}
?>
0

No bo w tym if gdzie sprawdzasz czy ciastko ma datę musisz ją odczytać i zapisać do zmiennej a potem podajesz ją jako argument w konstruktorze DateTime. Ja użyłem $str, bo jakoś musiałem to zapisać. W poprzednim kodzie to robiłeś, tutaj o tym zapomniałeś.

0

Trochę się pomyliłem w poprzednim poście. Chodzi oto, aby zapisać do cookie wpisaną datę urodzenia w formacie oraz, aby przy następnym odwiedzaniu strony była ona wyświetlana. Aktualnie zrobiłem do tego drugiega IF'a i data wyświetla się, ale po wysłaniu formularza razem z obliczeniem dni. Po wejściu na stronę kolejny raz jest takie coś:

Notice: Undefined variable: str in C:\xampp\htdocs\Kamil\index.php on line 36
Za 365 dni masz urodziny
Notice: Undefined variable: str1 in C:\xampp\htdocs\Kamil\index.php on line 54

0
<form action="index.php" method="get">
    <p>Wpisz date urodzin (MM-DD-RRRR)</p>
    <input type="text" name="data">
    <input type="submit" value="wyslij" name="submit">
</form>
 
<?php
 
    if( isset($_GET['submit']) ){
        $str = $_GET['data'];
 
        if (($t = strtotime($str)) === false  ) {
            echo "Problem z data";
        } else {
            setcookie('data',$t,time()+3600);
            $_COOKIE['data'] = $t;
        }
    }

	
	
	    if( isset($_GET['submit']) ){
        $str1 = $_GET['data'];
            setcookie('data',$str1,time()+3600);
            $_COOKIE['data'] = $str1;
			
        }
  
	
	
	
 
    if( isset($_COOKIE['data']))
    {
 
$dateOfBirth = new DateTime($str);
            $actualDate = new DateTime();
            $tmpDate = new DateTime();
 
            $d = $dateOfBirth->format('d');
            $m = $dateOfBirth->format('m');                 
            $Y = $actualDate->format('Y');          
 
            $tmpDate->setDate($Y , $m , $d);
 
            if(!($tmpDate > $actualDate))
            {
                $tmpDate->modify('+1 year');        
            }
 
            $daysToBirthday = ($tmpDate->getTimestamp() - $actualDate->getTimestamp())/ 86400;
 
            echo 'Za ' . floor($daysToBirthday). ' dni masz urodziny';
			echo $str1."<br>";
    }
    else
    {
        echo"Witamy po raz pierwszy. Podaj swoją date urodzenia.";
    }
?>
1

Temat do zamknięcia. Problem rozwiązany:

<form action="index.php" method="get">
    <p>Wpisz date urodzin (MM-DD-RRRR)</p>
    <input type="text" name="data">
    <input type="submit" value="wyslij" name="submit">
</form>
 
<?php
 
    if( isset($_GET['submit']) ){
        $str = $_GET['data'];
 
        if (($t = strtotime($str)) === false  ) {
            echo "Problem z data";
        } else {
            setcookie('data',$t,time()+3600);
            $_COOKIE['data'] = $t;
        }
    }
	
	
 	    if(isset($_GET['submit']) ){
			
        $str1 = $_GET['data'];
        setcookie('data',$str1,time()+3600);
        $_COOKIE['data'] = $str1;
        }
	
	
	
	
    if( isset($_COOKIE['data']))
		
    {
		$d1 = $_COOKIE['data'];
		$str = $_COOKIE['data'];
			$dateOfBirth = new DateTime($str);
            $actualDate = new DateTime();
            $tmpDate = new DateTime();
 
            $d = $dateOfBirth->format('d');
            $m = $dateOfBirth->format('m');                 
            $Y = $actualDate->format('Y');          
 
            $tmpDate->setDate($Y , $m , $d);
 
            if(!($tmpDate > $actualDate))
            {
                $tmpDate->modify('+1 year');        
            }
			
            $daysToBirthday = ($tmpDate->getTimestamp() - $actualDate->getTimestamp())/ 86400;
 
            echo 'Za ' . floor($daysToBirthday). ' dni masz urodziny'."<br>";
			echo "Twoja data urodzin to: ".$d1;
    }
    else
    {
        echo"Witamy po raz pierwszy. Podaj swoją date urodzenia."."<br>";

    }
?>
1

No przecież napisałem, że masz odczytać wartość ciastka do zmiennej, w pierwszej wersji kodu tak robiłeś. Wszystko było napisane. A dodatkowo jak wywala Ci błąd to są w nim informacje:

Notice: Undefined variable: str in C:\xampp\htdocs\Kamil\index.php on line 36

Po pierwsze masz podany numer linijki gdzie jest błąd, no chyba że piszesz w notatniku to ta informacja nic Ci nie da, ale wystarczy zwykły notepad++.

Po drugie jest napisane

Undefined variable: str

Co oznacza niezdefiniowana zmienna o nazwie "str".

Musisz nauczyć się korzystać z tych informacji.

I chciałbym się jeszcze dowiedzieć czemu to ma służyć

if( isset($_GET['submit']) ){
        $str = $_GET['data'];
 
        if (($t = strtotime($str)) === false  ) {
            echo "Problem z data";
        } else {
            setcookie('data',$t,time()+3600);
            $_COOKIE['data'] = $t;
        }
    }
 
        if(isset($_GET['submit']) ){
 
        $str1 = $_GET['data'];
        setcookie('data',$str1,time()+3600);
        $_COOKIE['data'] = $str1;
        }

Przeanalizuj to. Jedyna różnica to to, że w pierwszym sprawdzasz czy string ma poprawny format, a reszta jest powtórzeniem tych samych operacji. Wystarczy, że w pierwszym zrobisz tak (dodasz do ciastka ten string, bo tak w pierwszym if dodajesz timestamp, a potem w drugim if zmieniasz tą wartość na string, żadnego w tym sensu nie widać):

 setcookie('data',$str,time()+3600);
 $_COOKIE['data'] = $str;

1 użytkowników online, w tym zalogowanych: 0, gości: 1