Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

4 Stron V   1 2 3 > »   
Reply to this topicStart new topic
> Najczęstsze błędy w PHP i antywzorce, Kto zna jakieś fajne :)
Sephirus
post
Post #1





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam,

Ostatnio zastanawiałem się, jakie są często spotykane błędy, a raczej złe nawyki bądź po prostu bardzo nie wydajne lub nieoptymalne kawałki kodu jakie można znaleźć/napisać w PHP (IMG:style_emoticons/default/smile.gif) Zbieram też antywzorce. Gdzież indziej mógłbym się o to zapytać niż nie tutaj (IMG:style_emoticons/default/smile.gif)

Przykład wszystkim pewnie dobrze znany:

  1. $tablica; // powiędzmy 1000 elementów, jakichś obiektów, sporych
  2.  
  3. for($i = 0; $i < count($tablica); $i++) {
  4. // jakieś operacje
  5. }


Poprawna forma:

  1. $tablica; // powiędzmy 1000 elementów, jakichś obiektów, sporych
  2.  
  3. $elementsCount = count($tablica);
  4. for($i = 0; $i < $elementsCount; $i++) {
  5. // jakieś operacje
  6. }


@aras785 - masz rację dodałem poprawną formę (IMG:style_emoticons/default/smile.gif)

Szukam podobnych konstrukcji, antywzorców programowania itp. Zależy mi na tym by były one proste (IMG:style_emoticons/default/smile.gif) Nie szukam jakichś skomplikowanych 100 linijkowych kodów na dowód tego, że są źle napisane - chodzi mi o same zamysły (IMG:style_emoticons/default/smile.gif)

Jeśli znacie jakieś piszcie proszę (IMG:style_emoticons/default/wink.gif)

Ten post edytował Sephirus 14.01.2013, 13:41:14
Go to the top of the page
+Quote Post
aras785
post
Post #2





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


@Sephirus pisz również poprawne formy, ponieważ wejdzie początkujący i skąd będzie wiedział? Ps. w/w formę też używam czasami (IMG:style_emoticons/default/smile.gif)

Ostatni pomagając na forum popełniłem błąd przy usuwaniu danych z bazy.

Błędy zapis:
  1. $q = mysql_query("SELECT id FROM test WHERE id=1 LIMIT 1--");
  2. if(mysql_num_rows($q)==1) {
  3. if(mysql_query("DELETE FROM test WHERE id=1 LIMIT 1--")) {
  4. echo('Usunięto!');
  5. } else echo('Błąd przy usuwaniu');
  6. }else echo('Nie ma takiego rekordu w bazie');


Poprawny:
  1. if(mysql_query("DELETE FROM test WHERE id=1 LIMIT 1--")) {
  2. echo('Usunięto!');
  3. } else echo('Błąd przy usuwaniu');


Objaśnienie: Jeśli nie znajdzie danego ID to go nie usunie i tak błąd wywali.

//poprawiłem. Kopiuj wklej i nie zauważyłem.

Ten post edytował aras785 14.01.2013, 13:58:45
Go to the top of the page
+Quote Post
!*!
post
Post #3





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Formatowanie kodu też to obejmuje? (IMG:style_emoticons/default/wink.gif)
Temat: Najczestsze bledy
Przejrzyj dział Oceny. Wypunktowane błędy są w prawie każdym wątku.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
a raczej złe nawyki
głupota i lenistwo.... dwa najczęściej spotykane na forum złe nawyki... (IMG:style_emoticons/default/smile.gif)


A z bardziej przyziemnych rzeczy to np.
zapytania w pętli, gdzie główna pętla idzie z zapytania a w niej znowu pętla z zapytania (IMG:style_emoticons/default/smile.gif)
A już szczyt szczytów zapytania w rekurencji....
Go to the top of the page
+Quote Post
Sephirus
post
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@aras785 Twój kod nadal jest dla mnie nie zrozumiały (nie wiem po co ten SELECT na początku) - ale przeanalizuję to (IMG:style_emoticons/default/smile.gif)

