Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP][MVC] Problem z wyświetlaniem danych z tablicy asocjacyjnej
Zajac1982
post 15.03.2014, 12:32:48
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 27.05.2012

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


Witam. Piszę aplikację internetową w PHP opartą na modelu MVC, a do połączeń z bazą danych użysam PDO.
Mój problem polega na tym, że widok BiuroView nie wyświetla w ogóle wyników zapytania, mimo, iż rekordy znajdują
się w bazie.

W swoim projekcie wykorzystałem kod Model.class.php, który był dostępny na necie:

Model.class.php:

  1. public function select($from, $select='*', $where=NULL, $order=NULL, $limit=NULL) {
  2. $query='SELECT '.$select.' FROM '.$from;
  3. if($where!=NULL)
  4. $query=$query.' WHERE '.$where;
  5. if($order!=NULL)
  6. $query=$query.' ORDER BY '.$order;
  7. if($limit!=NULL)
  8. $query=$query.' LIMIT '.$limit;
  9.  
  10. $select=$this->pdo->query($query);
  11. $ilosc_kolumn = $select->columnCount();
  12. $ilosc_wierszy = $select->rowCount();
  13.  
  14. $select->setFetchMode(PDO::FETCH_ASSOC);
  15. $wynik = $select->fetch();
  16.  
  17. foreach ($select as $wynik)
  18. {
  19. for ($i=0;$i<=$ilosc_wierszy; $i++)
  20. {
  21.  
  22. $wynik = $select->fetch();
  23. $data[$i]=$wynik;
  24. }
  25.  
  26. }
  27.  
  28. $select->closeCursor();
  29.  
  30.  
  31. return $data;
  32. }


Wykorzystałem go, ponieważ spodobałą mi się koncepcja skrócenia pisania długich zapytań typu "select kolumna1, kolumna2 itp. from ..."
Model, którego problem dotyczy zwraca do widoku tablicę asocjacyjną, zawierającą wartości poszczególnych kolumn i wierszy:

BiuroModel.class.php:

  1. class BiuroModel extends Model{
  2.  
  3. public function pobierz_wszystkie_biura()
  4. {
  5. $wynik = $this->select('biuro');
  6. return $wynik;
  7. }
  8. }


zaś w widoku wygląda to następująco:

  1. class BiuroView {
  2.  
  3. private $tytul;
  4. private $naglowek;
  5. private $tresc;
  6. private $wynik;
  7.  
  8.  
  9. public function __construct($tytul, $naglowek, $tresc, $wynik)
  10. {
  11. $this->tytul = $tytul;
  12. $this->naglowek = $naglowek;
  13. $this->tresc = $tresc;
  14. $this->wynik = $wynik;
  15. $this->wyswietlStrone();
  16. }
  17.  
  18. private function wyswietlStrone()
  19. {
  20. echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
  21. echo '<head>';
  22. echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
  23. echo '<title>'.$this->tytul.'</title>';
  24. echo '</head>';
  25. echo '<body>';
  26. echo '<h1>'.$this->naglowek.'</h1>';
  27. echo '<p>'.$this->tresc.'</p>';
  28.  
  29. echo '<table border="0"><tr>';
  30. echo '<td>Nazwa Biura</td><td>Akcja</td></tr>';
  31.  
  32. echo '<td>'.$this->data[0]['nazwa_biura'].'</td></tr>';
  33. echo '<td>'.$this->data[1]['nazwa_biura'].'</td></tr>';
  34.  
  35. echo '</table>';
  36. echo '</body>';
  37. echo '</html>';
  38. }
  39. }
  40.  



Jak widać powyżej, testowo do wyświetlam pierwsze 2 wiersze tablicy data, a mimo to mam pusto.
Proszę o sugestie, gdzie leży problem. Za wszelką pomoc będę bardzo wdzięczny.
Pozdrawiam.
Go to the top of the page
+Quote Post
amii
post 15.03.2014, 12:43:31
Post #2





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Ale gdzie to konkretnie przekazujesz do widoku - bo w tym kodzie ja tego nie widzę.

