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

Prostszy sposób na połączenie formularza z php

Object Storage Arubacloud
0 głosów
435 wizyt
pytanie zadane 22 maja 2020 w PHP przez Martita Bywalec (2,470 p.)

Proszę o pomoc. Szukałam.

Chciałabym poznać drugi sposób połączenia formularza z php

<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<=2020;++$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>

Nie chcę tworzyć z if isset bo taki mam teraz . Chce mieć kod gdzie jest mało pisania. Dlatego utworzyłam poniższy kod, ale nie wiem gdzie jest błąd .

<?php
  $dzien = date('N', strtotime($_POST['dzien']. $_POST['miesiac']. $_POST['rok']));
    $dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
    echo "Urodziłaś się w ";
    echo $dni_tygodnia[$dzien];

?>

 

 

 

komentarz 22 maja 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)
A co się dzieje? Coś źle się pokazuje? Nie działa wcale? Wyskakuje jakiś komunikat błędu? Bo nikt się nie będzie raczej domyślał.
komentarz 22 maja 2020 przez Martita Bywalec (2,470 p.)
Przepraszam

Wybieram datę 19.06.1983

Klikam Sprawdż

Pokazuje Piątek a powinien pokazać NIEDZIELA
komentarz 22 maja 2020 przez SzkolnyAdmin Szeryf (86,360 p.)
Funkcja date zwraca 7 dla podanych wartości. A co jest w tablicy $dni_tygodnia? Może tam tkwi błąd.

1 odpowiedź

0 głosów
odpowiedź 22 maja 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

Po pierwsze myślę, że format daty jest niezrozumiały dla strtotime, bo zapis:

strtotime($_POST['dzien']. $_POST['miesiac']. $_POST['rok'])

dla podanej daty 19.06.1983 to będzie strtotime('1961983'). Nie ma tam zera przed miesiącem, bo go nie masz w select i nie ma też kropek, bo te służą do łączenia ciągów (konkatenacja), a nie są wstawiane w samą datę. Bez 0 przed miesiącem sobie pewnie poradzi, ale taki format jest raczej błędny, dodałbym kropki i spróbował.

Po drugie, jak właśnie sprawdziłem, date dla formatu N da numer dnia tygodnia z zakresu 1-7: https://www.php.net/manual/en/function.date.php a Twoja tablica ma 7 elementów, ale o indeksach od 0 do 6 (w programowaniu często liczymy od zera). W związku z tym będzie próbował dostać się do $dni_tygodnia[7], a to spowoduje błąd, bo takiego elementu nie ma. Najprościej chyba zapisać, aby tablica była numerowana od 1 i wtedy element o indeksie 7 faktycznie będzie niedzielą.

Tak przy okazji, w kodzie raczej niezbyt liczy się to, aby było mało pisania. Ważniejsze jest to, aby był generalnie dobry i czytelny, a nie najkrótszy. Tutaj brakuje Ci np. sprawdzenia czy $_POST['dzien'] i pozostałe wartości w ogóle zostały przesłane albo walidacji ich - co gdy wybiorę nieistniejącą datę lub w ogóle wyślę tam literki zamiast dni tygodnia.

komentarz 22 maja 2020 przez Martita Bywalec (2,470 p.)
Mam formularz z 3 listami dzień, miesiąc i rok. Tam nie ma kropek.
komentarz 22 maja 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

No właśnie. A więc wykonuje się strtotime('1961983'), co nie jest dla niego zrozumiałym formatem. Jak się da jakiś akceptowalny format, np. strtotime('19.6.1983') to sobie poradzi, nawet sprawdziłem: https://3v4l.org/kHFO1

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

Pokazuje piątek zamiast NIEDZIELA.

Jestem początkująca i zielona z php. Przeczytałam manual php ale nic nie zrozumiałam. Nie wiem jak to zrobić żeby było poprawnie.  Zmieniłam z N na w

