Avatar billede Dennis3D Nybegynder
14. oktober 2010 - 23:59 Der er 15 kommentarer

Tælle kommentarer og vis på side.

Hey Eksperten.

Jeg er nybegynder til php. Men det er lykkes mig at programmmere mit site:

http://poly-face.com

Jeg har nogle artikler derinde, hvor man kan skrive kommentarer til, og jeg har en side der viser artiklerne. Nu er det sådan at jeg gerne vil have vist hvor mange kommentarer der er på hver artikel på den side de bliver vist.

Så den skal hente fra tabellen articles, men os fra comments hvor category="arti" og category_id="id'en fra articles databasen"

Har i nogle foreslag til hvordan det kan gøres?

Min kode ser sådan her ud:

                                $result = mysql_query("SELECT * FROM articles ORDER BY id desc limit 20")
                                or die(mysql_error()); 
                                ?>
                                    <table border="0" width="100%" height="0" cellpadding="0" cellspacing="0">
                                        <?php
                                            // keeps getting the next row until there are no more to get
                                            while($row = mysql_fetch_array( $result )) {
                                           
                                            $titel = str_replace(' ', '_', $row['titel']);
                                           
                                            $str = substr($row['description'], 0, 850);
                                            echo "<tr>";
                                            echo "<td><p><font size='4'><b>";
                                            echo $row['titel'];
                                            echo "</b></font></p></td></tr>";
                                            echo "<tr><td><p><font color='#717171'>D. ";
                                            echo $row['date'];
                                            echo "</font></p></td>";
                                            echo "</tr>";
                                            echo "<tr>";
                                            echo "<td><p>";
                                            echo $str;
                                            echo "...<a href='Article_".$titel."'>";
                                            echo "Read more";
                                            echo "</a><br><br></p></td>";
                                            echo "</tr>";
                                           
                                        }
Avatar billede cronaldo Nybegynder
15. oktober 2010 - 00:37 #1
$result = mysql_query("SELECT count(c.id) as count, a.* FROM articles a INNER JOIN category c on c.category = 'arti' AND category_id = a.id ORDER BY a.id desc limit 20")
                                or die(mysql_error()); 
                                ?>
                                    <table border="0" width="100%" height="0" cellpadding="0" cellspacing="0">
                                        <?php
                                            // keeps getting the next row until there are no more to get
                                            while($row = mysql_fetch_array( $result )) {
                                           
                                            $titel = str_replace(' ', '_', $row['a.titel']);
                                           
                                            $str = substr($row['a.description'], 0, 850);
                                            echo "<tr>";
                                            echo "<td><p><font size='4'><b>";
                                            echo $row['a.titel'].' Kommentarer: '.$row['count'];
                                            echo "</b></font></p></td></tr>";
                                            echo "<tr><td><p><font color='#717171'>D. ";
                                            echo $row['a.date'];
                                            echo "</font></p></td>";
                                            echo "</tr>";
                                            echo "<tr>";
                                            echo "<td><p>";
                                            echo $str;
                                            echo "...<a href='Article_".$titel."'>";
                                            echo "Read more";
                                            echo "</a><br><br></p></td>";
                                            echo "</tr>";
                                           
                                        }


Prøv at se om det virker.. Jeg er ikke helt sikker, men prøv det :)
Avatar billede ggxdg Nybegynder
15. oktober 2010 - 09:04 #2
Jeg ville nok have gjort hvad cronaldo skriver, men her er lige et lidt nemmere alternativ hvis man ikke er helt stiv i PHP og MySQL

$com_que = "SELECT id FROM comments WHERE category_id = '".$row['id']."' AND category = 'arti'";
$num_rows = mysql_num_rows(mysql_query($com_que));

Hvis du placerer det et sted i din while-loop vil du "$num_rows" indeholde antallet af comments.
Avatar billede cronaldo Nybegynder
15. oktober 2010 - 11:11 #3
ggxdg:

