Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zwracanie obiektu PDO
Forum PHP.pl > Forum > Przedszkole
piekarz
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ę.
Lord
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ąć?
Pyton_000
Skoro zwracasz coś z loadUser() to wypadało by odebrać to do jakiejś zmiennej i na niej wykonać fetch();
piekarz
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ć.
Pyton_000
var_dump($arr, $result);
viking
http://php.net/manual/en/pdostatement.fetch.php
$arr = $result->fetch(PDO::FETCH_ASSOC);
piekarz
Po zrobieniu: $arr = $result->fetch(PDO::FETCH_ASSOC);
var_dump($arr);
Otrzymuję "bool(false)"
viking
Więc nie było rekordów spełniających warunek albo jakiś inny błąd. Włącz pełne raportowanie.
piekarz
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?
viking
Zobacz przypięty wątek. Używasz przestrzenie nazw?
piekarz
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.  
nospor
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
piekarz
Przecież to też nie działa.
Wynik var_dump jest ten sam co poprzednio.
nospor
Poprawilem ci kod, bo miales totalnie zle, wiec sie prosze nie przeciezuj.
Wlacz ze wkoncu wyswietlanie bledow a nie latasz po omacku
piekarz
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.
viking
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/
Tomplus
@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ć.
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.