<?php
  $dzien = date('w', strtotime($_POST['dzien'].$_POST['miesiac'].$_POST['rok']));
    $dni_tygodnia = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota','Niedziela');
    echo "Urodziłaś się w ";
    echo $dni_tygodnia[$dzien];

?>

 

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

Bardzo mi zależy żeby nauczyć się php. Proszę o pomoc.

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

Teraz pokazuje czwartek zamiast niedziela

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

?>

 

komentarz 22 maja 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

Nie duplikuj pytań z dopytaniem o to samo, cały problem rozwiązujemy w jednym temacie, aby zachować porządek. Z resztą widzę, że to nie pierwsze pytanie o to, bo tu było to samo: https://forum.pasja-informatyki.pl/489687/strtotime-skrypt-do-sprawdzenia-dnia-tygodnia-urodzenia-sie-uzytkownika, więc to jest już kolejny duplikat. Nie nadużywamy też formatowania, tj. czerwonych czy pogrubionych czcionek, gdy nie ma to sensu. Nie ma też sensu poganiać i dodawać komentarza za komentarzem, zanim ktoś zdąży odpowiedzieć. Jesteśmy tu wzajemnie, aby sobie pomagać, ale zakres tego jest ograniczony przez możliwości, czas, wiedzę itd. i to wydaje się, że powinno być dla wszystkich oczywiste.

Tak jak napisałem, to: strtotime('1961983') nie jest dla niego zrozumiałe i chociażby taki format: strtotime('19.6.1983') zadziała. Skoro masz zapis bez kropek, to wystarczy dodać kropki. Skoro tam robisz konkatenację samych wartości z $_POST, to na logikę wystarczy dodać konkatenacje kropek jako stringów i zadziała:

strtotime($_POST['dzien'] . '.' . $_POST['miesiac'] . '.' . $_POST['rok'])

A w tym przypadku to nawet czytelniejszy byłby zapis z cudzysłowami i podstawienie wartości:

strtotime("{$_POST['dzien']}.{$_POST['miesiac']}.{$_POST['rok']}")

- zapis w ' ' wykonuje się bez interpretacji, czyli ciąg znaków zostanie użyty dokładnie tak jak jest wpisany, a w " " może być interpretowany i np. podstawione zostaną podane tam zmienne. W takiej sytuacji, gdy kropki są wewnątrz całego stringa, też to zadziała. To są podstawy składni, jeśli nie rozumiesz to zachęcam jeszcze raz do powrotu na sam początek nauki, do zapisu stringów.

Jeśli chodzi o date() i format w to jak najbardziej, możesz go użyć, ale w dokumentacji jest wyraźnie przy nim napisane: 

0 (for Sunday) through 6 (for Saturday)

Mamy tu inny format i także inną kolejność dni. 0 to będzie niedziela, 1 poniedziałek, a 6 sobota. W takiej sytuacji nie pasuje więc Twoja tablica z nazwami dni, gdzie 0 to poniedziałek, 1 wtorek, a 6 niedziela. Jeśli wolisz, to możesz skorzystać z w, wystarczy zmienić nazwy dni w tablicy, ale to jest mniej naturalne dla nas, bo tydzień zaczynamy od poniedziałku. Dlatego zamiast tego, jak mówiłem, pozostawiłbym N i zapisał, aby nazwy dni zaczęły się od indeksu 1, a nie 0 i wtedy poniedziałek to będzie 1, a niedziela będzie miała 7:

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

Zapis 1 => mówi, aby zaczął numerację od 1. A tak w ogóle jak już chcesz skracać kod, to można użyć zapisu [ ] zamiast array(). To wszystko to też podstawy tablic.

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

