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

zrobiłem Narzędzie do śledzenia postanowień w PHP i chce się pochwalić i proszę o ocenę !

Object Storage Arubacloud
+1 głos
356 wizyt
pytanie zadane 29 lipca 2017 w Nasze projekty przez eliano Gaduła (3,640 p.)
edycja 29 lipca 2017 przez eliano
Witam, zrobiłem narzędzie do zaznaczania postanowień w php !

dostępne pod adresem :

http://postanowienia.cba.pl

 

pliczki do oceny i zobaczenia sobie:

http://postanowienia.cba.pl/habits.zip

 

polecam i zapraszam cieplutko !
1
komentarz 29 lipca 2017 przez Vento Pasjonat (17,120 p.)
wrzuć na gita poza tym daj link po http bo https wywala brak certyfikatu..

4 odpowiedzi

+4 głosów
odpowiedź 29 lipca 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)

To ja trochę o kodzie, choć nie zagłębiałem się aż tak bardzo.

$table = "user".$_SESSION['id']."_".$_SESSION['rok']."_".$_SESSION['miesiac'];
$sql = "UPDATE ".$table." SET habit1=3 WHERE dayid=".$day." ";

- Dobrze rozumiem, że dla każdego użytkownika i każdego miesiąca danego roku tworzysz nową tabelę w bazie? To lekko mówiąc słabe rozwiązanie.

- Wszędzie gdzie łączysz się z bazą robisz to osobno, tj coś w stylu

$polaczenie = new mysqli($db_host, $db_user, $db_password, $db_name);
		if ($polaczenie->connect_errno!=0){
			throw new Exception(mysqli_connect_errno());
		}

To trochę słabe, co jak będziesz chciał zmienić bazę na inną? Albo zwracaną treść błędu? Musisz to wszędzie robić. Poza tym polecam PDO, przy zmianie bazy danych jest właśnie o wiele prościej.