Performancemæssigt er det der ikke noget, jeg vil råde til ;)
Det kan godt være, at det er mig, men jeg vil gerne have så meget som muligt i én forespørgsel for at slippe for at have dem i ens while-løkke.
Avatar billede ggxdg Nybegynder
16. oktober 2010 - 05:20 #4
Helt enig - jeg skrev også jeg ville foretrække din løsning. Jeg siger bare at hvis man ikke er helt stiv i det med joining, kan det give lidt problemer, min 'simplere' løsning var blot ment som en midlertidig løsning i tilfælde af join driller i starten :)
Avatar billede cronaldo Nybegynder
16. oktober 2010 - 12:01 #5
Jeg må bøje mig i støvet - du tænker da også på alle facetter. ;)
God weekend!
Avatar billede Dennis3D Nybegynder
23. oktober 2010 - 15:13 #6
Tak for jeres svar.

Jeg har desværre ikke været ved min computer så jeg har ikke kunne svare. Nu er jeg tilbage :)

cronaldo:

Jeg har brugt din metode, men det virker ikke helt.

Den skriver der er 4 kommentarer, men i virkeligheden er der kun 2, der er dog 4 kommentarer på alle mine artikler. Derudover så gider den ikke skrive det andet indhold fra min database ud. Pt. ser det sådan her ud:

http://poly-face.com/test/articles.php

hvor det skulle se sådan her ud (her er der ik tilføjet comments):

http://poly-face.com/articles.php


Begge steder henter fra samme database.
Avatar billede cronaldo Nybegynder
23. oktober 2010 - 21:53 #7
Det er fordi du henter alle kommentarer ud til en kategori? Måske du skulle hente med article-id'et, men prøve at vis os din database/tabel struktur, så er det lidt nemmere
Avatar billede Dennis3D Nybegynder
24. oktober 2010 - 00:00 #8
Min side er lige nede fordi de flytter serveren men den er oppe igen kl 03.

Jeg tror den henter rigtigt, fordi der er 4 comments med arti IDen men så skal den os hente Categori id for at finde ud af hvilken artikel det er. og der finder den så 4 istedet for de 2. Jeg prøver lige at sætte det op så databasen måske giver lidt mere mening:

Articles indeholder:

id, Titel, Date, Image, Resume

Comments indeholder:

category, category_id


De indeholder self. os andre ting, men det er de eneste der er relevante for den her side. Som jeg ser det, ser det ud som om den har svært ved at hente data fra articles, og så har den hedder ikke IDen på commentaren selvom den har kategorien.
Avatar billede Dennis3D Nybegynder
24. oktober 2010 - 14:09 #9
Okay jeg har siddet og arbejdet på det i dag. Jeg er kommet frem til noget der virker lidt mere. Med det mener jeg at den skriver en artikel ud, og ved den skriver den at der er 4 comments som er antallet på hvor mange comments der er på alle artiklerne. Det rigtig tal er 2.


Problemet er så nu, hvordan får jeg den til at skrive det rigtige ud? :)

Her er link:

http://www.poly-face.com/test/articles.php

Og kode:

$query = "SELECT articles.id as id,articles.date,articles.titel,articles.resume,articles.image,count(comments.id) as commentID,comments.category,comments.category_id ".
                                                    "FROM articles INNER JOIN comments ".
                                                    "ON comments.category_id = articles.id AND comments.category = 'arti'";
                                                    "ORDER BY id desc limit 20";
                                                   
                                            $result = mysql_query($query) or die(mysql_error());

