Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Podówjne pobieranie z bazy
Forum PHP.pl > Forum > PHP
IceManSpy
Witam

Zastanawiam się, czemu wyświetlają mi się 2 razy rekordy. Chcę też stworzyć system templatek wg tego linku:
http://www.programuj.com/artykuly/www/template.php
Więc co mam:
  1. class Template {
  2. var $tmpl;
  3. var $dane;
  4.  
  5. function Template ($name)
  6. {
  7. $this->tmpl = implode('', file($name));
  8. $this->dane = Array();
  9. }
  10.  
  11. function add($name, $value = '')
  12. {
  13. if (is_array($name)) {
  14. $this->dane = array_merge($this->dane, $name);
  15. } else if (!empty($value)) {
  16. $this->dane[$name] = $value;
  17. }
  18. }
  19.  
  20. function execute() {
  21. return preg_replace('/{([^}]+)}/e', '$this->dane["\\1"]',
  22. $this->tmpl);
  23. }
  24.  
  25. }
  26. class Bazowa
  27. {
  28. public function PobierzDane()
  29. {
  30. $db = new mysqli("localhost", "root", "haselko", "test");
  31. if($db->connect_errno){
  32. die('Błąd połączenia: ' . $db->connect_errno);
  33. }
  34. $sql = "select * from tabela1";
  35. $zapytanie = $db->query($sql);
  36. while($wynik=$zapytanie->fetch_assoc())
  37. {
  38. $dane[]= $wynik;
  39. }
  40. $db->close();
  41. return $dane;
  42. }
  43. function Wyswietl($tablica)
  44. {
  45. foreach($tablica as $wyn)
  46. {
  47. foreach($wyn as $pokaz => $wart)
  48. {
  49. echo $pokaz." = ".$wart."<br />";
  50. }
  51.  
  52. }
  53.  
  54. echo "</table>";
  55.  
  56. }
  57. function Dodaj($id,$nazwa)
  58. {
  59. $db = new mysqli("localhost", "root", "qweasd", "test");
  60. $sql = "insert into `tabela1` values ($id , '$nazwa')";
  61. $db->query($sql);
  62. $db->close();
  63. echo "Dodano nowy rekord<br>";
  64. $dane = self::PobierzDane();
  65. self::Wyswietl($dane);
  66. }
  67. function __destruct()
  68. {
  69. echo "Obiekt został zniszczony!";
  70. }
  71. }
  72. $wiz = new Bazowa();
  73. $dane = $wiz->PobierzDane();
  74. print_r($dane);
  75. echo "<br><br>";
  76. $wiz->Wyswietl($dane);

