Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Zwracanie obiektu PDO
piekarz
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Witam.
Mam klasę która wykonuje zapytania do bazy danych i wynik zapytania chciałbym zwrócić poza tą klasę.

Jak mogę to zrobić

  1. $login = $_GET['login'];
  2. $user = new getData();
  3. $user->loadUser($login);
  4.  
  5. $arr = $user->fetch()
  6. echo $arr['id'];


Zapytani fetch() nie działają.
Klasa z zapytaniem PDO.
  1. public function loadUser($login){
  2.  
  3. $getData = $this->db->prepare("SELECT * FROM users WHERE user=:login");
  4. $getData->bindValue(':login', $login, PDO::PARAM_STR);
  5. $getData->execute();
  6.  
  7. return $getData;
  8.  
  9.  
  10. }


W klasie jeśli dokonam zapytania fetch() to wszystko gra.
Jak to powinno być napisane aby działało poza klasą?

Dziękuję.

Ten post edytował piekarz 16.02.2017, 12:29:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
Lord
post
Post #2





Grupa: Zarejestrowani
Postów: 239
Pomógł: 32
Dołączył: 10.03.2004

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


Cytat(piekarz @ 16.02.2017, 13:23:51 ) *
Witam.
Mam klasę która wykonuje zapytania do bazy danych i wynik zapytania chciałbym zwrócić poza tą klasę.

Jak mogę to zrobić

  1. $login = $_GET['login'];
  2. $user = new getData();
  3. $user->loadUser($login);
  4.  
  5. $arr = $user->fetch()
  6. echo $arr['id'];


Zapytani fetch() nie działają.
Klasa z zapytaniem PDO.
  1. public function loadUser($login){
  2.  
  3. $getData = $this->db->prepare("SELECT * FROM users WHERE user=:login");
  4. $getData->bindValue(':login', $login, PDO::PARAM_STR);
  5. $getData->execute();
  6.  
  7. return $getData;
  8.  
  9.  
  10. }


W klasie jeśli dokonam zapytania fetch() to wszystko gra.
Jak to powinno być napisane aby działało poza klasą?

Dziękuję.


$user = new getData();

nie masz takiej methody $user->fetch(); ale czemu to nie może być wewnątrz $user->loadUser($login); ? Co chcesz osiągnąć?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #3





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

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


Skoro zwracasz coś z loadUser() to wypadało by odebrać to do jakiejś zmiennej i na niej wykonać fetch();

