Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Iterator - dlaczego to działa?
spokoloko123
post 9.05.2012, 19:49:36
Post #1





Grupa: Zarejestrowani
Postów: 114
Pomógł: 12
Dołączył: 15.02.2012

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


  1. <?
  2. class QueryIterator implements Iterator
  3. {
  4. private $result;
  5. private $connection;
  6. private $data;
  7. private $key=0;
  8. private $valid;
  9.  
  10. function __construct($host, $user, $password, $dbname)
  11. {
  12. $this->connection = mysql_connect($host, $user, $password);
  13. mysql_select_db($dbname);
  14. }
  15. //wykonujemy zapytanie o imiona i email
  16. public function exceute($query)
  17. {
  18. $this->result = mysql_query($query);
  19. if (mysql_num_rows($this->result)>0)
  20. $this->next();
  21. }
  22. public function rewind() {}
  23. public function current()
  24. {
  25. return $this->data;
  26. }
  27. public function key()
  28. {
  29. return $this->key;
  30. }
  31. //dane zapisywane są w $data, $valid=true, $key++
  32. public function next()
  33. {
  34. if ($this->data = mysql_fetch_assoc($this->result))
  35. {
  36. $this->valid = true;
  37. $this->key+=1;
  38. }
  39. else
  40. $this->valid = false;
  41. }
  42. public function valid()
  43. {
  44. return $this->valid;
  45. }
  46. }
  47.  
  48. $qi = new QueryIterator("localhost", "user", "pass", "test");
  49. $qi->exceute("SELECT name, email FROM users");
  50. while($qi->valid())
  51. {
  52. print_r($qi->current());
  53. $qi->next();
  54. }
  55. ?>


Nie wiem za bardzo dlaczego to działa ;P. Funkcja key nie jest nigdzie używana a po jej usunięciu wywala błąd.


--------------------
Pomogłem? Kliknij POMÓGŁ
Go to the top of the page
+Quote Post
greycoffey
post 9.05.2012, 20:01:46
Post #2





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Manual -> "implements Iterator", poszukaj o tym interfejsie
Go to the top of the page
+Quote Post
spokoloko123
post 9.05.2012, 20:03:02
Post #3





Grupa: Zarejestrowani
Postów: 114
Pomógł: 12
Dołączył: 15.02.2012

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


jak wywale implements Iterator to nadal działa


--------------------
Pomogłem? Kliknij POMÓGŁ
Go to the top of the page
+Quote Post
greycoffey
post 9.05.2012, 20:59:06
Post #4





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Poczytales o tym interfejsie? Chyba nie...
Go to the top of the page
+Quote Post
spokoloko123
post 10.05.2012, 06:31:15
Post #5





Grupa: Zarejestrowani
Postów: 114
Pomógł: 12
Dołączył: 15.02.2012

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


To inaczej... kiedy ten warunek będzie nie prawdziwy?
  1. $this->data = mysql_fetch_assoc($this->result)


--------------------
Pomogłem? Kliknij POMÓGŁ
Go to the top of the page
+Quote Post
bastard13
post 10.05.2012, 06:42:55
Post #6





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

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


Ten 'warunek' będzie fałszywy, jeżeli funkcja mysql_fetch_assoc zwróci Ci false (w podlinkowanej stronie jest napisane kiedy).


--------------------
Go to the top of the page
+Quote Post
spokoloko123
post 10.05.2012, 07:17:05
Post #7





Grupa: Zarejestrowani
Postów: 114
Pomógł: 12
Dołączył: 15.02.2012

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


Dobra, widzę, że ktoś ogarnia wink.gif (@bastard13). Są postępy ;P tylko jedna rzecz w iteratorach mi nie daje spokoju. Skąd next() i current() wiedzą, że ten jest koleny, a ten wiersz jest obencnie potrzebny? Czy to coś w rodzaju pętli? Nie wiem czy się dobrze wyraziełem... ale skąd wiadomo (ja wiem, ale skąd to wie PHP) która zmienna przechowuje tablice by przejścia przez nią?

Ten post edytował spokoloko123 10.05.2012, 07:49:13