// keeps getting the next row until there are no more to get
                                            while($row = mysql_fetch_array( $result )) {
                                           
                                            $titel = str_replace(' ', '_', $row['titel']);
                                           
                                            echo "<tr>";
                                            echo "<td colspan='2'><h1>";
                                            echo $row['titel'];
                                            echo "<h1></td></tr>";
                                            echo "<tr><td colspan='2'><p><font color='#717171'>D. ";
                                            echo $row['date'];
                                            echo "</font></p></td>";
                                            echo "</tr>";
                                            echo "<tr>";
                                            echo "<td width='250'>";
                                            echo "<img src='".$row['image']."' alt='".$row['titel']."'>";
                                            echo "</td>";
                                            echo "<td><p>";
                                            echo $row['resume'];
                                            echo "<br><a href='Article_".$titel."'>";
                                            echo "Read more";
                                            echo "</a> - Comments: ".$row['commentID']."<br><br></p></td>";
                                            echo "</tr>";
                                            echo "<tr>";
                                            echo "<td colspan='2'>";
                                            echo "<br><br>";
                                            echo "</td>";
                                            echo "</tr>";
Avatar billede Dennis3D Nybegynder
24. oktober 2010 - 15:58 #10
Nå jeg brugte den metode ggxdg skrev fordi den virker og det andet blev for indviklet. Hvis i har et foreslag til læsningen på det andet må i endelig skrive... og ggxdg du må gerne droppe et svar hvis du vil have points.
Avatar billede ggxdg Nybegynder
27. oktober 2010 - 20:40 #11
Det ville stadig være bedst at få cronaldos kode til at fungere, så om du vil slutte posten her, eller forsøge igen må du selv om.

Jeg smider det her som svar, men giv Cronaldo halvdelen eller mere, da han har brugt en del mere tid på det end jeg har, og fordi hans metode er mere rigtig hvis man får det til at køre...

Jeg tror umiddelbart problemet er at comments-id-counteren ikke bliver resat når articles-id'en skifter, så counteren giver resultatet af det totale antal comments af typen 'arti'.

Jeg har modificeret den en anelse, så i stedet for at joine de 2 tabeller har jeg lavet en subquery, performance-mæssigt burde det næsten være lige så godt:

$result = mysql_query("SELECT c.catcnt, a.* FROM articles a INNER JOIN (SELECT COUNT(id) catcnt, category_id FROM comments WHERE category = 'arti' GROUP BY category_id) c ON c.category_id = a.id ORDER BY a.id desc limit 20")


Sig lige til om det funker - smid evt fejl herind hvis det ikke gør :)
Avatar billede cronaldo Nybegynder
27. oktober 2010 - 21:45 #12
Det handler simpelthen om, at jeg ikke har nok kode/informationer at arbejde med. Det ville være fint hvis du kunne smide noget mere, for blot at sige det ikke virker, gør det ikke lettere at lave. :)
En ting er dog 100% sikkert - den KAN komme til at fungere ;)
Avatar billede Dennis3D Nybegynder
29. oktober 2010 - 00:08 #13
Jeg vil self. gerne gøre det ordentligt :) Og jeg er meget taknemlig over i vil hjælpe mig. Jeg er lidt newb til programmering og PHP, til gengæld er jeg consistent.

ggxdg:
Jeg vil prøve det ligeså snart jeg får tid. Formentlig her i weekenden.

Cronaldo:
ville det hjælpe hvis jeg prøvede at skrive hvor hvad skal hentes fra med en oversigt af databasen, på en simpel måde? Ellers er jeg lidt i tvivl om hvad du gerne vil vide.
Avatar billede cronaldo Nybegynder
29. oktober 2010 - 00:51 #14
Ja, det ville nok være fint :) Jeg forstår nemlig ikk helt hvordan du kobler artiklerne og kommentarerne sammen ;)
Avatar billede ggxdg Nybegynder
03. november 2010 - 18:52 #15
Det kan også være at cronaldos query kan komme til at fungere, hvis man laver en lille gruppering...

$result = mysql_query("SELECT count(c.id) as count, a.* FROM articles a INNER JOIN category c on c.category = 'arti' AND category_id = a.id GROUP BY a.id ORDER BY a.id desc limit 20")

Jeg har rodet meget med subqueries på det sidste, så jeg er ikke 100% sikker på at det vil virke...

Som sagt burde min query med subquery også at fungere, og jo mere jeg læser om joins og subqueries, desto mere tror jeg at join og subquery i dette tilfælde vil være præcist lige hurtigt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester