• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

strtotime - Skrypt do sprawdzenia dnia tygodnia urodzenia się użytkownika

Object Storage Arubacloud
+1 głos
460 wizyt
pytanie zadane 20 maja 2020 w PHP przez Martita Bywalec (2,470 p.)

 Skrypt do sprawdzenia dnia tygodnia urodzenia się  użytkownika

Szukałam w internecie i nie znalazłam. Męcze się z tym już od 7.00 rana.
Skrypt wyświetla błąd  $dzien = date('N', strtotime($_POST['$rok.$miesiac.$dzien']));

Proszę o wytłumaczenie.jak powinien wyglądać prawidłowy kod i o poprawienie błędu.

<?php
     $dzien = date('N', strtotime($_POST['dzien']));
      $miesiac = date('N', strtotime($_POST['miesiac']));
       $rok = date('N', strtotime($_POST['rok']));
    $dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');

    echo $dni_tygodnia[$dzien-1];
?>
<form action="tydzien.php" method="post">
       <label for="dzień">Dzień:</label>
     <select name="dzien">
        <?php 
              for ($i=1;$i<=31;++$i)

            echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select> </br></br>
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php 
                 for($l=1;$l<=12;++$l)
             echo '<option value="'.$l.'">'.$l.'</option>';
        ?>
    </select></br></br>
<label for="rok">Rok:</label>
    <select name="rok">
        <?php 
                 for($t=1900;$t<=2010;++$t)
             echo '<option value="'.$t.'">'.$t.'</option>';
        ?>
    </select> </br>
         </br></br><input type="submit" name="sprawdz"  value="Sprawdź dzień tygodnia" />
         </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>

 

3 odpowiedzi

+1 głos
odpowiedź 21 maja 2020 przez VBService Ekspert (253,120 p.)
wybrane 21 maja 2020 przez Martita
 
Najlepsza

Zamiast tego kodu, który podałaś na wstepie: 
 

     $dzien = date('N', strtotime($_POST['dzien']));
      $miesiac = date('N', strtotime($_POST['miesiac']));
       $rok = date('N', strtotime($_POST['rok']));
    $dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
 
    echo $dni_tygodnia[$dzien-1];

Wpisz tak:
 


    if(isset( $_POST['dzien'],$_POST['miesiac'],$_POST['rok'])) {
        $dzien = $_POST['dzien'];
        $miesiac = $_POST['miesiac'];
        $rok = $_POST['rok'];
    
        $data_z_form = date_create_from_format("d-m-Y", $dzien . "-" . $miesiac . "-" . $rok);
        $dni_tygodnia = array('', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
        $dzien_tygodnia = date_format($data_z_form, 'N');
    
        echo $dni_tygodnia[$dzien_tygodnia];
    } else {
        echo "Nie podano daty";
    }

 

komentarz 21 maja 2020 przez Martita Bywalec (2,470 p.)
edycja 21 maja 2020 przez Martita

Ok dzięki , ale nadal po wybraniu z formularza daty i kliknięciu sprawdź nie pokazuje się dzień tygodnia

<form action="tydzien.php" method="post">
       <label for="dzień">Dzień:</label>
     <select name="dzien">
        <?php 
    	      for ($i=1;$i<=31;++$i)
 
            echo '<option value="'.$i.'">'.$i.'</option>';
        ?>
    </select> </br></br>
<label for="miesiac">Miesiąc:</label>
    <select name="miesiac">
        <?php 
    			 for($l=1;$l<=12;++$l)
    	     echo '<option value="'.$l.'">'.$l.'</option>';
        ?>
    </select></br></br>
<label for="rok">Rok:</label>
    <select name="rok">
        <?php 
    			 for($t=1900;$t<=2010;++$t)
    	     echo '<option value="'.$t.'">'.$t.'</option>';
        ?>
    </select> </br>
	     </br></br><input type="submit" name="sprawdz"  value="Sprawdź dzień tygodnia" />
	     </br></br><input type="reset" name="reset"  value="Wyczyść" />
    </form>
 <?php
 
$dzien = date('N', strtotime($_POST['dzien']));
$miesiac = date('N', strtotime($_POST['miesiac']));
$rok = date('N', strtotime($_POST['rok']));
$dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
 
echo $dni_tygodnia[$dzien-1];

?>

 

komentarz 21 maja 2020 przez Martita Bywalec (2,470 p.)

Nadal po wybraniu daty i kliknięciu sprawdź data znika i nie okazuje się prawidłowy dzien tygodnia. Np. wybieram 19-06-1983 klimam sprawdź i powinno pokazać mi się Niedziela  a nie pokazuje.

<?php
 
$dzien = date('N', strtotime($_POST['dzien']));
  $miesiac = date('N', strtotime($_POST['miesiac']));
   $rok = date('N', strtotime($_POST['rok']));
$dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
 
echo $dni_tygodnia[$dzien-1];
?>

 

komentarz 21 maja 2020 przez VBService Ekspert (253,120 p.)

zamień go na ten

1
komentarz 21 maja 2020 przez Martita Bywalec (2,470 p.)

Teraz rozumiem o co chodzi. Jakbym miała podobne zadanie to bym wiedziała już jak zrobić. Wielkie dzięki  VBService 

0 głosów
odpowiedź 20 maja 2020 przez eunstachy Stary wyjadacz (14,180 p.)

 

$dzien = date('N', strtotime($_POST['dzien']));
$miesiac = date('N', strtotime($_POST['miesiac']));
$rok = date('N', strtotime($_POST['rok']));

To jest źle. Powinieneś zbudować datę na podstawie danych z $_POST. Czyli teoretycznie coś takiego

$date = $_POST['dzien'] . '-' . $_POST['miesiac'] . '-' . $_POST['rok']

Następnie użyć funkcji 

$week_day_no = date('N', strtotime($date))

Jest tylko jedno ALE.

Funkcja strtotime przyjmuje datę w dwóch formatach - amerykański "m/d/y" lub europejski "d-m-y". Poszukaj w dokumentacji co oznacza "d" oraz "m" w formacie daty, spójrz w jaki sposób generujesz swoją datę i spróbuj samemu dojść do tego, dlaczego ten skrypt nie zawsze będzie działać. Jeśli nie uda Ci się znaleźć odpowiedzi to daj znać :) 