Ten post edytował Pyton_000 16.02.2017, 13:06:42
Go to the top of the page
+Quote Post
piekarz
post
Post #4





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Zrobiłem to w ten sposób:

  1. $user = new getData();
  2. $result = $user->loadUser($login);
  3. $arr = $result->fetch();
  4. echo $arr['id];


I też nie działa.

A chce osiągnąć to aby mógł do wyników pobranych z bazy danych odwoływać się w taki sposób:

$arr['id']; $arr['imie'] itp.

A nie w sposób:
$user->getData('id);

I tylko tyle.
Może i to nie jest super do szczęścia potrzebne ale ciekawi mnie czy da się tak zrobić.
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%)
-----


var_dump($arr, $result);
Go to the top of the page
+Quote Post
viking
post
Post #6





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


http://php.net/manual/en/pdostatement.fetch.php
$arr = $result->fetch(PDO::FETCH_ASSOC);


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





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Po zrobieniu: $arr = $result->fetch(PDO::FETCH_ASSOC);
var_dump($arr);
Otrzymuję "bool(false)"
Go to the top of the page
+Quote Post
viking
post
Post #8





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Więc nie było rekordów spełniających warunek albo jakiś inny błąd. Włącz pełne raportowanie.


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





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


A jak się włącza pełne raportowanie?

Rekord spełniający warunek na pewno jest bo rowCount() zwraca mi 1, a po drugie gdy użyje metody fetch() w obiekcie getData to wszystko jest ok.

A u Ciebie taki kod działa?
Go to the top of the page
+Quote Post
viking
post
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Zobacz przypięty wątek. Używasz przestrzenie nazw?


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





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


To jest testowy kawałek kodu w całkowicie nowym dokumencie.
Coś takiego nie działało mi właśnie w projekcie który sklejam powoli. Myślałem że tam coś jest namieszane dlatego postanowiłem przetestować to w nowym pustym dokumencie. Więc cała moja aplikacja składa się z trzech plików. Kod poniżej.


Plik get.php
  1.  
  2. include 'getData.class.php';
  3. $login = $_GET['login'];
  4. $user = new getData();
  5. $stmt = $user->loadUser($login);
  6. $arr = $stmt->fetch();
  7. var_dump($arr);


Plik getData.class.php

  1. class getData
  2. {
  3.  
  4. public function __construct()
  5. {
  6.  
  7. try {
  8. $this->db = new PDO('mysql:host=localhost;dbname=test_db', 'root');
  9. $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10.  
  11.  
  12. }
  13. catch(PDOException $er)
  14. {
  15. $errorMsg = 'Błąd połączenia z bazą danych '.$er->getMessage();
  16. echo($errorMsg);
  17. }
  18.  
  19. }
  20.  
  21.  
  22. public function loadUser($login){
  23. try {
  24. $getData = $this->db->prepare("SELECT * FROM users WHERE user=:login");
  25. $getData->bindValue(':login', $login, PDO::PARAM_STR);
  26. $getData->execute();
  27.  
  28. return $getData;
  29. }
  30. catch(PDOException $er)
  31. {
  32. $errorMsg = 'Błąd pobrania wszystkich wartości '.$er->getMessage();
  33. echo $errorMsg;
  34. return false;
  35. }
  36. }


I plik index.php

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <meta charset="UTF-8">
  4. <title>Title</title>
  5. </head>
  6. <form action="get.php" method="get">
  7. <input name="login" type="text" title="name">
  8. <input type="submit" value="wyslij">
  9.  
  10.  
  11. </form>
  12. </body>
  13.  


Ten post edytował piekarz 17.02.2017, 21:22:32
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




Nie:
$user->loadUser($login);
$arr = $user->fetch()

A:
$stmt = $user->loadUser($login);
$arr = $stmt->fetch();

Zwracaj uwage na to co piszesz, co maja twoje klasy i co zwracaja funkcje,ktore sam tworzysz


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

"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
piekarz
post
Post #13





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Przecież to też nie działa.
Wynik var_dump jest ten sam co poprzednio.
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




Poprawilem ci kod, bo miales totalnie zle, wiec sie prosze nie przeciezuj.
Wlacz ze wkoncu wyswietlanie bledow a nie latasz po omacku


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

"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
piekarz
post
Post #15





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 23.08.2011

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


Cytat(nospor @ 17.02.2017, 22:33:58 ) *
Poprawilem ci kod, bo miales totalnie zle, wiec sie prosze nie przeciezuj.
Wlacz ze wkoncu wyswietlanie bledow a nie latasz po omacku


Co znaczy "nie przeciezuj" smile.gif

Nie ma żadnych błędów.
Sprawdź czy u Ciebie taki kod działa.
Go to the top of the page
+Quote Post
viking
post
Post #16





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Taki na pewno nie zadziała bo hasła do bazy nie ma. Twoja metoda zwraca PDOStatement i normalnie na tym masz operować. Zrób dodatkowo var_dump($login); przed przekazaniem do loadUser(). Plików nie nazywa się costam.class.php tylko według nazwy klasy + autoloader. http://www.php-fig.org/psr/psr-4/

Ten post edytował viking 18.02.2017, 07:42:25


--------------------
Go to the top of the page
+Quote Post
Tomplus
post
Post #17





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


@Piekarz
Nospor zaprzeczył twoje "Przecież", bo błędnie zinterpretowałeś jego podpowiedź.

Musisz zrozumieć co dana funkcja ma Ci zwrócić, dlatego tak bardzo chcemy abyś czytał to co pisze w var_dump, a pisze tam bardzo dużo na temat obiektów które pobierasz.

Jak napisałeś wcześniej, to obiekt $user nie ma metody fetch(), więc nie będzie Ci działać.
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: 21.08.2025 - 05:32