[PHP + Smarty] Resultaten worden te vaak weergegeven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
Hallo allemaal,

Ik ben redelijk nieuw in de wereld van programmeren, ben momenteel 4 maanden bezig en heb besloten om eens wat te leren van een template systeem. Hiervoor maak ik gebruik van Smarty.

Ik ben gisteren begonnen met het omzetten van mijn test project naar templates. Dit lukt allemaal redelijk, echter op het moment dat er meerdere resultaten nodig zijn, (comments bijvoorbeeld) dan gaat er iets fout.

PHP gedeelte
Ik maak gebruik van de volgende query + fetch methode
PHP:
1
2
3
4
5
6
7
8
9
$comments = mysql_query ("
                            SELECT *
                            FROM news_comment
                            INNER JOIN user ON news_comment.id = user.id
                            WHERE news_comment.newsid = '".$newsid."'
                            ORDER BY commentid DESC
                        ")
                        or die("MySQL Error: ".mysql_error());
$comments2 = mysql_fetch_array($comments);


Dit geeft 3 resultaten weer.

Daarna ga ik aangeven dat deze gegevens naar mijn template toe gezonden moeten worden en laat ik de template
PHP:
1
2
$smarty->assign('comments2',$comments2);
$smarty->display("show_news_full.tpl");


Smarty gedeelte
De template ziet er als volgt uit, ik heb het momenteel beperkt tot het tonen van 1 kolom uit de database.

code:
1
2
3
4
5
{foreach from=$comments2 item=username}
                                <tr class="comments_header">
                                    <td>Posted by: <b>{$comments2.username}</td>
                                </tr>
                            {/foreach}


En dit geeft als resultaat
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick
Posted by: nick


Zoals jullie zijn is dat veel te vaak, ik heb al meerdere website's, tutorials, handleidingen bezocht, maar ik kom er niet uit. Ik ga er vanuit dat het een domme fout o.i.d. is, maar zoals gezegd, ik ben pas 4 maanden bezig en druk met leren.

Alvast bedankt voor jullie hulp.

Nick

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

mysql_fetch_array() geeft MYSQL_ASSOC én MYSQL_NUM terug. Je kunt als 2e argument opgeven welke van de 2 je terug wilt, of in plaats van mysql_fetch_array() mysql_fetch_assoc() gebruiken.

Daarnaast gebruik je in je foreach niet het item. Kijk even in de manual van smarty hoe je het item binnen je foreach loop gebruikt.

:)

Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
bedankt ! gelijk weer wat geleerd van het fetch commando ^^ bedankt !

Ik heb inmiddels de oplossing,

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$comments = mysql_query ("
                            SELECT *
                            FROM news_comment
                            INNER JOIN user ON news_comment.id = user.id
                            WHERE news_comment.newsid = '".$newsid."'
                            ORDER BY commentid DESC
                        ")
                        or die("MySQL Error: ".mysql_error());
$i=0; 
while ($comments2=mysql_fetch_array($comments)) {
            $tmp = array(
                'username' => $comments2['username'],
                'time'=> $comments2['time'],
                'date'=> $comments2['date'],
                'id'=> $comments2['id'],
                'comment'=> $comments2['comment']
            );
            $results[$i++] = $tmp;
}


en het doorgeven naar de template
PHP:
1
2
    // De comments doorgeven
    $smarty->assign('results',$results);


en het aanroepen in de template
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    {section name=nr loop=$results} 
                                    <tr class="comments_header">
                                        <td class="author">Posted by:<a href="{$self}?section=showprofile&userid={$results[nr].id}"><b>{$results[nr].username}</a></td>
                                    </tr>
                                    <tr>
                                        <td class="comments_date">{$results[nr].date} at {$results[nr].time}</td>
                                    </tr>
                                    <tr class="comments">
                                        <td>{$results[nr].comment}</td>
                                    </tr>
                                    <tr class="comments_spacer">
                                        <td>&nbsp;</td>
                                    </tr>                       
                                {/section}


Zijn er hier nog op en of aanmerkingen aan? Het werkt nu in ieder geval na behoren.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Zijn er hier nog op en of aanmerkingen aan?
Waarom heb je tijd en datum elk in een aparte kolom?
Waarom sla je de datum en de tijd als tekst op?
Waarom gebruik je id om op te sorteren?
Waarom gebruik je * in je select terwijl je exact weet welke kolommen je nodig hebt?
Waarom ken je de array toe aan een $tmp, om vervolgens die $tmp toe te kennen aan de results array?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Doe eens gewoon een var_dump van die $comments2, kijk eens wat er in staat.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
@Muer, er staat: bool(false)

@Janoz,

Dat van de datum en tijd heb ik fout gedaan in het begin van mijn ontwerp, inmiddels weet ik dat je gebruik kan maken van een date veld in mysql, toch?

Het ID is autonummering, dus op het moment dat er een nieuwe comment geplaatst is, is het laatste ID de nieuwste, ik zou eventueel ook kunnen ordenen op datum o.i.d. maar zoals het nu is, is opzich toch niets mis mee?

De query is inmiddels aangepast met de precieze velden die ik hebben wil, dit zijn ook alle velden die erin stonden, vandaar de *, maar ik zal mezelf aanleren altijd de velden in te voeren die ik daadwerkelijk nodig heb. beter voor de perfomance

Dat van de array dat weet ik niet, ik heb dat gedeelte zo gevonden op het internet, het werkt zoals het is, weet jij misschien een betere/ nettere oplossing?

Bedankt voor de reactie's :)

Nick

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

ID is misschien autonummering en je kunt er wel vanuit gaan dat dat ding altijd oplopend is, maar wat wil je nu daadwerkelijk sorteren? Je wilt de reacties op volgorde van datum. Sorteer dan ook op datum. Ten eerste geeft je query dan ook weer wat je exact wilt hebben, en daarnaast ben je dan niet meer afhankelijk van de eis dat een ID altijd oplopend moet zijn.

Dat * beter voor performance is weet ik niet. Het belangrijkste is vooral dat je code duidelijker en onderhoudbaarder wordt. Dat je toevallig alle velden opvraagt is helemaal niet relevant.

(goed, dat is nu niet mogelijk omdat je de verkeerde typen gebruikt hetb, en omdat je het over twee kolommen hebt)


In plaats van
PHP:
1
2
3
4
5
6
7
8
            $tmp = array(
                'username' => $comments2['username'],
                'time'=> $comments2['time'],
                'date'=> $comments2['date'],
                'id'=> $comments2['id'],
                'comment'=> $comments2['comment']
            );
            $results[$i++] = $tmp;

kun je natuurlijk ook gewoon
PHP:
1
2
3
4
5
6
7
            $results[$i++] = array(
                'username' => $comments2['username'],
                'time'=> $comments2['time'],
                'date'=> $comments2['date'],
                'id'=> $comments2['id'],
                'comment'=> $comments2['comment']
            );

doen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • nickb90
  • Registratie: Mei 2007
  • Laatst online: 13-09 23:30
Oke bedankt voor je antwoord, ik zal het onthouden, bedankt voor jullie tips :) vele male beter dan op andere fora's waar je gelijk de grond in getrapt word.

Bedankt voor jullie antwoorden ! en voor de leer momenten !

Bedankt
Pagina: 1