Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]Array w arrayu z bazy danych
Forum PHP.pl > Forum > Przedszkole
grzesoz
Witam

Mam problem z wyciąganiem danych z bazy.

mam 2 tabele:

struktura pierwszej

id(int), imie(string)

sturktura drugiej:

id(int), id_czlowieka(int), kolor(string)

id_czlowieka to id z pierwszej tabeli, a ogólnie chodzi o przypisanie ulubionego koloru do człowieka. Tylko że człowiek może mieć kilka ulubionych kolorów

Przykładowe dane:

tabela pierwsza:

id, imie
1, Grzesiek

tabela druga:

id, id_czlowieka, kolor
1,1,czerwony
2,1, niebieski

używając zapytania SQL moge wyciągnąć coś takiego:

  1. SELECT p.imie d.kolor FROM pierwsza AS a JOIN druga sa d ON p.id=d.id_czlowieka


Grzesiek czerwony
Grzesiek niebieski

ale chciałbym otrzymać coś takiego:

Grzesiek czerwony,niebieski

moge coś takiego osiągnąć używająć:

  1. SELECT p.imie, GROUP_CONCAT(DISTINCT d.kolor) AS kolory FROM pierwsza AS a JOIN druga sa d ON p.id=d.id_czlowieka


i w php otrzymam takiego arraya:

  1. array(1) { [0]=> object(stdClass)#4 (7) { ["imie"]=> string(4) "Grzesiek" ["kolory"]=> string(18) "czerwony,niebieski" } }


tylko że "czerwony,niebieski" będzie jednym stringiem, a ja bym chciał żeby nie był jednym tylko dwoma: "czerwony","niebieski"

żeby array w php zwrócił coś w stylu (sam pisałem tak dla przykładu, wiec nie wiem czy jest możliwe takie zwrócenie):

  1. array(1) { [0]=> object(stdClass)#4 (7) { ["imie"]=> string(4) "Grzesiek" ["kolory"]=> list[ string(8)"czerwony", string(9) "niebieski" ]} }



ma może ktoś pomysł jak to osiągnąć?
przydałby sie taki array w arrayu żeby móc potem te kolory pojedyńczo wyciągnąć
viking
A co za problem explode() na tym zrobić? Niestety sterowniki baz w PHP nie są za fajne gdy chodzi o takie dane. Pytałem kiedyś o taką funkcjonalność teamu php ale nie byli za bardzo chętni żeby wprowadzić - nawet tylko dla samego typu JSON.

  1. class dane {
  2. private $imie;
  3.  
  4. public function setImie($imie) {
  5. $this->imie = $imie;
  6. return $this;
  7. }
  8. public function setKolory($kolory) {
  9. $this->kolory = explode(',', $kolory);
  10. return $this;
  11. }
  12. public function getkolory() {
  13. return $this->kolory;
  14. }
  15. public function __set($key, $val) {
  16. if ($key === 'kolory') {
  17. $this->setKolory($val);
  18. }
  19. }
  20.  
  21. }
  22. $result = $stmt->fetchAll(PDO::FETCH_CLASS, dane::class);
  23. var_dump($result);
trueblue
W PDO w trybie pobierania PDO::FETCH_GROUP|PDO::FETCH_UNIQUE
grzesoz
Dzięki wielkie za pomoc

Mam jeszcze pytanie do tego kodu napisanego powyżej.

Jako że jestem raczej leszczem niż programistą to mam pytanie jak przejść z klasy do:

  1. $result = $stmt->fetchAll(PDO::FETCH_CLASS, dane::class);
  2. var_dump($result);


bo o ile co się dzieje w klasie to wiem, to co to jest i czemu tak jest to pojęcia nie mam
viking
Sprecyzuj pytanie bo przeczytałem kilka razy i nie wiem z czym jest problem.
nospor
Linijka, o ktora pytasz, pobiera dane z bazy i kazdy rekord rzutuje na obiekt klasy dane. Czyli zamiast rekord zwracac jako tablica, to zwraca jako obiekt konkretnej klasy, ktora okresliles.
grzesoz
Problemem było to że nie do końca wiedziałem co to za linijka, teraz już wiem trochę więcej ale:

mam kod:
  1. $stmt = $mysql-> wyswietl();
  2.  
  3. var_dump($stmt);
  4.  
  5. $result = $stmt->fetchAll(PDO::FETCH_CLASS, dane::class);
  6.  
  7. var_dump($result);


wyswietl() << pobiera dane z Bazy
  1. public FUNCTION wyswietl(){
  2. $dane =
  3. 'SELECT p.imie, GROUP_CONCAT(DISTINCT d.kolor) as KK
  4. FROM druga as d
  5. JOIN pierwsza as p on p.id=d.id_czlowiek'
  6. ;
  7. RETURN $this->connection->query($dane)->fetch(PDO::FETCH_OBJ);
  8. }


i var_dump($stmt); wypluwa:
object(stdClass)#6 (2) { ["imie"]=> string(8) "Grzegorz" ["KK"]=> string(24) "czarny,zielony,niebieski" }

ale var_dump($result); wypluwa:

Fatal error: Call to undefined method stdClass::fetchAll() in C:\Programy\xampp\htdocs\test\index.php on line 88

Zakłądam że powodem tego że nie wychodzi jest jakieś moje złe rozumowanie i brak wiedzy, moge prosić o nakierowanie?
nospor
Pomieszales dwa rozne kody. viking robiac fetchAll pracowal na obiekcie bazy. Ty fetchAll robisz na wyniku funkcji wyswietl(), ktora jest zupelnie czym innym..

Ty w funkcji wyswetl() - swoja droga bezsensowna nazwa do tego co ona robi :/ - masz wstawic kod vikinga:

  1. public FUNCTION wyswietl(){
  2. $dane =
  3. 'SELECT p.imie, GROUP_CONCAT(DISTINCT d.kolor) as KK
  4. FROM druga as d
  5. JOIN pierwsza as p on p.id=d.id_czlowiek'
  6. ;
  7. RETURN $this->connection->query($dane)->fetchAll(PDO::FETCH_CLASS, dane::class);
  8. }
grzesoz
nazwa w tym przypadku nie jest zbyt istotna bo to talko tak testowo robię żeby czegoś sie nauczyć

i zrobiłem tak jak piszesz i mam wynik:

array(1) { [0]=> object(dane)#4 (1) { ["imie":"dane":private]=> string(8) "Grzegorz" } }

i brakuje mi kolorów

moj cały kod

  1. <!DOCTYPE html>
  2. <?php
  3. class Connector {
  4. //deklaracja zmiennych globalnych
  5. private $connection;
  6.  
  7. //konstruktor
  8. public function __construct($db, $host, $user, $password){
  9. try {
  10. $dsn = "mysql:host=".$host.";dbname=".$db;
  11. $this->connection = new PDO($dsn, $user, $password);
  12. } catch (PDOException $ex) {
  13. print "Error: ".$ex->getMessage();
  14. die();
  15. }
  16. }
  17.  
  18. public FUNCTION wyswietl(){
  19. $dane =
  20. 'SELECT p.imie, GROUP_CONCAT(DISTINCT d.kolor) as KK
  21. FROM druga as d
  22. JOIN pierwsza as p on p.id=d.id_czlowiek'
  23. ;
  24. RETURN $this->connection->query($dane)->fetchAll(PDO::FETCH_CLASS, dane::class);
  25. }
  26.  
  27. }
  28. ?>
  29. <html>
  30. <head>
  31. <meta charset="UTF-8">
  32. <title>TEST</title>
  33. </head>
  34. <body>
  35.  
  36. <?php
  37.  
  38. $mysql = new Connector('test', 'localhost', 'root', '');
  39.  
  40. class dane {
  41. private $imie;
  42.  
  43. public function setImie($imie) {
  44. $this->imie = $imie;
  45. return $this;
  46. }
  47. public function setKolory($kolory) {
  48. $this->kolory = explode(',', $kolory);
  49. return $this;
  50. }
  51. public function getkolory() {
  52. return $this->kolory;
  53. }
  54. public function __set($key, $val) {
  55. if ($key === 'kolory') {
  56. $this->setKolory($val);
  57. }
  58. }
  59. }
  60.  
  61. $stmt = $mysql-> wyswietl();
  62.  
  63. var_dump($stmt);
  64.  
  65. ?>
  66. </body>
  67. </html>
  68.  
  69.  
nospor
nazwy nawet testowo maja znaczenie.

Brakuje kolorow? Ciekawe czemu....
Moze dlatego, ze klasa oczekuje nazwy "kolory" a ty jej przekazujesz "KK"

jak widzisz nawet w tescie nazwy maja znaczenie wink.gif
grzesoz
Trudno się nie zgodzić

Dzięki za pomoc

to jeszcze kontynuując temat mam pytanie o dostęp do danych, po naniesieniu poprawek wszystkich kod wypluwa o taki wiersz:

array(1) { [0]=> object(dane)#4 (2) { ["imie"]=> string(8) "Grzegorz" ["kolory"]=> array(3) { [0]=> string(6) "czarny" [1]=> string(7) "zielony" [2]=> string(9) "niebieski" } } }

mogę do nich się dostać i wyświetlić o tak:

  1. foreach ($stmt as $dane) {
  2. echo $dane->imie." ";
  3.  
  4. $i = 0;
  5. $rozmiar = sizeof($dane->kolory);
  6.  
  7. do
  8. {
  9. echo $dane->kolory[$i]." ";
  10. $i++;
  11. } while($i<$rozmiar);
  12. }


otrzymując wiersz taki: Grzegorz czarny zielony niebieski

a jakbym bez pętli chciał wyświetlić sobie np: kolor zielony, tak po prostu
viking
A jak się Panie drogi dobieramy do elementów tablic? $a[2].
grzesoz
tyle to wiem, ale:

  1. print_r($stmt[0]);


wypluwa:

dane Object ( [imie] => Grzegorz [kolory] => Array ( [0] => czarny [1] => zielony [2] => niebieski ) )

i to jest ok, wszystko się zgadza

ale

  1. print_r($stmt[0]['imie']);


wypluwa:

Fatal error: Cannot use object of type dane as array in


bo liczyłem że dostanę się to tego mojego koloru w taki sposób:

  1. print_r($stmt[0]['kolor'][1]);


i wypluje: zielony

ale guzik z tego
viking
A do property klasy raczej się nie odnosisz jak do tablicy. ->
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.