![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 29.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam mam następujący problem otóż, pobieram z bazy danych wartość będącą liczbą i teraz mam problem ponieważ potrzebuję to przypisać mam kod
następnie to przypisuje w pliku do którego załączam tą tablice, $ranga[$r[rank]]. I po tym właśnie zwraca mi błąd Warning: Illegal offset type in ... on line 3,4,5,6 Bardzo bym prosił o pomoc gdyż jestem początkującym programistą i nie wiem za bardzo gdzie zrobiłem błąd. Pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 8 Dołączył: 10.11.2010 Skąd: Polska,Katowice Ostrzeżenie: (0%) ![]() ![]() |
Nie możesz ID z tablicy przypisać funkcji. Może być jedynie zmienna. Jeśli chcesz uzyskać podobny efekt to byś musiał zrobić
Ale to i tak jest błędne. Jeśli pobierasz X wartość z bazy to po prostu robisz Kod if($wartosc >= 0 && $wartosc <= 3999) $ranga = "Początkujący"; elseif($wartosc >= 4000 && $wartosc <= 7999) $ranga = "Młodzian"; i tak dalej. Ten post edytował kulczycki 2.01.2011, 22:56:23 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 711 Pomógł: 127 Dołączył: 5.07.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Kluczem w tablicy może być string lub liczba całkowita - w Twoim kodzie próbujesz wstawić tam rezultat działania funkcji range czyli tablicę.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zapisujesz sobie jedynie górną granicę i etykietę, a później sprawdzasz po kolei czy ranga użytkownika jest wystarczająco wysoka:
Ten post edytował Crozin 3.01.2011, 09:21:08 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 29.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
Nie możesz ID z tablicy przypisać funkcji. Może być jedynie zmienna. Jeśli chcesz uzyskać podobny efekt to byś musiał zrobić
Ale to i tak jest błędne. Jeśli pobierasz X wartość z bazy to po prostu robisz Kod if($wartosc >= 0 && $wartosc <= 3999) $ranga = "Początkujący"; elseif($wartosc >= 4000 && $wartosc <= 7999) $ranga = "Młodzian"; i tak dalej. Zrobiłem jak kolega powiedział ale jeśli mam poniżej Ranga: $ranga to nic nie wyświetla popełniłem gdzieś błąd?
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat [...] popełniłem gdzieś błąd? Posłuchałeś @kulczycki, który zaproponował utworzenie tablicy złożonej z 20 000 elementów tylko po to, by sprawdzić którą z 4. etykiet przypisać użytkownikowi.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 8 Dołączył: 10.11.2010 Skąd: Polska,Katowice Ostrzeżenie: (0%) ![]() ![]() |
Cytat Posłuchałeś @kulczycki, który zaproponował utworzenie tablicy złożonej z 20 000 elementów tylko po to, by sprawdzić którą z 4. etykiet przypisać użytkownikowi. To wróć do góry i zobacz co zaproponowałem. Pokazałem mu tylko jak by wygładał jego przykład a nie zaproponowałem (IMG:style_emoticons/default/winksmiley.jpg) . A rozwiązanie podałem najłatwiejsze z możliwych. Do tego twój przykład letko waldiwy jest. Ten post edytował kulczycki 3.01.2011, 07:40:10 |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Ja bym nie ufał przedziałom górnym. Kulczycki ma rację co do pewnego małego babola u Ciebie Crozin. Nie reagujesz na przekroczenie zakresu maksymalnego w ostatnim wypadku dla weterana. Gdy ktoś przekroczy 20000 - nie pokaże nic.
Tu masz wersję zagnieżdżona dla rang. Nie jest ładna, ale zadziała jak trzeba. Jeśli chcesz, by funkcja była dynamicznie modyfikowalna (co jakiś czas zmieniasz nazwy rang lub wartości) to stwórz funkcję, gdzie jako parametr przekazujesz tablicę z zakresami dolnymi jako klucze (IMG:style_emoticons/default/smile.gif) Przykład masz tutaj mniej więcej... Oczywiście "magia" to żart. Posortowaną tablicę przeszukuję od końca tak długo, aż nie dojdę do początku. Gdy jestem w pętli to porównuję wartość liczbową podaną w funkcji do aktualnego progu i jeśli klucz jest większy to lecę do elementu wcześniej w tablicy. Jeśli nie jest to prawda, to znaczy, że wpadłem we właściwy zakres i zwracam wartość dla tego klucza. Jeśli dojdę do końca i nie znajdę pasującego to wywalam rangę domyślną dla oszusta (IMG:style_emoticons/default/smile.gif) Zwracaj uwagę na to co zwraca funkcja ranga. jeśli dała w wyniku false to sygnalizuj błąd. Uważaj na 0... Jeśli zrobisz głupie
to wywali Ci error jeśli będziesz zwracał jako nazwę 0, '0' lub cokolwiek innego dające się do false przekonwertować w locie. Powinno być:
Do latania po pętli mogłem też użyć foreach, co jest wygodne przy małych petlach. Ale tutaj dla celów edukacyjnych użyłem while, byś wiedział, że tak też można, a dodatkowo przy ogromnych pętlach while jest wydajniejsze. Tutaj to tylko sztuka dla sztuki i ukazanie że można. Równie dobrze możesz to foreach zastąpić, bo wątpliwe byś miał kiedykolwiek więcej niż kilka tysięcy rang (IMG:style_emoticons/default/winksmiley.jpg) Dodatkowo jeśli masz pewność, że klucze są już podane w odpowiedniej kolejności od najmniejszej do największej to możesz usunąć z wnętrza ksort, który spowalnia całość.
Powód edycji: [thek]: [thek]: Poprawiłem literówki małe i dodałem komentarze :)
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@thek: Ty to się potrafisz rozpisać.
1. Zapewne przekroczenie rangi "weteran" jest niemożliwe. Zresztą... zawsze, można zamienić znak mniejszości na większości i porównywać minimalny zakres rangi, bo jak się domyślam, ów "weteran" to maksimum. 2. Do wywalania błędów używaj wyjątków, a nie "flagi" w postaci zwrócenia false - to jest chyba jedna z bardziej "błędotwórczych" praktyk. 3. Żeby się już nikt nie czepiał:
Ten post edytował Crozin 3.01.2011, 21:58:06
Powód edycji: [thek]: poprawiłem Citablicę statyczną boś mialsamych weteranów :)
|
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
@Crozin:
ad1) "Zresztą... zawsze, można zamienić znak mniejszości na większości i porównywać minimalny zakres rangi" -> właśnie to zaproponowałem jako lepszy pomysł. Zakres górny w przypadku liczb rosnących jest źródłem potencjalnych błędów w przyszłości. ad2) Wyjątki także sugerowałem w komentarzach w kodzie, ale zostawiłem wybór. Poza tym dobrze napisany skrypt nie sprawi problemu. Wiesz co dostajesz na wyjściu, co dajesz na wejściu i nie martwisz się logiką biznesową wnętrza. Wyjątki są bardzo zdradliwe. Możesz mieć wszystko cacy i nagle coś sprawi, że poleci wyjątek, a wysypie Ci aplikację z powodu nie przechwyconego fatala. Ty w trakcie testowania nie musiałeś na taką sytuację trafić, ale kto wie co się stanie po pół roku na serwerze produkcyjnym? (IMG:style_emoticons/default/winksmiley.jpg) Użycie false do sygnalizacji błędu jest w takim momencie "bezpieczne", ponieważ większość skryptów, funkcji php-owych false daje domyślnie jako sygnalizację, że coś poszło nie tak i pod tym kątem większość osób testuje returny z funkcji. Owszem, wyjątki są o wiele lepsze do tego celu i dlatego powstały, ale wymaga to przejrzenia kodu aplikacji by wiedzieć gdzie te wyjątki mogą być rzucone, a więc i gdzie je próbować łapać oraz jakiej są klasy, bo przecież wyjątki także podlegają dziedziczeniu, a czasem zależy nam na łapaniu nie wszystkich, ale tylko określonej klasy wyjątków (IMG:style_emoticons/default/smile.gif) ad3) Chyba lepszym wyjściem niż robić break; byłoby od razu walnięcie return. Wtedy spada konieczność sprawdzania czy userRangelabel jest nullem. Dodatkowo przesłałbym tablicę zakresów jako parametr z tej przyczyny, że wtedy funkcja staje się uniwersalną i możesz ją stosować nie tylko dla rzeczy na sztywno i potem definiować osobną do Postów, osobna do artykułów itp. Po prostu byłaby jakąś w helperze do sprawdzania czy liczba mieści się w określonym zakresie. A więc byłaby bardzo elastyczna. PS: Popraw też static $ranges na coś innego niż weteran (IMG:style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
3) Oczywiście, dobra uwaga - już poprawiłem.
2) PHP niestety nie informuje na poziomie języka o tym jakie wyjątki może dana metoda wyrzucić, ale w miarę dobrze udokumentowany już kod tak. Z return false; jest ten problem, że bardzo często nie sprawdza się czy taka właśnie wartość została zwrócona, wyjątki zaś wymuszają (w przypadku PHP nie jest to do końca prawdą) na nas obsługę tego błędu, albo przynajmniej świadome zignorowanie go. |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
ad3) nadal przypisanie nulla przed foreachem jest zbędne. Ta linia nie robi kompletnie nic i nigdzie nie jest wykorzystywana. No i nadal jako indeksy tablicy statycznej miałeś samych Weteranów, ale poprawiłem Ci to już sam.
ad2) No niestetynie informuje i to jest moim zdaniem pewien problem. Nie zagląda się bowiem nieraz głębiej niż ostatni poziom dziedziczenia. Potem nam z powietrza się we wnuczku pojawia exception z powietrza bo dziadek go implementował lub tatuś (IMG:style_emoticons/default/biggrin.gif) Ja tak miałem w Swift mailerze, gdy mi się skrypt mailingu wysypał i jak się okazało wyjątkiem sypnęła jakaś klasa transportu, która robiła za podstawę dla innych (IMG:style_emoticons/default/winksmiley.jpg) Nie zauważyłbym tego, gdyby nie przypadkowa uwaga kumpla, że mailing się nie dostarczył mu na konto testowe. Normalnie caly mailing idzie cronem, z możliwościa wywołania poprzez http, a wyjście normalnie sypie się na /dev/null (IMG:style_emoticons/default/winksmiley.jpg) Dopiero gdy skierowałem wyjście na przeglądarkę i zobaczyłem nieobsłużony wyjątek klasy transportowej przy errorze 500 nagłówka podczas wysyłki to mi kopara opadła (IMG:style_emoticons/default/winksmiley.jpg) A dodam, że zablokowany skrypt nie przeskakuje błędnego adresu, tylko próbuje do oporu. Cały mailing więc był zablokowany. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
3) Tak to jest jak się kod kopiuje i poprawia na szybko. (IMG:style_emoticons/default/winksmiley.jpg) Co do rang - uznałem, że autor nie jest skończonym idiotą i nie skopiuje-wklei tego bez rzucenia okiem. No i nie wyrównałeś ładnie elementów tablicy. (IMG:style_emoticons/default/winksmiley.jpg)
2) Ale dokładnie to samo przytrafi Ci się gdy gdzieś wystąpi błąd, zostanie zwrócone false, a Ty tego nie obsłużysz - takie sytuacje zdarzają się znacznie częściej niż w przypadku wyjątków. Co do nieprzechwyconych wyjątków - m.in. dlatego dobrze jest cały kod objąć blokiem try-catch(Exception), ewentualnie użyć exception handlera by nieobsłużone wyjątki (do czego nigdy nie powinno dojść) gdzieś zapisać, poinformować o ich wystąpieniu. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 8 Dołączył: 10.11.2010 Skąd: Polska,Katowice Ostrzeżenie: (0%) ![]() ![]() |
1. co do exception, po co on ?. Od tej funkcji nie zależy działanie całego serwisu, a tylko przypisanie rangi danemu użytkownikowi. Jeśli nie ma x przedziału to po prostu ustawia najbardziej bliską, a jeśli dalej nie może ustawić to wywala pusty albo "No range" - to przecież tylko tekst o range.
2. Cozin twoja pierwsza wersja była dobra ale trzeba lekko dopracować. I ta ostatnia to samo. Bo jeśli ostatnia ranga się gdzieś kończy to przecież nie odbierzesz rangi użytkownikowi tylko dlatego że ma więcej punktów (IMG:style_emoticons/default/winksmiley.jpg) Może takie niechlujstwo ale trudno:
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 8 Dołączył: 10.11.2010 Skąd: Polska,Katowice Ostrzeżenie: (0%) ![]() ![]() |
Bez bicia przyznaje racje (IMG:style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#17
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Ja, właśnie z racji tego, że musimy uważać na zakresy uważam, że tak naprawdę konieczne do poznania są tylko dolne granice. Weteran będzie nim, niezależnie czy posiada 15tysięcy czy 150tysięcy punktów. Stąd dla niego zakres górny jest zbyteczny i sygnalizowanie błędu mija się z celem. Za to istotne jest zejście poniżej wartości 0, która jest wartością graniczną i w normalnej sytuacji nie powinna wystąpić. Może miec to miejsce w przypadku przekręcenia licznika w bazie. A takie coś już jest na pewno sytuacją nienormalną i powinno być oznaczone jako wyjątek. W końcu własnie po to ten mechanizm powstał. Niektórzy używają wyjątków do zwracania wartości, ale to moim zdaniem zła praktyka. Nie po to powstały elementy w stylu rethrow, który pozwala obsłużyć wyjatek i rzucić go ponownie w kod (ale to już nie w php) (IMG:style_emoticons/default/winksmiley.jpg)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 04:44 |