if ($rezultat = $polaczenie->query("SELECT * FROM users WHERE nick='$login'")) {

- Zamiast tego binduj parametry, wtedy masz pewne zabezpieczenie przed sql injection, bo zapytanie i wartości są wysyłane osobno do bazy.

$haslo = $_POST['haslo'];

- Gdy ktoś np. ręcznie wyśle żądanie i nie doda takiej danej, interpreter rzuci ostrzeżenie o nieistniejącym elemencie tablicy. Teoretycznie to nic groźnego, ale wypadałoby to sprawdzać - isset / ?? albo jeszcze lepiej używać filter_input.

- Wrzucać wszystkie dane użytkownika takie jak email do sesji? No nie wiem, moim zdaniem wystarczyłoby zapisać samo id i przy każdym wejściu pobierać te dane z bazy.

- Nazewnictwo w kodzie - raz masz po polsku, raz po angielsku. Polecam ujednolicić do angielskiego. Poza tym polecałbym stosować zapis cammelCase. Coś takiego jak function ileBlankCellsBegging($miesiac, $rok) to już w ogóle wygląda śmiesznie.

echo $_SESSION["$sessionVarName"];

- Po co te cudzysłowy? Zupełnie zbędne.

strlen($nick)<3

- Nie wiem czy to ważne akurat w tym miejscu, ale strlen ma problem z polskimi znakami. Polecam używać mb_strlen.

$day = date('j');

- Lepiej przerzucić się na stałe na klasę DateTime, daje większe możliwości.

$secret = '	6Ld6ySIUAAAAAH5X7ioxXNaMOaFJNvDF_Diu40OY';

- Chyba prawdziwy, takich rzeczy raczej się publicznie nie udostępnia w końcu to secret.

<?php echoSessionIfExist('e_nick')?>

- Zamiast tego w funkcji bym nie wyświetlał nicku, a zwracał go (return). Wtedy możesz użyć znaczników <?= ?> do wyświetlenia, a funkcja staje się bardziej uniwersalna (bo w części miejsc kodu możesz chcesz np. przypisać nick do jakiejś zmiennej a nie wyświetlać).

- Po co ten komentarz z oznaczeniami dat na końcu każdego pliku? :P Rozumiem że to pewnie dla Ciebie, dla ułatwienia, ale docelowo raczej nie ma sensu aby takie coś ładowało w każdym pliku na produkcji, zbędne dane tylko.

- Standardowo dość: mieszasz kod HTML z PHP, kod staje się coraz mniej czytelny. Polecam oddzielić logikę od widoku, np. przy użyciu systemu szablonów Twig.

- Niektóre obrazki z katalogu img bardzo dużo ważą. Nie wiem czy wszystkie są używane, ale np. 2,3MB to dużo. a wątpię, że na stronie potrzebujesz tła o rozmiarze 4912x3264px. Przeskaluj to. Fakt, przeważnie każdy z nas ma teraz dostęp do szybkiego internetu bez limitów, ale są ograniczone łącza mobilne, są niskie prędkości, obciążenia serwerów... Skoro można ograniczyć ilość przesyłanych danych to dlaczego nie?

- Po co puste atrybuty, np. value="" albo class=""? Niby nie szkodzą, ale jak dla mnie bez sensu.

- Te wszystkie skrypty, jquery, bxslider, na pewno potrzebne Ci w head? Bo wydaje mi się że nie, a dobra praktyka mówi, aby umieszczać skrypty na końcu sekcji body, aby przeglądarka najpierw ładowała stronę, a nie pobierała skrypty.

No cóż... Nie wiem na jakim etapie nauki jesteś, ale żadna poważna aplikacja obecnie tak nie wygląda. Pisze się obiektowo, używa Composera, autoloadingu z PSR-4. Większość też używa frameworków, chociaż oczywiście i czystego PHP trzeba się najpierw jakoś nauczyć. Do tego korzystaj z Gita i kod umieszczaj np. na GitHubie, wtedy tworzysz swoje "portfolio" (akurat tym konkretnym nie za bardzo radzę się chwalić) i każdy może go łatwo przejrzeć, poprawić itd. A umieszczać aplikacje do testów i pokazania polecam jednak na jakimś poważniejszym hostingu, bo cba.pl z reklamami nie wygląda zachęcająco. Pewnie chodzi też o koszty i rozumiem, bo sam tak zaczynałem. Lecz jeżeli masz zamiar dalej się w to zagłębiać wypadałoby znaleźć lepsze rozwiązanie.

Polecam też zajrzeć tutaj: http://www.phptherightway.com/ oraz tu https://phpbestpractices.org/ i jeszcze zapoznać się z PSR-2, bardzo popularnymi standardami określającymi wygląd kodu: http://www.php-fig.org/psr/psr-2/

Och, dość długa mi ta wypowiedź wyszła.. I żeby nie było, nie chcę Cię jakoś skrytykować, zniechęcić czy coś. Wystawiłeś kod do oceny, więc tylko to zrobiłem. Całość oceniam kiepsko.

1
komentarz 29 lipca 2017 przez eliano Gaduła (3,640 p.)

- Dobrze rozumiem, że dla każdego użytkownika i każdego miesiąca danego roku tworzysz nową tabelę w bazie? To lekko mówiąc słabe rozwiązanie.

tak, długo rozważałem jak to rozwiązać i wciąż mam mam poczucie żę to nie jest idealne rozwiązanie.. masz jakiś lepszy pomysł? 

To trochę słabe, co jak będziesz chciał zmienić bazę na inną?

...planowałem że po prostu zmienie dane w connect.php 

Zamiast tego binduj parametry

pierwsze słyszę o czymś takim...  - poczytam o tym

Gdy ktoś np. ręcznie wyśle żądanie i nie doda takiej danej, interpreter rzuci ostrzeżenie o nieistniejącym elemencie tablicy. Teoretycznie to nic groźnego, ale wypadałoby to sprawdzać - isset / ?? albo jeszcze lepiej używać filter_input.

no a 

if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' )

nie wystarcza ??

Wrzucać wszystkie dane użytkownika takie jak email do sesji? No nie wiem, moim zdaniem wystarczyłoby zapisać samo id i przy każdym wejściu pobierać te dane z bazy.

ok, zmienie to

polecałbym stosować zapis cammelCase.

no właśnie taki stosuję a nawet nie wiedziałem że taka konwencja nazewnicza ma swoją nazwę - po prostu widziałem w innych kodach że ludzie tak robią xd.  

- Po co te cudzysłowy? Zupełnie zbędne.

faktycznie

ale strlen ma problem z polskimi znakami. Polecam używać mb_strlen.

ok

Lepiej przerzucić się na stałe na klasę DateTime, daje większe możliwości.

 pracuję nad tym

Chyba prawdziwy, takich rzeczy raczej się publicznie nie udostępnia w końcu to secret.

o kurde, nie przemyślałem tego.. mam nadzieję że nic złego się przez to nie stanie 

Zamiast tego w funkcji bym nie wyświetlał nicku, a zwracał go (return). Wtedy możesz użyć znaczników <?= ?> do wyświetlenia, a funkcja staje się bardziej uniwersalna (bo w części miejsc kodu możesz chcesz np. przypisać nick do jakiejś zmiennej a nie wyświetlać).

nie rozumiem? czyli że jak to powinienem zrobić? 

Po co ten komentarz z oznaczeniami dat na końcu każdego pliku? :P Rozumiem że to pewnie dla Ciebie, dla ułatwienia, ale docelowo raczej nie ma sensu aby takie coś ładowało w każdym pliku na produkcji, zbędne dane tylko.

to prawda

 Polecam oddzielić logikę od widoku, np. przy użyciu systemu szablonów Twig.

 to będzie konieczność w najbliższej przyszłości

Niektóre obrazki z katalogu img bardzo dużo ważą. Nie wiem czy wszystkie są używane, ale np. 2,3MB to dużo. a wątpię, że na stronie potrzebujesz tła o rozmiarze 4912x3264px. Przeskaluj to. 

dobra 

Po co puste atrybuty, np. value="" albo class=""

bo za pomocą pehapa umieszczam tam wartości gdy jest taka potrzeba

dobra praktyka mówi, aby umieszczać skrypty na końcu sekcji body

 wiem o tym ale zapomniałem zastosować - za chwilę to przestawię

Och, dość długa mi ta wypowiedź wyszła.. I żeby nie było, nie chcę Cię jakoś skrytykować, zniechęcić czy coś. Wystawiłeś kod do oceny, więc tylko to zrobiłem. Całość oceniam kiepsko.

to prawda, niezły artykuł wyszedł pojawiło się sporo nowych dla mnie pojęć do odkrycia i narzędzi do zastosowania. absolutnie nie czuję się skrytykowany - wręcz przeciwnie - czuję się zmotywowany aby ponaprawiać to wszystko i zastosować wymienione narzędzia !

Dziękuje serdecznie za wyczerpującą odpowiedź

komentarz 29 lipca 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)

