Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Smarty] Wyświetlanie danych
Forum PHP.pl > Forum > Przedszkole
Lee
Takim o kodem
  1. <?php
  2. $poll -> db_query = 'SELECT * FROM $tbl_poll';
  3. $poll -> GetQuestion();
  4. $smarty -> assign('questions', $poll -> row);
  5. foreach ($poll -> row as $question){
  6. $poll = new poll;
  7. $poll -> GetAnswers($question['id']);
  8. $smarty -> assign('answers', $poll -> row);
  9. $poll = new poll;
  10. $question_id = $question['id'];
  11. $poll -> AllVoices($question_id);
  12. $smarty -> assign('all_voices', $poll -> all);
  13. }
  14. $smarty -> display("$theme/index.tpl");
  15. ?>

pobieram i wysyłam do pliku index.tpl pytanie i odpowiedzi do każdej sondy w pliku poll.tpl (includowany w index.tpl) dane wyświetlam w ten sposób
  1. <p class="text_03"><b>Archiwum Ankiet:</b></p>
  2. {foreach from=$questions item=question}
  3. <table cellspacing="0" cellpadding="0" style="margin: auto; width: 500px; border: 1px solid #000000;">
  4. <tr>
  5. <td colspan="2" class="text_01" style="background-color: {$color_1}"> <b>{$question.question}</b></td>
  6. </tr>
  7. {foreach from=$answers item=answer}
  8. <tr>
  9. <td colspan="2"class="text_01" style="background-color: {$color_2}">{$answer.answer} <img src="templates/Blue/images/poll.gif" style="height: 10px; width: {math equation="voice * 100 / voices" voice=$answer.votes voices=$all_voices format="%.0f"}px; border: 1px solid #000000"> {math equation="voice * 100 / voices" voice=$answer.votes voices=$all_voices format="%.2f"}%</td>
  10. </tr>
  11. {/foreach}
  12. <tr>
  13. <td class="text_01" style="background-color: {$color_1}">Rozpoczęta: <b>{$question.started}</b></td>
  14. <td class="text_02" style="background-color: {$color_1}">Zakończona: <b>
  15. {if empty($question.end)} Trwa
  16. {else}{$question.end}
  17. {/if}
  18. </b></td>
  19. </tr>
  20. </table><br />
  21. {/foreach}

I wszystko by było w porządku gdyby nie to, że pokazuje to w ten sposób
Cytat
Pytanie 1
Odpowiedź a (dla pyt 1)
Odpowiedź b (dla pyt 1)

Pytanie 2
Odpowiedź a (dla pyt 1)
Odpowiedź b (dla pyt 1)


a nie tak
Cytat
Pytanie 1
Odpowiedź a (dla pyt 1)
Odpowiedź b (dla pyt 1)

Pytanie 2
Odpowiedź a (dla pyt 2)
Odpowiedź b (dla pyt 2)


Pytanie brzmi gdzie jest błąd blinksmiley.gif
Jojo
Błąd jest w logice. W pętli robisz assign i każdym obrotem pętli nadpisujesz poprzednią wartość.
Proponowałbym w foreach'u utworzyć php'ową tablicę zawierającą odpowiednie dane a dopiero po zakończeniu pętli przypisać ją do zmiennej Smarty.
Lee
Na innym forum otrzymałem odpowiedź (cool.gif), że można pobrać komentarze i newsy jednym zapytaniem, ale niezabardzo wiem jak to połączyć z zapytaniem od Pagera

  1. <?php SELECT * FROM '.$tbl_news.' ORDER BY id DESC LIMIT '.$start.','.($end - $start + 1) ?>

z tym
  1. <?php select N.*, count(C.ID) iloscnewsow from tblog_tresc N
  2. left join tblog_komentarze C on C.artykul_id = N.id group by N.id; ?>


$tbl_news -tabela z newsami
Cytat
ID | title | content | author | category | data

$tbl_comments - tabela z komentarzami
Cytat
ID | what_id | title | content | author | email | ip | data | type*

*type - news / article

i wysłac to potem do smarty...
nospor
no normalnie. najpierw se przepisz to zapytanie co ci podalem na swoje tabele, a potem dopisz do tego order i limit z pagera.

