![]() |
![]() ![]() |
![]() |
![]()
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 ![]() 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 ![]() 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 ![]() 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 ![]()
Powód edycji: [thek]: [thek]: Poprawiłem literówki małe i dodałem komentarze :)
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
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? ![]() ![]() 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 ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
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ś ![]() ![]() ![]() ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
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.
![]() ![]() 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 ![]() 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
![]() |
|
|
![]()
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)
![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 23.06.2025 - 18:41 |