@!*! formatowanie (stricte) nie jest błędem a raczej niedbalstwem. Chyba, że ktoś nie lubi używać {} przy pętlach i instrukcjach a potem coś do nich dopisuje i się dziwi że zawsze działają ;P

  1.  
  2. if($costam === true)
  3. zrob_cos();
  4. zrob_cos_jeszcze();
  5.  
  6. // zamiast:
  7.  
  8. if($costam === true) {
  9. zrob_cos();
  10. zrob_cos_jeszcze();
  11. }
  12.  
  13. // itp...
  14.  


Temat z najczęściej pojawiającymi błędami jest mi znany - myślałem że wyłapie coś jeszcze osobno (IMG:style_emoticons/default/smile.gif) Pomysł z przeglądaniem działu "oceny" jest jednak dobry - dzięki (IMG:style_emoticons/default/wink.gif) tam na pewno coś znajdę (IMG:style_emoticons/default/wink.gif)

@nospor

Na głupotę nie ma rady ;P ale nie mogę zakładać że każdy na nią cierpi - sam robię masę błędów a potem mi wstyd ;P ale nie uważam się za totalnego głupola (IMG:style_emoticons/default/smile.gif) Co do lenistwa... true, true... :/

Zapytania w pętli to faktycznie częsta przypadłość (IMG:style_emoticons/default/biggrin.gif) Dużo ludzi na początku nie wie co to JOIN, nie ma pojęcia co to relacyjność :/ no i przede wszystkim jak już napisali jakieś zapytanie i im działa, to już go nie ruszają i piszą nowe. Każdy z nas się chyba zgodzi, że na początku nauki termin "wydajność" jest nam obcy (IMG:style_emoticons/default/smile.gif)