I sie zdecyduj na jedna forum, bo nie bede ci wdwoch odpowiadal smile.gif
Lee
Teraz to wylgąda tak
  1. <?php
  2. $db_query = 'SELECT N.*, count(C.ID) AS comments FROM '.$tbl_news.' N left JOIN '.$tbl_comments.' C on C.what_id = N.id GROUP BY N.id ORDER BY id DESC LIMIT '.$start.','.($end - $start + 1);
  3. ?>

brakowało też AS pod count(C.ID), po dodaniu wszystko działa dzieki za pomoc smile.gif

P.S: wystarczy na jednym odpowiedzieć (tutaj) bo tam to w ostateczności pisze jak tutaj nikt nie odpowie
nospor
Cytat
brakowało też AS pod count(C.ID)
Nie, nie brakowalo. dziala i bez tego smile.gif
Lee
A dało by rady dołączyć do tego jeszcze jedną tabelę ? z kategorią ?
nospor
Ale co? ilosc kategorii dla newsa? NO powinno zadzialc na podobnej zasadzie jak ilosc kometnow
Lee
Nie nie, mam przy newsie (tabeli) napisane kategoria: (numer_kategori) no i szuka tego numeru kategorii w tablicy z kategoriami, pobiera obrazek dla tego numeru i wyświetla go przy newsie....można też odrazu zrobić obrazek dla newsa ale przecież na łatwizne to każdy potrafi (chyba, że jest róznica w szybkości działania skryptu)
nospor
No to jest to zwykle zlaczenie kolejenej tabeli. Tym razem nie zliczasz ilosci rekordow w niej, a pobierasz dane pole z niej i juz.
Kolejny left join a przy select kolejene pole do wyswietlenia
Lee
Zrobiłem tak
  1. <?php
  2. $db_query = 'SELECT N.*, count(C.ID) comments, K.* FROM '.$tbl_news.' N left JOIN '.$tbl_comments.' C on C.what_id = N.id, left JOIN '.$tbl_category.' K on K.id = N.category GROUP BY N.id ORDER BY id DESC LIMIT '.$start.','.($end - $start + 1);
  3. ?>

i nie działa :/
nospor
Spojrz w skladnie select....left join do manuala, a zobaczysz ze miedzy kolejnymi left join nie może byc przecinka. U ciebie jest smile.gif
Lee
no spojarzałem tutaj http://webcity.pl/webcity/artykuly.php/t/12 i nie rozumiem gdzie jest błąd
nospor
Ale ja chyba wyraźnie napisalem:
Cytat
do manuala

Wiesz co to jest manual?
http://dev.mysql.com/doc/refman/5.0/en/join.html

Rownie wyraźnie napisalem:
Cytat
a zobaczysz ze miedzy kolejnymi left join nie może byc przecinka. U ciebie jest

Wiesz co to jest przecinek? tongue.gif

I sobie popatrz wkoncu na to swoje zapytanie i zobacz przed ktorym left join masz przecinek. Przecinek tak wyglada "," tongue.gif
Lee
przecinka nie ma, manual przegladnienty, rozwiązania brak. Jak usunę K.* to działa ale nie pokazuje obrazka w tym select coś robię źle tylko nie mogę dojść co
nospor
Cytat
przecinka nie ma
Rozumiem, ze juz go usunales, bo byl smile.gif POkaz to nowe zapytanie po poprawkach.

przenosze, bo ze smarty to ma nie wiele wspolnego
Lee
  1. <?php
  2. $db_query = 'SELECT N.*, count(C.ID) comments, K.* FROM '.$tbl_news.' N left JOIN '.$tbl_comments.' C on C.what_id = N.id left JOIN '.$tbl_category.' K on K.id = N.category GROUP BY N.id ORDER BY id DESC LIMIT '.$start.','.($end - $start + 1);
  3. ?>


tak też próbowałem
  1. <?php
  2. $db_query = 'SELECT N.*, count(C.ID) comments, K.* FROM '.$tbl_news.' N left JOIN '.$tbl_comments.' C on (C.what_id = N.id) left JOIN '.$tbl_category.' K on (K.id = N.category) GROUP BY N.id ORDER BY id DESC LIMIT '.$start.','.($end - $start + 1);
  3. ?>
i ten sam skutek - nie działa

Updote
W kodzie miałem błąd (mój błąd winksmiley.jpg miało być K.costam as costam zamiast K.* winksmiley.jpg teraz śmiga
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.