[PHP] Laatste reactie uit een forum categorie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • smiegles
  • Registratie: Maart 2012
  • Laatst online: 07-01-2024

smiegles

Breaking Bad

Topicstarter
Beste leden ,

Ik zit met het volgende :
Ik ben bezig met het programmeren van een forum en heb een functie gemaakt om data te krijgen van de laatste reactie van een topic uit een bepaalde categorie ,

Ik heb hiervoor de volgende functie gemaakt :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
    public static function lastReaction($cat)
    {
    $query['last'] = self::$main->db()->RunQuery("SELECT forum_reacties.id FROM forum_reacties, forum_topics WHERE forum_topics.cat = '".self::$main->db()->escapeHole($cat)."' AND forum_reacties.topic_id = forum_topics.id ORDER BY forum_reacties.time DESC");
    
        if($query['last']->num_rows > 0) 
        {
            $object['last'] = mysqli_fetch_object($query['last']);
                        
            $query['data'] = self::$main->db()->RunQuery("SELECT * FROM forum_reacties WHERE id='".$object['last']->id."'");
            $object['data'] = mysqli_fetch_object($query['data']);
        
            $query['title'] = self::$main->db()->RunQuery("SELECT * FROM forum_topics WHERE id='".$object['data']->topic_id."'");
            $object['title'] = mysqli_fetch_object($query['title']);
        
            $date = new DateTime($object['data']->time);
            
            return '<a href="topic.yel?id='.$object['data']->topic_id.'">in "'.self::text_chop($object['title']->title,20).'" <br />door '.self::$core->user->data($object['data']->afzender_id,'username').'<br /> op '.date_format($date, 'm-d H:i:s').'</a>';
        } else {
            return '<div style="margin-top:14px;">Geen reacties</div>';
        }
    }
?>


Nu ben ik bang dat na verloop van tijd deze Querys heel traag worden en er dus heel lang over gaat doen alle reacties in te laden.

Heeft iemand een Idee om dit sneller uit te laten voeren (Liefst zonder een extra tabel aan te maken in de topic tabel om daar de laatste tijd uit te halen en zo de laatste reactie te weergeven.)

Categorieën tabel
idtitel

Topic tabel
idtitelberichtCategorie

Reactie tabel
idreactietopic_idtijd


Groet ,

Olivier

Acties:
  • 0 Henk 'm!

Anoniem: 26306

Voeg een kolom toe aan de categorieëntabel, updaten hoeft niet zo vaak maar maakt de boel veel sneller. Dat is simpelweg een stukje optimalisatie om je queries een stuk lichter en eenvoudiger van te maken.

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Verdiep je eens in joins. Maar waar ligt nu de bottleneck?

Acties:
  • 0 Henk 'm!

  • smiegles
  • Registratie: Maart 2012
  • Laatst online: 07-01-2024

smiegles

Breaking Bad

Topicstarter
Het probleem is dat dit na een tijdje heel traag is. ik ga waarschijnlijk het Id van de laatste reactie opslaan in de categorieën tabel en het daar uithalen.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Even afgezien van dat een denormalized waarde handiger is.
Waarom heb je 3 query's? Ik bedoel in je 1e query raak je alle tabellen die je ook in je 2e en 3e raakt, dus waarom zou je dan niet in je 1e query gelijk de info ophalen?
En 2e tip : Vergeet *-functionaliteit dat is leuk voor prototyping, maar in dit voorbeeld gebruik je maar 3 velden, benoem die 3 velden in je query en je weet exact waar je het over hebt en het is nog eens (miniem) sneller ook.

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
en als je dan toch aan het verdiepen bent... Verdiep je dan ook gelijk ff fatsoenlijke classes.. Want
code:
1
    public static function las...
en dan
code:
1
 $query['data'] = self::$main->db()...
ziet er een beetje uit als een onbedoelde hoeveelheid static calls en meer als ik gebruik een class als namespace constructie.. (beetje teveel naar laravel gekeken maar dan zonder de onderwater reflection naar normale classes?)

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 15-07 11:47

BLACKfm

o_O

Bij een oud stukje forum software (direct topics volgens mij) heb ik ooit zoiets gefixt.

Maar het lijkt me niet moeilijk te maken toch?

Ik gebruik al jaren de zelfde code om gegevens uit mijn database te trekken in mijn eigen projectjes. Of het save of snel is zal een 2e zijn, maar in ieder geval geen ingewikkelde code.

PHP:
1
2
3
4
5
6
7
8
9
$rows = 10; // Geeft 10 outputs meer

    $result = mysql_query("SELECT * FROM forum ORDER BY laatstereactie DESC LIMIT ".$rows) or die ("Kan geen verbinding maken want : ".mysql_error()); 

    if (mysql_num_rows($result)) { 
        while ($qry = mysql_fetch_array($result)) { 
            echo '<a href="linknaartopic.php">'.($qry['topictitel']).'</a><br />';
        }   
    }


En dat kan je dan natuurlij zo uitgebreid maken als je wilt.

Maar ik ben bang dat ik een hoop gevloek krijg bij het gebruik van deze code :P

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
BLACKfm schreef op dinsdag 26 februari 2013 @ 09:23:
Bij een oud stukje forum software (direct topics volgens mij) heb ik ooit zoiets gefixt.


Maar ik ben bang dat ik een hoop gevloek krijg bij het gebruik van deze code :P
och... die mysql extentie gaat alleen binnen kort uit PHP.. maar voor de rest...

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 15-07 11:47

BLACKfm

o_O

kwaakvaak_v2 schreef op dinsdag 26 februari 2013 @ 09:30:
[...]


och... die mysql extentie gaat alleen binnen kort uit PHP.. maar voor de rest...
Ik zeg, niks meer aan doen :+.

Litebit.eu voorraad check :).


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Als je op regel 4 wat meer kolommen selecteert, zijn regel 10 en 13 niet nodig. Om dit snel te maken, moet je op regel 4 nog een LIMIT 1 toevoegen en één multi-column index maken op (topic_id,tijd).

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik zou het, zoals Cheatah zegt, denormaliseren... simpelweg het id van de laatste reactie in je categorietabel opslaan scheelt je n hoop gedoe en maakt je query een stuk simpeler en sneller.

Acties:
  • 0 Henk 'm!

  • smiegles
  • Registratie: Maart 2012
  • Laatst online: 07-01-2024

smiegles

Breaking Bad

Topicstarter
kwaakvaak_v2 schreef op dinsdag 26 februari 2013 @ 09:15:
en als je dan toch aan het verdiepen bent... Verdiep je dan ook gelijk ff fatsoenlijke classes.. Want
code:
1
    public static function las...
en dan
code:
1
 $query['data'] = self::$main->db()...
ziet er een beetje uit als een onbedoelde hoeveelheid static calls en meer als ik gebruik een class als namespace constructie.. (beetje teveel naar laravel gekeken maar dan zonder de onderwater reflection naar normale classes?)
Ik maak gebruik van extends en alles zit vast aan de main class daarna is het niet meer zo en word het dus niet meer static..
en als ik er een namespace constructie van maak gebruik ik liever de daarvoor bestaande namespace functie

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:22

MueR

Admin Tweakers Discord

is niet lief

kwaakvaak_v2 schreef op dinsdag 26 februari 2013 @ 09:30:
[...]


och... die mysql extentie gaat alleen binnen kort uit PHP.. maar voor de rest...
Met hele oude software wil je toch niet upgraden naar PHP 5.5, dus zo veel maakt het nou ook weer niet uit.

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

Pagina: 1