Ale zaintrygowałeś mnie tą rekurencją z zapytaniami!! (IMG:style_emoticons/default/biggrin.gif) Jak gdzie (IMG:style_emoticons/default/tongue.gif) w życiu tego nie widziałem - nie wiem nawet jak to napisać masz jakiś przykład? (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Na głupotę nie ma rady ;P ale nie mogę zakładać że każdy na nią cierpi - sam robię masę błędów a potem mi wstyd ;P ale nie uważam się za totalnego głupola
Nie, nie o taką głupotę mi chodziło. Błędy przytrafiają się każdemu.

Cytat
Ale zaintrygowałeś mnie tą rekurencją z zapytaniami!! Jak gdzie w życiu tego nie widziałem - nie wiem nawet jak to napisać masz jakiś przykład?

A proszę bardzo, pierwszy przykład z brzegu:
Drzewko, tabela:
ID
ID_PARENT
.....

No i koleś pobiera rekurencyjnie całe drzewko z góry na dół. Najpierw wierzchołek, potem jego dzieci, potem dzieci dzieci i tak dalej....wszystko w ładnej niesamowidzie mulącej rekurencji (IMG:style_emoticons/default/smile.gif)




Inny przykład kodów:
  1.  
  2. $zm = 1;
  3.  
  4. if ($zm == 1) echo 'jeden';
  5. if ($zm == 2) echo 'dwa';
  6. else echo 'trzy';

No i koleś się dziwi ze mu się wyswietal jeden i trzy, a przecież wyraźnie zmienna to 1


To jest też dobre:
  1. while($row=....){
  2. $dane = $row;
  3. }
  4. print_r($dane);
  5.  
  6. //EJ.... ludzie, czemu pobiera mi tylko ostatni rekord z bazy a nie wszystkie?!!!!! HELP!!!!

(IMG:style_emoticons/default/smile.gif)

Albo to:
  1.  
  2. $row = mysql_fetch_array(....);
  3. while ($row = mysql_fetch_array(....)){
  4. print_r($row);
  5. }
  6.  
  7. //EJ.... ludzie, czemu pobiera mi wszystkie rekordy oprócz pierwszego?!!!! HELP!!!! 20 dni już nad tym siędzę!!!!!!!!!!!

(IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Sephirus
post
Post #7





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ok przyznam szczerze... z tym drzewkiem... że bym na to nie wpadł (IMG:style_emoticons/default/smile.gif) co prawda od jakiegoś czasu sporo siedzę w SQL'u i obczajam jego wszelkie tajniki (poza administracją może bo to mi na nic) i może przez to wydaje mi się to dziwne, choć kiedyś kto wie - może i sam tak pisałem (IMG:style_emoticons/default/smile.gif)

Ten drugi błąd to też bardziej pod formatowanie (IMG:style_emoticons/default/smile.gif) I kurcze coś w tym jest - trzeba pisać "ładnie", estetycznie, zachowywać te wszystkie (jak to się na początku wydaje) głupie zasady (IMG:style_emoticons/default/tongue.gif) ja osobiście nie przestrzegam tylko jednej. Czytałem parę propozycji jak pisać i formatować kod czy o nazewnictwie zmiennych itd. (także dla różnych frameworków itp.) więc mi się to utrwaliło i z tego wszystkiego mam swoją jedną wizję łączącą po kawałku ze wszystkiego ale nie przestrzegam zasady o tym, żeby linia miała <=80 znaków i nie znam osoby (osobiście) która tego przestrzega (oczywiście nie pisze ciurkiem ale jak coś mi wyskoczy poza 80 znaków to tak zostawiam po prostu).

Najgorszy błąd jaki mi się kiedyś przydarzył i naprawdę nie wiedziałem co z tym robić (pomogło dopiero przepisanie kodu od nowa (IMG:style_emoticons/default/haha.gif) ) wyglądał tak:

(może nie błąd, ale przeoczenie)
  1. for($i = 0; $i < $jakasWartosc; $i++); {
  2. // wykonaj jakiś kod
  3. }


Oczywiście ta pętla odwalała trochę roboty i to nie łatwej i nigdy nie chciała się wyświetlić :/ co bym nie robił (IMG:style_emoticons/default/tongue.gif) Głupi średnik (który swoją drogą sam nie wiem jak się tam dostał zmarnował mi kupę czasu bo zdebugowałem cały skrypt praktycznie (IMG:style_emoticons/default/tongue.gif)

EDIT: Te dwa ostatnie powalają nospor ale fakt nawet, że chyba na forum raz z czymś takim "pomogłem" (IMG:style_emoticons/default/tongue.gif)

Ten post edytował Sephirus 14.01.2013, 14:10:59
Go to the top of the page
+Quote Post
pyro
post
Post #8





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Tyle jest błędów i nieprawidłowych konstrukcji popełnianych przez ludzi, że ten cały wątek chyba nie ma celu, bo po pierwsze chyba miałby z 500 stron, a po drugie całe programowanie sprowadza się do poprawnego pisania algorytmów, więc ten temat jest tak jakby jak całe to forum (IMG:style_emoticons/default/goatee.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




No i cała masa złego porównywania typów, nie rozróżnianie =, ==, ===

  1. if ($zm = 2) echo 'Czemu to mi sie zawsze wyświetla?';


  1. //funkcja xyz może zwracać false, oraz liczby od 0 wzwyż
  2.  
  3. if (xyz() == false) echo 'Źle';
  4. //Czemu mi ciągle wali Źle, skoro funkcja zwraca poprawny wynik?


  1. $i=0;
  2. while ($i <10){
  3. //tu masa kodu oprócz jednego najważniejszego $i++
  4. }
  5. //ej ludzie... zapetlam się.....


  1. while ($row = mysql_fetch_array($res)){
  2. //tu masa kodu
  3. //oraz
  4. $res = mysql_query();
  5. }
  6. //ej ludzie... pobiera mi tylko pierwszy rekord....

Go to the top of the page
+Quote Post
pyro
post
Post #10





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Ja do najgłupszych błędów, który popełniłem 30 sekund temu mogę zaliczyć zostawienie patelni na gazie, a potem robienie rzeczy przy komputerze. (ktoś mnie poprosił o pomoc z pewnym problemem natury programistycznej i zapomniałem o patelni). W kuchni pełno dymu, prawie spaliłem dom (IMG:style_emoticons/default/smile.gif) . (ale omlet z cynamonem i tak wyszedł smaczny)

Ten post edytował pyro 14.01.2013, 14:16:27
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




No i najważniejsze zło, jakie robią zarówno początkujący jak i ci, którzy uważają się za profesjonalistów:
  1. error_reporting(E_ALL ^ E_NOTICE);

Na to mi normalnie brak słów
Go to the top of the page
+Quote Post
Sephirus
post
Post #12





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@pyro Masz całkowitą rację niestety - to jest "rzeka", można by wymieniać w nieskończoność mimo to uważam, że dobrze jest ciągle wałkować ten temat (IMG:style_emoticons/default/smile.gif) dlaczego?

Jestem sobie programistą, uważam że pozjadałem wszystkie rozumy (IMG:style_emoticons/default/smile.gif) wchodzę na taki wątek i czytam, tu się uśmiechnę, tam się zaśmieje ale może, w pewnym momencie naglę przystanę i stwierdzę - o kurde... nie wiedziałem, że tak nie można (IMG:style_emoticons/default/smile.gif)

No i poza tym chciałbym zebrać nieco materiałów na ten temat by się nimi podzielić z "nowymi" w pracy (IMG:style_emoticons/default/smile.gif) i ich na to uczulić a sam wszystkiego nie pamiętam (IMG:style_emoticons/default/sad.gif)

@nospor Co do operatorów to fakt, ale bardzo podobała mi się odpowiedź Erixa w temacie o najczęstrzych błędach, że "if($costam = 123)" to nie bug - tylko feature (IMG:style_emoticons/default/smile.gif) To mi nasunęło pewną myśl: rzadko spotykam się z tym żeby ktoś to stosował :/

  1.  
  2. // w zamyśle jakas_funkcja zwraca albo null albo ciąg znaków
  3.  
  4. // zamiast (co jest dla mnie najlepsze)
  5. if($wynik = jakas_funkcja()) {
  6. echo 'Wynik prawidlowy i równy ' . $wynik;
  7. }
  8.  
  9. // jest
  10. $wynik = jakas_funckja();
  11. if($wynik) {
  12. echo 'Wynik prawidlowy i równy ' . $wynik;
  13. }
  14.  
  15. // no nie wspominając już o błędnym podejściu
  16. if(jakas_funkcja()) {
  17. echo 'Wynik prawidlowy i równy ' . jakas_funkcja();
  18. }


Czym może to być spowodowane że rzadko to ludzie stosują? Niewiedza? Gorsza przejrzystość kodu?
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




własnie w dziale przedszkole pojawił się problem z mojego posta wczesniej:
if ($zm = 'b')

Bład tak czesty, ze nawet podczas pisania posta pojawiają się takie tematy (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
pyro
post
Post #14





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 14.01.2013, 14:16:41 ) *
No i najważniejsze zło, jakie robią zarówno początkujący jak i ci, którzy uważają się za profesjonalistów:
  1. error_reporting(E_ALL ^ E_NOTICE);

Na to mi normalnie brak słów


@nospor, bzdury Pan pleciesz! To nie jest żaden błąd, tylko konstrukcja, która choć nie zawsze stosowana z rozwagą, w wielu przypadkach usprawiedliwiona.
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Czym może to być spowodowane że rzadko to ludzie stosują? Niewiedza? Gorsza przejrzystość kodu?
Wg. mnie chodzi o przejrzystość. Sam tego nie stosuję choć dobrze wiem jak to działa (IMG:style_emoticons/default/smile.gif) Wolę mieć przejrzysty kod niż super hiper featured (IMG:style_emoticons/default/wink.gif)

@pyro to
if ($zm = 'b')
te tez nie jest błąd, tylko konstrukcja, rzadko stosowana z rozwagą (IMG:style_emoticons/default/wink.gif)

Pomijam przypadki, gdy wyłączenie E_NOTICE jest usprawiedliwione. Mówię o sytujacji, gdy to w żaden sposób nie jest usprawiedliwione, np. gdy zaczynasz projekt od 0 i lecisz już z taką dyrektywą. Wówczas to jest fatalny błąd!

NIe chce mi się powtarzać, więc podam tylko linka
http://nospor.pl/notice-wyswietlac-czy-nie.html
Go to the top of the page
+Quote Post
pyro
post
Post #16





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 14.01.2013, 14:27:57 ) *
Pomijam przypadki, gdy wyłączenie E_NOTICE jest usprawiedliwione. Mówię o sytujacji, gdy to w żaden sposób nie jest usprawiedliwione, np. gdy zaczynasz projekt od 0 i lecisz już z taką dyrektywą. Wówczas to jest fatalny błąd!

NIe chce mi się powtarzać, więc podam tylko linka
http://nospor.pl/notice-wyswietlac-czy-nie.html


No to nie dopowiedziałeś i można było bardzo łatwo to źle zrozumieć. Trzeba było od razu dać link do artykułu, bo z tego co napisałeś można zrozumieć, że stosowanie tego jest zawsze złe.
Go to the top of the page
+Quote Post
Tuminure
post
Post #17





Grupa: Zarejestrowani
Postów: 178
Pomógł: 49
Dołączył: 16.04.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Znajomość różnicy między && i AND, a także || i OR może się czasem przydać.

  1. $result1 = true AND false; // true
  2. $result2 = true && false; // false
  3. $result3 = false OR true; // false
  4. $result4 = false || true; // true
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
No to nie dopowiedziałeś i można było bardzo łatwo to źle zrozumieć. Trzeba było od razu dać link do artykułu, bo z tego co napisałeś można zrozumieć, że stosowanie tego jest zawsze złe.
Dobrze, przepraszam. Niepotrzebnie przyjąłem, że każdy zrozumie o co mi chodzi (IMG:style_emoticons/default/smile.gif)

@Tuminure o właśnie, ludzie często nie wiedzą do czego służą nawiasy oraz co to ważność operatora i często nie kumają czemu
2+3*4 nie jest równe 20 (IMG:style_emoticons/default/smile.gif)
Oczywiście mówię tu w odniesieniu do mysql i php
Go to the top of the page
+Quote Post
Sephirus
post
Post #19





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Co do errorów to prawda... ale to jest celowe jakby nie patrzeć ;P zapominają o cudzysłowach itp. a potem jak im wyskakuje wiele notice'ów a mogą je ukryć (bo przecież wszystko działa) to sobie je olewają i ukrywają (IMG:style_emoticons/default/tongue.gif)

U mnie w firmie jak raz włączyliśmy na głównym (starym) portalu logowanie do pliku wszystkich błędów z noticami włącznie to przez 30 minut plik z logiem miał 10GB (IMG:style_emoticons/default/smile.gif)

Ten post edytował Sephirus 14.01.2013, 14:41:14
Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 560
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
U mnie w firmie jak raz włączyliśmy na głównym (starym) portalu włączyliśmy logowanie do pliku wszystkich błędów z noticami włącznie to przez 30 minut plik z logiem miał 10GB
No właśnie, i weź potem w takiej ilości błędów znajdź człowieku jakąś literówkę.... nie ma szans.... i dlatego zawsze od początku trzeba pisać poprawnie. Gdy się tego nie zrobiło to potem już pozostaje jedynie na stałe wyłączenie błędów NOTICE i szukać przez 5 godzin jakis banalnych błędów, które z NOTICE znalazłoby się w dwie sekundy
Go to the top of the page
+Quote Post

4 Stron V   1 2 3 > » 
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.11.2025 - 14:26