Wątek przeniesiony 2017-11-16 18:47 z PHP przez Patryk27. Powód: Wątek dotyczący podstaw

Skrypt liczący ilość dni do urodzin

Odpowiedz Nowy wątek
2017-11-16 18:30
Złoty Ogrodnik
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ń ?

edytowany 1x, ostatnio: furious programming, 2017-11-16 18:49
Taguj wątki nazwami języków/technologii. - furious programming 2017-11-16 18:49

Pozostało 580 znaków

2017-11-16 18:47
0

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


edytowany 1x, ostatnio: Patryk27, 2017-11-16 18:47

Pozostało 580 znaków

2017-11-16 18:49
Uczynny Mleczarz
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.

Pozostało 580 znaków

2017-11-16 18:53
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).

Pozostało 580 znaków

2017-11-16 19:47
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"

edytowany 1x, ostatnio: Manuel.Artificer, 2017-11-16 19:49
actual nie znaczy aktualny. - Patryk27 2017-11-16 19:49
no to currentDate - Manuel.Artificer 2017-11-16 19:52

Pozostało 580 znaków

2017-11-16 20:29
Czarny Wąż
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.";
    }
?>
edytowany 2x, ostatnio: furious programming, 2017-11-16 23:25

Pozostało 580 znaków

2017-11-16 20:37
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ś.

edytowany 1x, ostatnio: Manuel.Artificer, 2017-11-16 20:38

Pozostało 580 znaków

2017-11-16 21:37
Wielki Mleczarz
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

Pozostało 580 znaków

2017-11-16 21:38
Wielki Mleczarz
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.";
    }
?>

Pozostało 580 znaków

2017-11-16 23:21
Krwawy Jeleń
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>";
 
    }
?>

Pozostało 580 znaków

2017-11-17 00:08
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;
edytowany 5x, ostatnio: Manuel.Artificer, 2017-11-17 00:27

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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