Pokaż coś a'la kontroler gdzie używasz modelu i jego metod następnie przekazujesz dane do widoku bo to co zaprezentowałeś to zbiór luźnych nie połączonych ze sobą klas.


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
Turson
post 15.03.2014, 12:44:56
Post #3





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


  1. foreach ($select as $wynik)
  2. {
  3. for ($i=0;$i<=$ilosc_wierszy; $i++)
  4. {
  5.  
  6. $wynik = $select->fetch();
  7. $data[$i]=$wynik;
  8. }
  9.  
  10. }

Mógłbyś to zrobić w jednej pętli. Od razu pod pętlą wyprintuj dane, to okaże się czy w ogóle coś pobiera z bazy.

  1. $select=$this->pdo->query($query);

zamień na
  1. $select=$this->pdo->prepare($query);
  2. if(!select->execute()) print_r($select->errorInfo());

Pokaże ewentualne błędy bazy
Go to the top of the page
+Quote Post
Zajac1982
post 16.03.2014, 10:27:40
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 27.05.2012

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


Poprawiłem metodę "select" zgodnie z sugestiami. Obecnie ona wygląda następująco:

  1. public function select($from, $select='*', $where=NULL, $order=NULL, $limit=NULL) {
  2. $query='SELECT '.$select.' FROM '.$from;
  3. if($where!=NULL)
  4. $query=$query.' WHERE '.$where;
  5. if($order!=NULL)
  6. $query=$query.' ORDER BY '.$order;
  7. if($limit!=NULL)
  8. $query=$query.' LIMIT '.$limit;
  9.  
  10. //$select=$this->pdo->query($query);
  11.  
  12. $select=$this->pdo->prepare($query);
  13. if(!$select->execute()) print_r("Wystąpił błąd: ". $select->errorInfo());
  14.  
  15. $ilosc_kolumn = $select->columnCount();
  16. $ilosc_wierszy = $select->rowCount();
  17.  
  18. $select->setFetchMode(PDO::FETCH_ASSOC);
  19. //$wynik = $select->fetch();
  20. //print_r($wynik);
  21.  
  22. foreach ($select as $wynik)
  23. {
  24. for ($i=0;$i<=$ilosc_wierszy; $i++)
  25. {
  26.  
  27. $wynik = $select->fetch();
  28. $data[$i]=$wynik;
  29. }
  30.  
  31. }
  32.  
  33. echo "<BR>Dane: ".$data[0]['nazwa_biura']."<BR>";
  34.  
  35.  
  36. $select->closeCursor();
  37.  
  38.  
  39. return $data;
  40. }


Efekt działania jest taki, że wyświetla mi nazwę biura, ale jest jeden problem. Element o indeksie 0 wyświetla mi ... ostatni wiersz z kolumny "nazwa_biura". Kiedy przypisuję tablicy indeks 1, wyświetlany jest sam napis "Dane: " bez wartości. A więc problem polega na tym, że jest wyświetlany tylko jeden wiersz i to w dodatku ostatni. Będę wdzięczny za kolejne sugestie.
Jeszcze jedno: żaden błąd podczas preparacji zapytania nie leci. Metoda Phpinfo nic nie zwraca.
Go to the top of the page
+Quote Post
Turson
post 16.03.2014, 12:20:31
Post #5





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Wywal pętle foreach i for, a wstaw jedynie
  1. $data=$select->fetchAll();

zamiast
  1. $select->setFetchMode(PDO::FETCH_ASSOC);
  2. //$wynik = $select->fetch();
  3. //print_r($wynik);
  4.  
  5. foreach ($select as $wynik)
  6. {
  7. for ($i=0;$i<=$ilosc_wierszy; $i++)
  8. {
  9.  
  10. $wynik = $select->fetch();
  11. $data[$i]=$wynik;
  12. }
  13.  
  14. }


Ten post edytował Turson 16.03.2014, 12:21:06
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 Wersja Lo-Fi Aktualny czas: 15.06.2025 - 00:29