Ocena wątku:
- 0 głosów - średnia: 0
- 1
- 2
- 3
- 4
- 5
[ciekawostka] "poprawny kod" w Yii
|
Liczba postów: 340
Liczba wątków: 38
Dołączył: 28-04-2010
Reputacja:
15
21-03-2012, 01:00
(Ten post był ostatnio modyfikowany: 21-03-2012, 01:04 przez R_Rafalsky.)
Miałem ostatnio spory problem z jednym zadaniem. Mianowicie w projekcie na localhoście z dnia na dzień pojawił się problem, który nie istniał w sieci. Pewnego dnia wywaliło mi w jednej linijce błąd " Trying to get property of non-object". Problem znany przyczyna znajoma. Zdziwiło mnie, że w sieci problem nie istnieje. Strona śmiga aż miło. Ściągnąłem wersję z sieci i nadal localhost udaje, że nie widzi obiektu. Wszelkie var_dumpy podawały poprawne wyniki, a nadal problem występował. Usunąłem lokalnie cały folder protected i ściągnąłem wersję z sieci. Nic nie dało. W sieci działa u mnie ni. W końcu postanowiłem pobawić się w kodzie i coś takiego mi zadziałało:
Kod PHP: <?php $obserwuje=Follow::model()->findAll('user_id=:id',array(':id'=>$user->login )); $i=0; foreach($obserwuje as $row): $user1=User::model()->find('login=:l',array(':l'=>$row['follower_ID'])); if($user1['avatar']): ?> <a href="/<?php echo $user1->login; ?>"><img src="/uploads/avatar/<?php echo $user1->avatar; ?>" alt="<?php echo $user1->login; ?>" title="Zobacz profil użytkownika <?php echo $user1->login; ?>" /></a> <?php endif; ?> <?php endforeach; ?>
Czy ktoś jest mi w stanie odpowiedzieć na pytanie: Dlaczego to działa?
Problem leży w 5 linijcie. Dlaczego dla if $user1 jest tablicą by dalej był normalnie widoczny jako obiekt?
Błąd odwołania do nie-obiektu wyskakiwał gdy warunek if miał taki zapis:
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję
Any sufficiently advanced technology is indistinguishable from magic.
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
Zrób na początek jedną rzecz:
Kod: var_dump($row['follower_ID']);
Dobre samopoczucie w tym tygodniu sponsoruje cytat:
Cytat:Mogę tylko tylko na prawo i lewo ale na środek nie mogę.
Liczba postów: 340
Liczba wątków: 38
Dołączył: 28-04-2010
Reputacja:
15
21-03-2012, 01:22
(Ten post był ostatnio modyfikowany: 21-03-2012, 01:23 przez R_Rafalsky.)
powtórzone n razy dla wszystkich wyników foreach. Czyli prawidłowo
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję
Any sufficiently advanced technology is indistinguishable from magic.
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
Pytanie za 100 punktów: jaką wersję PHP masz na serwerze produkcyjnym, a jaką na dev?
Dobre samopoczucie w tym tygodniu sponsoruje cytat:
Cytat:Mogę tylko tylko na prawo i lewo ale na środek nie mogę.
Liczba postów: 340
Liczba wątków: 38
Dołączył: 28-04-2010
Reputacja:
15
wersja nie ma tu nic do rzeczy, gdyż na produkcyjnym stronę robiłem od zera, wrzuciłem na serwer i zacząłem robić poprawki. W tym czasie nigdzie konfiguracji nie ruszałem
Ale jak chcesz wiedzieć: Localhost 5.3.5 Hosting: 5.2.17
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję
Any sufficiently advanced technology is indistinguishable from magic.
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
Hm... wiesz w sumie to mogło być to, że tablica $obserwuje była pusta. findAll() w przypadku braku wyników zwraca pustą tablicę: dlatego nie krzyczało przy pętli, ale w momencie odwołania do obiektu już tak. Idź w tym kierunku.
Dobre samopoczucie w tym tygodniu sponsoruje cytat:
Cytat:Mogę tylko tylko na prawo i lewo ale na środek nie mogę.
Liczba postów: 340
Liczba wątków: 38
Dołączył: 28-04-2010
Reputacja:
15
Obserwuje nie jest puste gdyż ten kod wywala mi trzy osoby dla przykładowego usera. Więc się zgadza. Wyniki z bazy na pewno dobre gdyż obie wersje z tej samej bazy korzystają. Z powodu braku pomysłów nawet assets usuwałem, co wiem, że było głupotą. Ale co poradzić. Gdzieś jest problem
Dla mnie dziwne jest to, że jedna zmienna w jednym miejscu traktowana jest jako tablica w innym jako obiekt bez żadnej manipulacji ją.
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję
Any sufficiently advanced technology is indistinguishable from magic.
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
A ja bym jednak poszedł tą drogą. Dlaczego? Bo wystarczy, że na hostingu produkcyjnym masz wyłączone wyświetlanie warningów (Undefinex index), a na localu nie. Błąd "Trying to get property of non-object" wówczas Ci się wyświetli.
Z drugiej strony, coś musi być nie tak, no nie ma możliwości, żeby traktowało tę samą zmienną jako tablicę, a na innym serwerze jako obiekt (tym bardziej, że findAll() zwraca tablicę obiektów albo pustą tablicę). Może to jakiś błąd Yii i określonej wersji PHP? Trudno mi powiedzieć, nie spotkałem się z tym. Aczkolwiek jestem cholernie ciekaw co to może być. Może podeślij jakiś większy fragment kodu (taki, żeby coś szło odpalić), spróbowałbym zobaczyć na swoich serwerach jak to wygląda na różnych wersjach.
Dobre samopoczucie w tym tygodniu sponsoruje cytat:
Cytat:Mogę tylko tylko na prawo i lewo ale na środek nie mogę.
Liczba postów: 340
Liczba wątków: 38
Dołączył: 28-04-2010
Reputacja:
15
To nawet nie jest tak. W jednej linijce traktuje jako tablicę, linijka niżej jest już obiekt. Jutro akurat mam wyjazd ale jak tylko będę mógł to się odezwę.
Jak pomogłem daj '+'. To nie boli, a ja mam satysfakcję
Any sufficiently advanced technology is indistinguishable from magic.
|
Użytkownicy przeglądający ten wątek: 2 gości
|
|
Sponsorzy i przyjaciele
|
|
|