Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pdo- kilka wątpliwości
Forum PHP.pl > Forum > Przedszkole
Boshi
Mam kilka wątpliwości i za nic nie mogę ich rozgryźć, manual niestety też nie pomógł zbytnio.

Chodzi o metody Fetch oraz FetchAll. Mianowicie kiedy się wykorzystuje którą? mam taki przykład.
Zwraca wszystkie Loginy z kolumny Login.
  1. $stmt=$pdo->query('Select Login From `uzytkownicy` ');
  2.  
  3. $result=$stmt->fetchAll(PDO::FETCH_ASSOC);
  4.  
  5. foreach ($result as $value )
  6. echo $value['Login'].'<br>';
  7.  


Jaka jest różnica pomiędzy tym ? oraz dlaczego pętla foreach pokazuje wyniki bez podania jej metody pobierania?


  1. foreach ($stmt as $dana)
  2. echo $dana['Login'];


a Np tutaj wyrzuci błąd?
  1. $result=$stmt->fetch(PDO::FETCH_ASSOC);
  2.  
  3. foreach ($result as $value )
  4. echo $value['Login'].'<br>';


Jak dla mnie to dane można wyciągnąć każdą metodą. Jedynie co zauważyłem to Fetch zwraca wyniki w formie tablicy asocjacyjnej(FETCH_ASSOC) jednowymiarowej a FetchAll w formie dwuwymiarowej.

I jeszcze jedn pytanie, pisząc kiedyś Cmsa prostego sprawdzałem czy w bazie istnieje taki wynik po przez
  1. if($query->fetch()) ...
a jak to by wyglądało przy fetchAll ?
trueblue
fetch pobiera i zwraca jeden rekord, fetchAll pobiera i zwraca wszystkie rekordy.
Boshi
Tak to wiem, ale jak to się ma do ww. przykładów i pytań? Kiedy jedno a kiedy drugie używać? jakaś różnica pomiędzy nimi w praktyce?
trueblue
Jeśli potrzebujesz pobrać jeden rekord, to używasz fetch, jeśli wszystkie to fetchAll, przecież nie odwrotnie.
Np. pobierając dane użytkownika używasz fetch, jeśli chcesz wyświetlić wszystkich użytkowników, to fetchAll.
Pyton_000
Fetch możesz stosować jedynie w pętli while()
Boshi
Cytat(trueblue @ 12.02.2015, 20:03:58 ) *
Jeśli potrzebujesz pobrać jeden rekord, to używasz fetch, jeśli wszystkie to fetchAll, przecież nie odwrotnie.
Np. pobierając dane użytkownika używasz fetch, jeśli chcesz wyświetlić wszystkich użytkowników, to fetchAll.


Tak to oczywiście zrozumiałem, ale jeżeli chcę pobrać wszystkie rekordy to przecież równie dobrze mogę użyć fetch w pęli np while tak jak Pyton napisał
  1. ($row=$stmt->fetch)...
Różnica taka, że fetch pobiera pojedyńczo każdy rekord i przetwarza w pętli. A FetchAll pobiera wszystko do tablicy asocjacyjnej i rónież przetwarza ową tablicę. Jedynym logiczny argumentem była by chyba wydajność tutaj.

Cytat(Pyton_000 @ 12.02.2015, 20:14:13 ) *
Fetch możesz stosować jedynie w pętli while()


No tak, ale dlaczego foreach nie pozwala użyć fetch?

Pyton_000
Ponieważ Fetch zwraca wiersz z wyniku a następnie przesuwa kursor o pozycję dalej.

Dla foreach ilość rekordów z wyniku fetch to 1.
while natomiast nie sprawdza ile jest danych tylko czy zwracane jest cokolwiek co nie jest logicznym false (np 0, pusty string, false, null)
Boshi
Dzięki, ale jeszcze pytanie jak to działa... skoro nie podajemy metody. Zapytanie zwraca obiekt PDO więc to nie jest chyba tablica by sobie foreach po tym przeleciał biggrin.gif? czy coś pokręciłem ?

  1. foreach ($stmt as $dana)
  2. echo $dana['Login'];
Pyton_000
Przecież powyżej dajesz pobranie z fetch :|
Boshi
Gdzie? ten ostatni przykład jest osobnym. Nigdzie nie pokazuje PHP jak ma pobierać rekord?

  1. $stmt=$pdo->query('Select Login From `uzytkownicy` ');
  2.  
  3.  
  4. foreach($stmt as $wartosc)
  5. echo $wartosc['Login'];


też normalnie pobiera i wyświetla? tak jak by po obiekcie przeleciał..
com
http://php.net/manual/en/pdo.query.php manuala poczytać wystarczyło
Boshi
Czyli po prostu trzeba uznać, że PDO daje taką możliwość i już ? Tak wynika z manuala przynajmniej.
Wychodzi, na to, że niby każda metoda służy do czegoś innego a i tak wszystkie można sprowadzić do jednej wymaganej czynności.

Jeżeli chcę wypisać wszystko po prostu użyję pętli foreach bez FetchAll, bądź fetch z while bądź fetchall z foreach... ten sam wynik.

jeżeli będę chciał sprawdzić czy coś istnieje w bazie to mogę użyć fetch lub normalnej pętli foreach + if + break, ale to nie optymalne.

Jeżeli będę chciał pobrać całą tablicę i na niej coś operowac mogę użyć zwykłej pętli foreach i wpisać dane do tablicy lub użyć gotowej FetchAll

Jeżeli się mylę, to niech ktoś jeszce mnie z błędu wyprowadzi smile.gif

com
no dodali dla ułatwienia, bo po query przeważnie itak robiłeś własnie fetch, a to że da się to wszytko sprowadzić do tego samego to logiczne ale kwestia tego czego potrzebujesz to wtedy tego użyjesz
Boshi
Dzięki smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.