komentarz 20 maja 2020 przez Martita Bywalec (2,470 p.)
edycja 20 maja 2020 przez Martita
dzięki wielkie już sprawdzam

d- Dzień miesiąca,

m - Liczbowa forma miesiąca,

ALE Czy po wybraniu przez użytkownika daty urodzenia dzień, miesiąc, rok i po klinkięciu sprawdź wyświetli mu się dzień tygodnia w którym się urodził?
komentarz 20 maja 2020 przez Martita Bywalec (2,470 p.)
<?php
$date = $_POST['dzien'] . '-' . $_POST['miesiac'] . '-' . $_POST['rok']
$dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
 
    echo $dni_tygodnia[$date];
?>

Gdzieś jest jeszcze błąd ale nie wiem gdzie proszę o pomoc.

komentarz 20 maja 2020 przez VBService Ekspert (253,120 p.)
edycja 20 maja 2020 przez VBService

To jest tablica
$dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela'); = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');

Akceptowalne jest tylko, gdy
$i = 0
$dni_tygodnia[$i] = 'Poniedziałek'
$i = 1
$dni_tygodnia[$i] = 'Wtorek' itd ...

Ten zapis kodu
$date = $_POST['dzien'] . '-' . $_POST['miesiac'] . '-' . $_POST['rok']

zwraca $date = '20-05-2020' więc w tej formie nie nadaje się do 
                          wywołania elementu z tablicy

$date = $_POST['dzien'] . '-' . $_POST['miesiac'] . '-' . $_POST['rok']
$dzien = $date->format('w') zwróci z podanej daty '20-05-2020' numer dnia
w przedziale 1-poniedziałek, 2-wtorek, ... 7-niedziela

$dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela'); = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
Twoja tablica zwraca 0-poniedziałek,1-wtorek, ... 6-niedziela
Zastosowanie tego prostego triku przed dodanie pierwszego elementu pustego