tak, długo rozważałem jak to rozwiązać i wciąż mam mam poczucie żę to nie jest idealne rozwiązanie.. masz jakiś lepszy pomysł? 

Nie do końca rozumiałem jak ten serwis działa, więc pozwoliłem sobie założyć konto i chyba już łapię. Ja bym zrobił tabelę na użytkowników oraz na postępy (osiągnięcia, czy jak to nazwać) użytkowników. Tabela z użytkownikami standardowo, wszystkie dane i id. W tabeli z postępami: id użytkownika którego dotyczy postęp, data, postęp (nie wiem jak tam to zapisujesz, zgaduję że liczbowo).

Wydaje mi się to proste i logiczne, nie wiem dlaczego aż tak sobie skomplikowałeś. Gdy potrzebujesz wyciągnąć wszystkie postępy danej osoby dajesz WHERE z jej id. Gdy tylko z określonego dnia dokładasz jeszcze datę do WHERE. Gdy z przedziału możesz użyć WHERE z BETWEEN. Nie zagłębiałem się dokładnie, więc jeśli czegoś w tej kwestii nie zrozumiałem to wybacz.

...planowałem że po prostu zmienie dane w connect.php 

Tym zmienisz dane bazy, np. użytkownika czy hasło. A co gdybym Ci teraz powiedział, że musisz zmienić bazę z MySQL np. na PostgreSQL? Musisz odnaleźć każde new mysqii i zamienić je na coś innego. Gdybyś korzystał z PDO to byłaby to kwestia zmiany kilku literek w dsn (i ewentualnie kwestia dopasowania zapytań, w czystym SQLu zawsze taki problem będzie).

pierwsze słyszę o czymś takim...  - poczytam o tym

Warto, proste i jednocześnie pewne zabezpieczenie przed atakami sql injection.

no a 

1

if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' )

nie wystarcza ??

Tym tylko sprawdzisz czy żądanie zostało wysłane metodą POST. Nie sprawdzisz czy zawiera jakiekolwiek dane, ani czy zawiera konkretnie którąkolwiek z nich. Mogę sobie zrobić tak:


Jest żądanie typu POST? No jest, ale większości danych nie ma ;) Co prawda na serwerze produkcyjnym i tak wyświetlanie błędów powinno być wyświetlone (nie wiem jak jest u Ciebie), ale tak czy siak moim zdaniem unikać jakichkolwiek ostrzeżeń.

