Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> IE7/8 i funkcja unset w PHP
qrzysztof
post
Post #1





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Wszyscy wiemy, że IE7/8 to badziewie jakich mało. Dotychczas myślałem, że te przeglądarkopodobne produkty wtrącają się tylko do HTML i CSS. Nic bardziej błędnego. Okazuje się, że potrafią namieszać również w kodzie PHP.

Mam poniższy kod:

  1. public function deleteQuestion ($id)
  2. {
  3.  
  4. if ( in_array($id, array_keys($this->_questions)) )
  5. {
  6. unset($this->_questions[$id]); #problematyczna linia
  7.  
  8. #usuniecie pytania z bazy
  9. $this->dbm->deleteQuestion($id);
  10.  
  11. return true;
  12. }
  13. return false;
  14. }


We wszystkich przeglądarkach działa poprawnie. Natomiast w IE7/8 po wejściu do tej funkcji a następnie do bloku warunkowego, zaznaczona przeze mnie linia powoduje wyjście z funkcji bez zgłoszenia błędu czy wyjątku. Jest to tym bardziej dziwne, że
Kod
$this->_questions[$id]
istnieje, a jeszcze bardziej ponieważ kolejna linia usuwająca pytanie z bazy jeszcze się wykonuje! Ale return true już najwyraźniej nie bo funkcja nie zwraca true!

Gdy zmienię kod na:
  1. if ( $this->questions[$id] )
  2. {
  3. unset($this->_questions[$id]); #problematyczna linia
  4. }


sytuacja nie ulega zmianie.

Zaznaczę, że do testów używam emulatorów IE7 na XP (ale różnych i we wszystkich jest tak samo), natomiast IE8 w pełnej wersji również na ten system.

Ten post edytował qrzysztof 9.09.2011, 09:13:21


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





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




IE nie ma nic do php.
  1. public function deleteQuestion ($id)
  2. {
  3.  
  4. var_dump($id);
  5. var_dump($this->_questions);
  6. if ( in_array($id, array_keys($this->_questions)) )
  7. {
  8. unset($this->_questions[$id]); #problematyczna linia
  9.  
  10. #usuniecie pytania z bazy
  11. $this->dbm->deleteQuestion($id);
  12.  
  13. return true;
  14. }
  15. return false;
  16. }

I nagle wszystko staje się jasne. Czemu nie robicie głupiego var_dump()? To takie trudne??


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
darko
post
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Ee raczej się mylisz z tym wtrącaniem się w kod php, raczej chodzi o cache. Odpal debugger i wywołaj gdzieś
$temp = $myObj->deleteQuestion(123);
$TEST= 123;
(ustaw breakpointa dokładnie dla linii $TEST) sprawdź wartość zmiennej $temp, oczywiście poustawiaj odpowiednie wartości zmiennych.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
nospor
post
Post #4





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




I jeszcze
Temat: Jak poprawnie zada pytanie
Wyświetlanie wszystkich błędów, analiza zmiennych i kupa innych. - To podstawy.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #5





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Cytat(nospor @ 9.09.2011, 10:10:43 ) *
I nagle wszystko staje się jasne. Czemu nie robicie głupiego var_dump()? To takie trudne??
Nie no, aż tak naiwny nie jestem. Wszystko sprawdziłem zanim napisałem.

To, że stanie się jasne na końcu nie ulega wątpliwości ale na razie nie jestem bliżej.

Zastosowałem var_dump w zalecanym miejscu w trochę zmodyfikowanej formie, aby nie zaciemniać obrazu:

  1. var_dump($id);
  2. var_dump(array_keys($this->_questions));


Dane wejściowe identyczne:

-trzy pytania w obiekcie i w bazie (2423, 2424, 2425)
-usuwane: 2425

Rezultat w IE
Kod
string(4) "2425" array(2) { [0]=> int(2423) [1]=> int(2424) }


Rezultat w FF
Kod
string(4) "2425" array(3) { [0]=> int(2423) [1]=> int(2424) [2]=> int(2425) }



--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
nospor
post
Post #6





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




No i już wiesz czemu nie działa unset - bo nie masz takiego elementu na liscie, który chcesz usunać. Już wiesz, że błedem nie jest unset a Twoja lista - czyż nie jest od razu jaśniej? Bo moim zdaniem jest, już nie krążysz przy unset, które nie jest niczemu winne


ps: zastosowałeś się do porad z linku co ci podałem? Wyswietlanie wszystkich błędów i itp?

Cytat
Nie no, aż tak naiwny nie jestem. Wszystko sprawdziłem zanim napisałem.
Widać nie sprawdzałeś. Jakbyś sprawdził to byś wiedział, że to nie unset.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Nospor, sprawa nie jest taka prosta jak się na pierwszy rzut oka wydaje. Zwróć uwagę, że napisałem w pierwszym poście
Cytat(qrzysztof @ 9.09.2011, 10:05:41 ) *
Natomiast w IE7/8 po wejściu do tej funkcji a następnie do bloku warunkowego, zaznaczona przeze mnie linia powoduje wyjście z funkcji bez zgłoszenia błędu czy wyjątku.


P.S. Oczywiście, że tu musi chodzić o jakieś cache/sesje czy cookies. Ja nie sugeruję, że przeglądarka wchodzi mi na serwer i zmienia tam kod smile.gif

Ten post edytował qrzysztof 9.09.2011, 09:39:36


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
nospor
post
Post #8





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




