Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL]Array w arrayu z bazy danych
grzesoz
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.11.2017

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


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ąć
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
viking
post
Post #2





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

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


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);


Ten post edytował viking 10.11.2017, 15:10:14
Go to the top of the page
+Quote Post
trueblue
post
Post #3





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

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


W PDO w trybie pobierania PDO::FETCH_GROUP|PDO::FETCH_UNIQUE
Go to the top of the page
+Quote Post
grzesoz
post
Post #4





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.11.2017

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


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

Ten post edytował grzesoz 13.11.2017, 16:15:26
Go to the top of the page
+Quote Post
viking
post
Post #5





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

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


Sprecyzuj pytanie bo przeczytałem kilka razy i nie wiem z czym jest problem.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.11.2017

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


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?

Ten post edytował grzesoz 13.11.2017, 16:54:40
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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. }
Go to the top of the page
+Quote Post
grzesoz
post
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.11.2017

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


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.  


Ten post edytował grzesoz 13.11.2017, 17:27:25
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
grzesoz
post
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.11.2017

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


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

Ten post edytował grzesoz 13.11.2017, 20:53:33
Go to the top of the page
+Quote Post
viking
post
Post #12





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

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


A jak się Panie drogi dobieramy do elementów tablic? $a[2].
Go to the top of the page
+Quote Post
grzesoz
post
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 10.11.2017

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


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





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

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


A do property klasy raczej się nie odnosisz jak do tablicy. ->
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 20:18