no właśnie taki stosuję a nawet nie wiedziałem że taka konwencja nazewnicza ma swoją nazwę - po prostu widziałem w innych kodach że ludzie tak robią xd.  

new mysqli($db_host ,$db_user ,$db_password ,$db_name);

Jak widać nie zawsze taki stosujesz :P

nie rozumiem? czyli że jak to powinienem zrobić? 

Twoja funkcja od razu wyświetla wartość tej zmiennej. Wydaje mi się osobiście, że byłaby bardziej uniwersalna gdyby zwracała dane (return) zamiast je wyświetlać (echo). Gdybyś z taką funkcją jaką masz chciał przypisać te dane do zmiennej to jak to zrobisz? Nie da się, bo funkcja od razu wyświetla. A gdyby zwracała możesz zrobić

$nick = echoSessionIfExist('nick');
// albo 
echo echoSessionIfExist('nick');

(tylko w takiej sytuacji zmieniłbym też nazwę funkcji bo nie pasuje)
O <?= ?> napisałem jako dodatek, zamiast pisać

<?php echo echoSessionIfExist('nick'); ?>

można zrobić tak i efekt będzie ten sam:

<?= echoSessionIfExist('nick'); ?>

absolutnie nie czuję się skrytykowany - wręcz przeciwnie - czuję się zmotywowany aby ponaprawiać to wszystko i zastosować wymienione narzędzia

Cieszę się, tylko o to mi chodziło ;) 

+1 głos
odpowiedź 29 lipca 2017 przez CenterPL Pasjonat (19,070 p.)
1. jak się weźmie i ominie ostrzeżenie to wywala stronę startową nginxa.

2. Pliczku nie ma, zamiast tego jest radosny błąd 404 :D
komentarz 29 lipca 2017 przez eliano Gaduła (3,640 p.)
zmieniłem na http i już działa
komentarz 29 lipca 2017 przez CenterPL Pasjonat (19,070 p.)
ok, zaraz zerknę.

Mmo wszystko i tak polecam tak jak @Vento wspomniał, żebyś wrzucił to na Github'a
3
komentarz 29 lipca 2017 przez CenterPL Pasjonat (19,070 p.)
Nie mam bardzo czasu więc tak pobieżnie rzuciłem okiem, bezpieczeństwo sprawdziłem tylko pod SQL Injection i to bardzo proste przypadki.

1. Jakiego wzorca się trzymasz? Żadnego zdaje się. MVC się kłania, najprościej :)

2. Pisanie aplikacji strukturalnie... bardzo trudno będzie Ci ją jakkolwiek rozwijać. Teraz chyba nikt już tak tego nie robi. Poza tym napisanie jej obiektowo zwiększy czytelność kodu, dobrze napisana aplikacja będzie podatna na rozwój.

3. Starasz się bardzo nie mieszać logiki i widoku, to dobrze, natomiast dałoby sie w ogóle wyabstrahować php od html'a. Warto się zainteresować systemami szablonów, tutaj mogę polecic twiga

4. Nazewnictwo zmiennych i funkcji - albo po polsku, albo po angielsku, takie kwiatki:

- ileBlankCellsEnd
- zrobTabliceZDniamiMiesiaca
ogólnie część po polsku, część po angielsku, a nawet mieszanki. - moja rada, zostań przy angielskim, tylko i wyłącznie. To samo tyczy się nazw plików.

5. Powiedziałbym, że brakuje testów jednostkowych...

Na razie tyle, bo muszę lecieć.
+1 głos
odpowiedź 29 lipca 2017 przez Boshi VIP (100,240 p.)
Kod jest bardzo słaby i powtarzalny. Do cv bym to umieścił tylko na jakiś staż gdzie wymagane są podstawy php, albo w ogóle. W przypadku juniora więcej to szkód narobi niż pożytku.
0 głosów
odpowiedź 30 lipca 2017 przez SeriGog Obywatel (1,510 p.)
Fajnie by było jakbyś wystilizował css plik witamy.php, a tak to spoko :)

Podobne pytania

+3 głosów
2 odpowiedzi 328 wizyt
+1 głos
5 odpowiedzi 351 wizyt
pytanie zadane 30 grudnia 2018 w Offtop przez shotokan Nałogowiec (39,660 p.)
+4 głosów
4 odpowiedzi 1,018 wizyt

92,551 zapytań

141,393 odpowiedzi

319,522 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!

...