--------------------
Pomogłem? Kliknij POMÓGŁ
Go to the top of the page
+Quote Post
tehaha
post 10.05.2012, 11:29:00
Post #8





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Każda tablica ma wewnętrzny wskaźnik, funkcja mysql_fetch_assoc() pobiera tablicę i przesuwa wskaźnik, dlatego przy następnym wywołaniu pobierze kolejny element, funkcja zwróci FALSE kiedy nie będzie już więcej wyników do zwrócenia
Cytat
Returns an associative array that corresponds to the fetched row and moves the internal data pointer ahead
-> http://www.php.net/mysql_fetch_assoc

Ten post edytował tehaha 10.05.2012, 11:29:36
Go to the top of the page
+Quote Post
spokoloko123
post 10.05.2012, 13:13:47
Post #9





Grupa: Zarejestrowani
Postów: 114
Pomógł: 12
Dołączył: 15.02.2012

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


"normalnie" do zmiennej została by zapisana cała tablica a tu tylko jeden wiersz... do czego to zależy i co to definiuje, że będzie przypisany tylko ten jeden wiersz a nie wszystkie?


--------------------
Pomogłem? Kliknij POMÓGŁ
Go to the top of the page
+Quote Post
tehaha
post 10.05.2012, 13:48:29
Post #10





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
"normalnie" do zmiennej została by zapisana cała tablica a tu tylko jeden wiersz
Normalnie czyli jak? Możesz podać przykład? Nie bardzo rozumiem o co Tobie chodzi. Wysyłasz zapytanie do bazy danych funkcją mysql_query(), która w przypadku zapytania SELECT zwraca zasób . Zasób posiada wskaźnik wewnętrzny, który trzyma wartość "obecnego" rekordu. Funkcja mysql_fetch_array() zwraca jeden rząd z zasobu w postaci tablicy asocjacyjnej i przesuwa wskaźnik wewnętrzny na kolejny rząd w zasobie. To, że następuje tutaj przesunięcie tego wskaźnika wynika z działania funkcji mysql_fetch_array(), która sprawdza wartość wskaźnika, pobiera rząd wyników i przesuwa wskaźnik. Możesz samodzielnie przesuwać ten wskaźnik funkcją mysql_data_seek().

Wydaje mi się, że to co Tobie się myli to ten zasób, który przekazujesz do funkcji mysql_fetch_array() - to nie jest to samo co wielowymiarowa tablica, to jest specjalny typ zmiennej.
Go to the top of the page
+Quote Post
greycoffey
post 10.05.2012, 13:59:52
Post #11





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


  1. <?php
  2. $array = array(0,1,2,3,4);
  3. for($i=0 /* $i to tak jakby wskaźnik */;$i<count($array);++$i /* tutaj robimy jakby next*/)
  4. {
  5. echo $array[$i].PHP_EOL;
  6. }

W tym wypadku $i jest wskaźnikiem, next() go inkrementuje, rewind() ustawia na 0.
key() zwraca klucz danego obiektu, a current() wartosc.
Go to the top of the page
+Quote Post
spokoloko123
post 10.05.2012, 14:10:31
Post #12





Grupa: Zarejestrowani
Postów: 114
Pomógł: 12
Dołączył: 15.02.2012

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


A ok haha.gif to dużo wyjaśnia. A da się ten zasób jakoś przypisać (tak z ciekawości)?
Wiem, że Iterator jest głównym interfejsem, który definiuje metody, ale po usunięciu jego implementacji nadal wszystko działa jak należy... więc o co chodzi?

Ten post edytował spokoloko123 10.05.2012, 14:47:05


--------------------
Pomogłem? Kliknij POMÓGŁ
Go to the top of the page
+Quote Post
greycoffey
post 10.05.2012, 15:10:01
Post #13





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Działa bo to:
  1. while($qi->valid())
  2. {
  3. print_r($qi->current());
  4. $qi->next();
  5. }

można zamienić na:
  1. foreach($qi as $value)
  2. {
  3. echo $value;
  4. }

Jeśli jest zdefiniowany interfejs wink.gif
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 03:34