Baza wygląda tak, że mam 2 tabele: ID i nazwa i tam są przykładowe dane (6 wierszy). Jeśli odpalę powyższy kod to jest ok - raz się wyświetla. Jednak jeśli przerobię funkcję wyświetlającą na taką:
  1. function Wyswietl($tablica)
  2. {
  3. echo "<table border=\"1\">";
  4. foreach($tablica as $wyn)
  5. {
  6. foreach($wyn as $pokaz => $wart)
  7. {
  8. $tmpl = new Template('temp.tmp.php');
  9. $tmpl->add($wyn);
  10. echo $tmpl->execute();
  11. }
  12.  
  13. }

To otrzymuję podwójne wyniki tzn ID 1 1 2 2 3 3 4 4.
Jeśli chodzi o plik z templatką to:
Kod
<tr>
<td bgcolor="silver">
  {ID}
</td>
<td>
  {nazwa}
</td>
</tr>

Gdzie tkwi błąd?
Jeśli dopiszę do tej 2 funkcji wyświetlającej print_r($wyn); nad $tmpl->add($wyn); to dostaję:
Array ( [ID] => 1 [nazwa] => php ) Array ( [ID] => 1 [nazwa] => php ) Array ( [ID] => 9 [nazwa] => c++ ) Array ( [ID] => 9 [nazwa] => c++ ) Array ( [ID] => 7 [nazwa] => kurs ) Array ( [ID] => 7 [nazwa] => kurs ) Array ( [ID] => 4 [nazwa] => mysql ) Array ( [ID] => 4 [nazwa] => mysql ) Array ( [ID] => 5 [nazwa] => oracle ) Array ( [ID] => 5 [nazwa] => oracle ) Array ( [ID] => 6 [nazwa] => js ) Array ( [ID] => 6 [nazwa] => js ) Array ( [ID] => 10 [nazwa] => C# ) Array ( [ID] => 10 [nazwa] => C# )
Czyli widać, że pobiera za dużo razy, ale dlaczego?

A może jest jakiś inny sposób na pobranie danych z bazy, przypisanie do jakiejś zmiennej, aby potem przekazać i wykorzystać w templatce?
Pilsener
Klasa "bazowa" jak rozumiem to Twoja inwencja? Nie ma sensu pisanie metod, które:
1. Zawierają kod html (html to powiedzmy szablon/widok, a szablon to dane a nie algorytm aplikacji)
2. Wyświetlają coś na ekranie (nawet obsługa błędów wysyła je do odpowiednich szablonów a nie echuje na ekranie)
3. Łącza wszystko w jeden kociokwik: łączą się z bazą, wykonują zapytania, przerywają działanie skryptu (utniesz stronę w połowie, to bez sensu przecież), echują coś na ekran (a gdy potem błąd to co? Ma browser zwrócić to co mu wysłałeś?) czy obsługują błędy, takich rzeczy nie robi się nawet pisząc kod strukturalny (oczywiście w miarę porządny kod strukturalny)

Poza tym przemyśl, co próbujesz zrobić (no i masz błąd logiczny w tej pętli) bo odnoszę wrażenie, że kompletnie nie rozumiesz jak to ma działać... właśnie po to tworzymy system szablonów, by nie musieć w pętli xxxxx razy tworzyć obiektu $tmpl, dodawać do niego po jednej zmiennej i o zgrozo - po każdej takiej akcji wykonywać metodę execute. Tak to ma działać:

1. Tworzysz obiekt $tmpl - RAZ!
2. Dodajesz do niego TABLICĘ zmiennych w układzie nazwa zmiennej => kod html - RAZ! Jeśli potrzebujesz dodać zmienną/zmienne to dodajesz je do tej tablicy (zalecane) lub używasz metody $tmpl->add (mniej wydajne, lepiej użyć metody add tylko raz), nie musisz ponownie tworzyć obiektu $tmpl
3. Łączysz zmienne z szablonem wykonując metodę execute - RAZ!

Jeśli jeden szablon nie wystarczy, możesz użyć ich wiele, np.:
  1. $glowna['title'] = 'Tytul strony pobierany z bazy etc';
  2. $glowna['lewa'] = $tmpl_lewa->execute($dane_lewej_manki);
  3. $glowna['prawa'] = $tmpl_prawa->execute($dane_prawej_manki);
  4. echo $tmpl_glowny->execute($glowna);
- pominąłem tworzenie obiektów tmpl, tak tworzysz szablon, który składa się z pod-szablonów, w tym wypadku szablon strony + dwa szablony na każdą kolumnę, w ten sposób budujemy drzewo szablonów.

I naucz się, że najpierw się przygotowuje wszystkie zmienne, potem łączy je z html a dopiero na samym końcu wysyła to do przeglądarki, taka jest elementarna logika tworzenia stron w PHP niezależnie od tego, czy zamykasz ten kod w klasy czy nie.
IceManSpy
Czyli np pobieramy dane z bazy, mamy jakiś szablonik i wtedy podmieniamy te dane i wyświetlamy? (tak odbiegając od tematu właściwego, ale też ważny poruszyłeś smile.gif ) W sumie czytałem o Smarty, ale podobno jeśli są jakieś proste strony to nie warto używać Smarty, bo biblioteka zajmuje ok 300 KB.
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.