$dni_tygodnia = array('', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela'); = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
przesuwa 0-pusty, 1-poniedziałek, ... , 7-niedziela

 

0 głosów
odpowiedź 20 maja 2020 przez VBService Ekspert (253,120 p.)
edycja 20 maja 2020 przez VBService


$date = $_POST['dzien'] . '-' . $_POST['miesiac'] . '-' . $_POST['rok']
$datetime = DateTime::createFromFormat('YmdHi', $date);

$datetime = DateTime::createFromFormat('YmdHi', '201908131830');
$dni_tygodnia = array('', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');

$dzien = $datetime->format('w');
echo $dni_tygodnia[$dzien].'<br>';

echo $datetime->format('w').'<br>';
echo $datetime->format('D').'<br>';

PHP date_format() Function
Do szybkich testów: Start write and run your php code online wink

komentarz 20 maja 2020 przez Martita Bywalec (2,470 p.)
Wyskakuje mi błąd składni

błąd składni, nieoczekiwany „$ datetime” (T_VARIABLE)
komentarz 20 maja 2020 przez eunstachy Stary wyjadacz (14,180 p.)

d- Dzień miesiąca, 

m - Liczbowa forma miesiąca,

Tak ALE cytując dokumentację "digits with leading zeros" czyli poprawny zapis daty to np:

04-05-2020

Natomiast w formularzu zarówno dzień jak i miesiąc zaczynają się od liczby 1 bez zera na początku. Tak więc należy najpierw znaleźć sposób aby dodać zero na początku jeśli wybrana wartość dnia lub miesiąca jest mniejsza niż 10.

Dodatkowo istnieje możliwość wybrania np daty 31-6-2020 a jak wiemy czerwiec ma tylko 30 dni, tak wiec w tym przypadku skrypt też nie zadziała.

komentarz 20 maja 2020 przez VBService Ekspert (253,120 p.)
edycja 20 maja 2020 przez VBService
<!DOCTYPE html>
<html>
<body>

<?php
$str = "1";
echo "STR_PAD_BOTH: dodanie jednego zera po obu srtonach 1: " . str_pad($str,3,"0",STR_PAD_BOTH)."<br>";
echo "STR_PAD_LEFT: dodanie jednego zera po lewej srtonie 1: " .str_pad($str,2,"0",STR_PAD_LEFT)."<br>";
echo "STR_PAD_RIGHT: dodanie jednego zera po prawej srtonie 1: " .str_pad($str,2,"0",STR_PAD_RIGHT)."<br>";
?>

</body>
</html

Wynik


STR_PAD_BOTH: dodanie jednego zera po obu srtonach 1: 010
STR_PAD_LEFT: dodanie jednego zera po lewej srtonie 1: 01
STR_PAD_RIGHT: dodanie jednego zera po prawej srtonie 1: 10

PHP str_pad() Function

komentarz 21 maja 2020 przez Martita Bywalec (2,470 p.)
 <?php
 $str = "1";
echo "STR_PAD_BOTH: dodanie jednego zera po obu srtonach 1: " . str_pad($str,3,"0",STR_PAD_BOTH)."<br>";
echo "STR_PAD_LEFT: dodanie jednego zera po lewej srtonie 1: " .str_pad($str,2,"0",STR_PAD_LEFT)."<br>";
echo "STR_PAD_RIGHT: dodanie jednego zera po prawej srtonie 1: " .str_pad($str,2,"0",STR_PAD_RIGHT)."<br>";
 $date = $_POST['dzien'] . '-' . $_POST['miesiac'] . '-' . $_POST['rok']
$dzien = $date->format('w') 
 $dni_tygodnia = array('', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela'); = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
 echo $dni_tygodnia[$dzien];
?>

Nadal nie kumam jak to ma być .Gdzie jest błąd?

komentarz 22 maja 2020 przez eunstachy Stary wyjadacz (14,180 p.)

Działając na zasadzie kopiuj wklej kodu w forum nic się nie nauczysz i przyczyni się to tylko do powstania bałaganu jaki przedstawiłaś powyżej. Zawsze musisz w pełni rozumieć kod.

Działający przykład:

$day = 18;
$month  = 5;
$year = 2020;

if ($day < 10) {
	$day = str_pad($day, STR_PAD_LEFT);
}

if ($month < 10) {
	$month = str_pad($month, STR_PAD_LEFT);
}

$date = $day . '-' . $month . '-' . $year;
$week_day_no = date('w', strtotime($date));

 $week_days = [
 	'Niedziela',
 	'Poniedziałek', 
 	'Wtorek', 
 	'Środa', 
 	'Czwartek', 
 	'Piątek', 
 	'Sobota',
 ];

 echo $week_days[$week_day_no];

Zwracaj również uwagę na estetykę i formatowanie kodu. Nazwy zmiennych zapisuj po angielsku. Każdy element tablicy (jak w przypadku $week_days) zapisuj w nowej linii. Ostatni element w tablicy również ma przecinek na końcu ('Sobota',) i nie jest to błąd a zalecana praktyka.

Podobne pytania

0 głosów
1 odpowiedź 866 wizyt
–5 głosów
0 odpowiedzi 549 wizyt
+1 głos
0 odpowiedzi 1,205 wizyt
pytanie zadane 6 lutego 2017 w PHP przez krispello Obywatel (1,440 p.)

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...