Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Pdo- kilka wątpliwości
Boshi
post
Post #1





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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 ?

Ten post edytował Boshi 12.02.2015, 19:45:01
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


fetch pobiera i zwraca jeden rekord, fetchAll pobiera i zwraca wszystkie rekordy.


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





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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?
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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.


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





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Fetch możesz stosować jedynie w pętli while()
Go to the top of the page
+Quote Post
Boshi
post
Post #6





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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?

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





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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)
Go to the top of the page
+Quote Post
Boshi
post
Post #8





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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'];
Go to the top of the page
+Quote Post
Pyton_000
post
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Przecież powyżej dajesz pobranie z fetch :|
Go to the top of the page
+Quote Post
Boshi
post
Post #10





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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ł..
Go to the top of the page
+Quote Post
com
post
Post #11





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


http://php.net/manual/en/pdo.query.php manuala poczytać wystarczyło
Go to the top of the page
+Quote Post
Boshi
post
Post #12





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


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

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





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
Boshi
post
Post #14





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


Dzięki smile.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 Aktualny czas: 19.08.2025 - 10:20