SKoro nie istnieje na liscie twoje ID, to kod nie ma prawa wejść do tego IFa.

Prosty test:
  1. public function deleteQuestion ($id)
  2. {
  3.  
  4. var_dump($id);
  5. var_dump($this->_questions);
  6. if ( in_array($id, array_keys($this->_questions)) )
  7. {
  8. die('JUPI, jestem!');
  9. unset($this->_questions[$id]); #problematyczna linia
  10.  
  11. #usuniecie pytania z bazy
  12. $this->dbm->deleteQuestion($id);
  13.  
  14. return true;
  15. }
  16. return false;
  17. }

Co się wyświetla?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #9





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Wyświetla się

Kod
string(4) "2425" array(3) { [0]=> int(2423) [1]=> int(2424) [2]=> int(2425) } JUPI, jestem!


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
nospor
post
Post #10





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




Dla IE?
To się zdecyduj, co ci wyświetla, bo teraz napisałeś:
array(3) { [0]=> int(2423) [1]=> int(2424) [2]=> int(2425) }
a wcześniej pisałeś:
array(2) { [0]=> int(2423) [1]=> int(2424) }
Więc która wkońcu wersja jest prawdziwa?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #11





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Chciałbym się zdecydować, ale to niestety nie ode mnie zależy. Też mnie to dziwi ale takie są właśnie dane na wyjściu.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
nospor
post
Post #12





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




A jak skasujesz DIE to znowu wyświetlają się tylko 2 elementy?
Znaczy, że Twój kod wykonuje się dwa razy - za pierwszy razem jest ok, a za drugim nie ok smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #13





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Ok, już sprawdzam...

Na razie nie znalazłem na to dowodów:

W kodzie mam:

  1. if ( !($testObject->deleteQuestion($id)) )
  2. {
  3. throw new ExtendedException('Nie posiadasz uprawnień do modyfikowania tego pytania.');
  4. }


Zmieniłem na:

  1. if ( !($testObject->deleteQuestion($id)) )
  2. {
  3. throw new ExtendedException('Nie posiadasz uprawnień do modyfikowania tego pytania.');
  4. }else
  5. {
  6. throw new ExtendedException('Wykonane przynajmniej raz dobrze');
  7. }


Dane wejściowe te same i w obu przypadkach wynik
Kod
Nie posiadasz uprawnień do modyfikowania tego pytania



Ten post edytował qrzysztof 9.09.2011, 09:57:14


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
nospor
post
Post #14





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




zapytam ponownie:
czy bez DIE dla IE wyświetlają się dwa elementy na liście czy 3?
Czy z DIE znowu zaczynają się wyświetlać 3?



--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #15





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Bez die: 2 elementy w tablicy
z die: 3 elementy

Oba przypadki odnoszą się do IE


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
drPayton
post
Post #16





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


  1. var_dump(array_keys($this->_questions));

=>
Kod
string(4) "2425" array(3) { [0]=> int(2423) [1]=> int(2424) [2]=> int(2425) }


a:

  1. var_dump($this->_questions);

=>
Kod
string(4) "2425" array(3) { [0]=> int(2423) [1]=> int(2424) [2]=> int(2425) }


questionmark.gif

Jak się chcecie we 2 dogadać, to najpierw (do autora) zacznij robić tak, jak pisze nospor, bo inaczej się pokręcicie zaraz...
Go to the top of the page
+Quote Post
nospor
post
Post #17





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




Cytat
Bez die: 2 elementy w tablicy
z die: 3 elementy
Czyli kod wykonuje ci się wiecej niż jeden raz - to oczywiste i stwierdzone naukowo. Teraz zastanów się czemu.
@drPayton bo on var_dump robi na array_keys(). Przecież pisał o tym.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
qrzysztof
post
Post #18





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


@drPayton dał jednak dobry trop:

O dziwo jeśli zrobię var_dump($this->_questions) to wszystko działa poprawnie. Sam fakt dodania tej linii do kodu! Wtedy zawsze pokazuje, że są 3 elementy w tablicy.

Ale jak usunę tę linię

  1. var_dump($this->_questions);


to znowu to samo.

To musi mieć jakiś związek z wyjściem. Tak samo z tym die. Jeśli jest coś więcej na wyjściu kodu to wszystko działa.

Kod nie wykonuje się dwa razy. Mam w kodzie tylko jedno użycie deleteQuestion i jeśli test, który zrobiłem parę postów wyżej nic nie wykazał to nie ma takiej możliwości.

Ten post edytował qrzysztof 9.09.2011, 10:19:21


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
drPayton
post
Post #19





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Control question:

$this->dbm != $this?

Czyli na pewno nie zapętlasz działania tego skryptu? (identyczne nazwy metod, mały błąd przy definicji $this->dbm i kaput...)
Go to the top of the page
+Quote Post
qrzysztof
post
Post #20





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


@drPayton - o zapętlaniu nie ma mowy, choć jeszcze sprawdzę ten wątek.

Dlaczego podejrzewam funkcję unset? Ponieważ to die(), które @nospor zaproponował wykona się jeśli jest przed nią. Umieszczone po tej linii gdzie jest unset() już się nie wykona.

Edit: sprawdziłem zmieniając nazwy OBU deleteQuestion na różne. Bez zmian. Zresztą o zapętlaniu nie mogło być mowy. $dbm to obiekt kontaktujący się z bazą i operujący bezpośrednio na niej.

Ten post edytował qrzysztof 9.09.2011, 10:28:41


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 19:18