Nie duplikuj pytań z dopytaniem o to samo, cały problem rozwiązujemy w jednym temacie, aby zachować porządek. Z resztą widzę, że to nie pierwsze pytanie o to, bo tu było to samo: https://forum.pasja-informatyki.pl/489687/strtotime-skrypt-do-sprawdzenia-dnia-tygodnia-urodzenia-sie-uzytkownika, więc to jest już kolejny duplikat.

TO NIE JEST TEN SAM TEMAT TYLKO PODOBNY 

Uczę sę na przykładach.

Nie chce  zrobić if tylko prostrzym sposobem

komentarz 22 maja 2020 przez Martita Bywalec (2,470 p.)
Czy możesz polecić mi jakiś zrozumiały, krok po kroku kurs PHP?

Ja muszę mieć dużo przykładów żeby zrozumieć o co chodzi.

Dzięki
komentarz 22 maja 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

Caps lock się zaciął? ;) Temat jest o to samo, jak sama zauważasz "podobny" i to nawet bardzo podobny, bo dotyczył bardzo podobnego kodu i przede wszystkim z tym samym celem - znaleźć błąd w skrypcie do sprawdzenia dnia urodzenia. Zwróciłem uwagę, aby nie powielać tematów, tylko tyle.

To super że się uczysz, ale wszyscy jesteśmy tu, aby się uczyć i rozwijać, więc to nic nadzwyczajnego i nie daje prawa zadania nie wiadomo ilu pytań na ten sam temat, bo wtedy jedna osoba utrudni życie wszystkim pozostałym.

No więc pokazałem 2 rzeczy, które wg mnie są źle zapisane i jak to poprawisz, to kod powinien zadziałać :) Jeśli nie to chętnie pomogę (na tyle ile wiem i mam czas), ale musi być też Twoja wola, aby zagłębić to samemu - poszukać, poświęcić czas, na spokojnie się nad tym wszystkim zastanowić i to zrozumieć. Nie wiem do czego dążysz konkretnie, jak mówiłem w programowaniu nie chodzi o to, aby usilnie zapisać kod najkrótszym sposobem czy zrobić wszystko, aby nie było warunku.

W temacie kursu PHP, to jeśli mogę zrobić małą autopromocję, napisałem własny kurs: https://www.phpdevs.pl/ Co prawda nie jest skończony i od dłuższego czasu niestety nie pojawiło się tam nic nowego oprócz aktualizacji kilku treści, ale generalnie całe podstawy są. Może coś Ci to pomoże, starałem się pisać tak, aby zrozumiał każdy, ale nie gwarantuję.

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

Poprawiłam to ale tym razem wyskakuje błąd: Parse error: syntax error, unexpected ';', expecting ')' in $dzien = date('N', strtotime($_POST['dzien'].  '.' . $_POST['miesiac'].  '.' . $_POST['rok']);  

Próbowałam 

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

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

I tak 

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

i tak 

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

Nie mam już pomysłu jak to zrobić.

komentarz 22 maja 2020 przez Martita Bywalec (2,470 p.)
Zaraz się biorę za przerabianie tego kursu Dzięki
komentarz 22 maja 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)
Właściwy jest pierwszy zapis, tylko że zabrakło Ci zamknięcia jednego nawiasu na końcu. Sprawdzaj uważnie. Otwierasz date(, otwierasz strtotime(, a zamykasz na końcu tylko jeden. Pozostałe nie mają prawa zadziałać, bo nie będzie wiedział co zrobić ze stringami zapisanymi obok siebie (ani nie mają kropek żeby je połączyć, ani przecinków jakoby to były kolejne argumenty, nic).
komentarz 22 maja 2020 przez Martita Bywalec (2,470 p.)
Wielkie dzięki teraz już rozumiem .

Podobne pytania

0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 19 stycznia 2021 w PHP przez CSSoup Mądrala (6,460 p.)
0 głosów
2 odpowiedzi 907 wizyt
0 głosów
1 odpowiedź 298 wizyt
pytanie zadane 7 maja 2017 w PHP przez PieroQQ Początkujący (420 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...