Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Podówjne pobieranie z bazy
IceManSpy
post
Post #1





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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?

Ten post edytował IceManSpy 20.08.2010, 21:31:29
Go to the top of the page
+Quote Post
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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ś (IMG:style_emoticons/default/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.
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: 27.08.2025 - 01:32