Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP][MVC] Problem z wyświetlaniem danych z tablicy asocjacyjnej
Forum PHP.pl > Forum > Przedszkole
Zajac1982
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.
amii
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.
Turson
  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
Zajac1982
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.
Turson
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. }
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.