[PHP] Structuur probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Vold
  • Registratie: September 2001
  • Laatst online: 22-01 23:04
Ik heb een soort online RSS reader gemaakt, en was voor mij al een hele uitdaging, en het is ook allemaal wel goed gelukt, alleen nu ik meer functionaliteit e.d. wil toevoegen begin ik tegen een structuur probleem aan te lopen.

Huidige situatie:
met een profiel_id worden 3 arrays uit de de database gehaald;
b.v:
KolomA: 2,5,7,10,78 (Elke feed heeft zijn eigen id, waarmee de laatste 10 headlines worden opgehaald)
KolomB: 3,1,282,72,107
KolomC: 6,4,8,11,12

Eén van de problemen is dat de site erg langzaam laadt door mijn overmaat aan querie gebruik, bij het laden van een pagina komen zo 32 queries aan te pas. En als je dan ook nog eens alleen de headlines voor "vandaag" of "morgen" wilt bekijken is het helemaal een ramp.
Ook zou ik graag willen dat je makkelijk een "feedvenster" 1 naar boven, of 1 naar beneden kan verplaatsen, maar ik heb geen flauw idee hoe ik dit het beste kan aanpassen.

Hoe kan ik dit het beste oplossen ? Ohja een voorbeeld van hoe het nu in zn werk gaat: Klik hier

[ Voor 7% gewijzigd door Vold op 05-03-2005 13:31 ]


Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
Hoe ziet je datamodel er uit? Want als er in je database kolommen voorkomen met arrays denk ik dat je eerst even je datamodel moet gaan normaliseren... En 32 queries voor die pagina zijn er waarschijnlijk erg veel, wat doen al die queries? Of zijn het een heleboel dezelfde queries? Die overzichten van die headlines in categoriën moeten, als je datamodel goed is, met één enkele query op te halen zijn.

Acties:
  • 0 Henk 'm!

  • Vold
  • Registratie: September 2001
  • Laatst online: 22-01 23:04
Ja ik weet dat de code erg brak is, komt vooral omdat ik de basis steeds iets heb uitgebreid, en nu zit ik met de problemen :/ . Ben ook bang dat mijn database niet echt effecient is ingedeeld, maar die ga ik proberen te veranderen zodra ik deze structuur uitgedacht heb, want anders verander ik straks dingen die niet nodig zijn oid.

Hier is de code die de kolomen opbouwt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
function createrow($arrayX, $tijd = 'geen', $prof_id = '1', $style_id = '1') {
    // Tijd sql in elkaar knutselen
if($tijd == 'geen') {
$SQL1 = "SELECT titel,link FROM ";
$SQL2 = " WHERE feed_id='";
$SQL3 = "' ORDER BY datum DESC LIMIT 0,10";
} elseif($tijd == 'vandaag') {
$SQL1 = "SELECT titel,link FROM ";
$SQL2 = " WHERE feed_id='";
$SQL3 = "' AND datum BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 1 DAY) ORDER BY datum DESC LIMIT 0,10";
} elseif($tijd == 'gister') {
$SQL1 = "SELECT titel,link FROM ";
$SQL2 = " WHERE feed_id='";
$SQL3 = "' AND datum BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND CURDATE() ORDER BY datum DESC LIMIT 0,10";
} elseif($tijd == 'eergister') {
$SQL1 = "SELECT titel,link FROM ";
$SQL2 = " WHERE feed_id='";
$SQL3 = "' AND datum BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND DATE_SUB(CURDATE(), INTERVAL 1 DAY) ORDER BY datum DESC LIMIT 0,10";
} else {
$SQL1 = "SELECT titel,link FROM ";
$SQL2 = " WHERE feed_id='";
$SQL3 = "' ORDER BY datum DESC LIMIT 0,10";
}
$query = mysql_query("SELECT vak_kop,vak_back FROM style WHERE style_id='$style_id' ");
$style = mysql_fetch_assoc($query); 

$array = count($arrayX);
for($i = 0; $i < $array; $i++) {
if($arrayX[$i] != '') {
$SQL = '';
$query = mysql_query("SELECT naam,catagorie,ondersteuning FROM feeds WHERE feed_id='$arrayX[$i]' ");
$titel_sql = mysql_fetch_assoc($query); 
if($titel_sql['ondersteuning'] == '2' && $prof_id == '1') {  $titel_sql['naam'] = 'Samengesteld'; }
$titel = '<a href="http://' . $titel_sql['catagorie'] . '.metspek.nl" class="cato">' . $titel_sql['catagorie'] . '</a><font color="#FFFFFF" size="1" face="Arial, Helvetica, sans-serif"> (' . $titel_sql['naam'] . ')</font>';
echo '<table width="100%" border="0">';
echo '<tr>';
echo '<td bgcolor="' . $style['vak_kop'] . '">' . $titel . '</td>';
echo '</tr>';
echo '<tr>';
echo '<td bgcolor="'. $style['vak_back'] . '">';
            if($titel_sql['ondersteuning'] == '2') 
            { 
            $database = 'templinks'; 
                if($prof_id == '1') {
                            $cat = $titel_sql['catagorie'];
                            $SQL = "SELECT titel,link FROM templinks WHERE catagorie = '$cat' ORDER BY datum DESC LIMIT 0,10";
                            }
            }
            if($titel_sql['ondersteuning'] == '1')  { $database = 'links'; }
            if(!$SQL) {
    $SQL = $SQL1 . $database . $SQL2 . $arrayX[$i] . $SQL3;
    }
    $query = mysql_query($SQL);
        while($show = mysql_fetch_array($query)) { 
            $titel = short($show['titel'],42);
    echo '<a href="' . $show['link'] . '" target="_blank" title="' . $show['titel'] . '" class="links">' . $titel . '</a><br />';
    echo "\n";
} // einde 10 links whilelus
echo '</td>';
echo '</tr>';
echo '</table>';
} //einde arrayX wel waarde
} //einde afwerken kolomX forlus
} //einde functie   

Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
Zonder ook maar in te gaan op code / datamodel, maar wat dacht je van cachen.
Dus een keer in het uur trek je de headlines uit je database en schrijft deze weg naar een bestandje.

Psuedo code
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(filemtime($rssFile) < (time() - 3600))
{
    /**
     * Gecashed bestandje laden
     */   
     include($rssFile);
}
else
{
    /**
     * Inhoud ophalen uit db
     */ 

    [...]

    /**
    * Inhoud wegschrijven naar bestand en vervolgens includen
    */
    fopen($rssFile, 'w');
    fwrite($rssContents);
    fclose($rssFile);
    include($rssFile);
}

Acties:
  • 0 Henk 'm!

  • Stamgastje
  • Registratie: April 2003
  • Laatst online: 02-02-2020
Hè bah, los van de code zelf en de gebruikte queries: laat e.e.a. eens inspringen en gebruik functions, dit is echt niet te lezen. Je gebruikt nu commentaar om aan te geven waar een for-lus of een if-block eindigt, als je goed inspringt en korte code gebruikt wordt het al een stuk beter leesbaar en heb je dat soort commentaar niet eens nodig.. Grote blokken code in een loop kun je in een aparte functie zetten, dan houd je nog een enkele regel over in je loop.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Als je je code nou gewoon normaal stuctureerd, dan hou je tenminste een beetje overzicht. Ik heb het al een beetje gedaan omdat ik het probleem echt niet kon vinden:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?

function createrow($array, $tijd = 'geen', $prof_id = 1, $style_id = 1)
{
    switch ( $tijd )
    {
        case 'geen':
            $condition = "' ORDER BY datum DESC LIMIT 0,10";
            break;
        
        case 'vandaag':
            $condition = "' AND datum BETWEEN CURDATE() AND DATE_ADD(CURDATE(),INTERVAL 1 DAY) ORDER BY datum DESC LIMIT 0,10";
            break;
        
        case 'gister':
            $condition = "' AND datum BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND CURDATE() ORDER BY datum DESC LIMIT 0,10";
            break;
        
        case 'eergister':
            $condition = "' AND datum BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND DATE_SUB(CURDATE(), INTERVAL 1 DAY) ORDER BY datum DESC LIMIT 0,10";
            break;
        
        default:
            $condition = "' ORDER BY datum DESC LIMIT 0,10";
    }
    
    $query = "SELECT vak_kop,vak_back FROM style WHERE style_id='" . $style_id . "'";
    
    $result = mysql_query($query);
    $style_rs_rs_rs = mysql_fetch_assoc($result); 
    
    for ( $i = 0; $i < count($array); $i++ )
    {
        if ( $array[$i] == '' ) continue;
        
        $query = "SELECT naam,catagorie,ondersteuning FROM feeds WHERE feed_id='" . $array[$i] . "'";
        $result = mysql_query($query);
        $titel_rs = mysql_fetch_assoc($result);
        
        if ( $titel_rs['ondersteuning'] == 2 && $prof_id == 1 )
        {
            $titel_rs['naam'] = 'Samengesteld';
        }
        
        echo '<table width="100%" border="0"><tr><td bgcolor="' .
            $style_rs['vak_kop'] .
            '">' .
            '<a href="http://' .
            $titel_rs['catagorie'] .
            '.metspek.nl" class="cato">' .
            $titel_rs['catagorie'] .
            '</a><font color="#FFFFFF" size="1" face="Arial, Helvetica, sans-serif"> (' .
            $titel_rs['naam'] .
            ')</font>' .
            '</td></tr><tr><td bgcolor="'. $style_rs['vak_back'] . '">';
        
        $query = "";
        
        if ( $titel_rs['ondersteuning'] == 2 ) 
        { 
            $table = 'templinks'; 
            
            if ( $prof_id == 1 )
            {
                $query = "SELECT titel,link FROM templinks WHERE catagorie = '" . $titel_rs['catagorie'] . "' ORDER BY datum DESC LIMIT 0,10";
            }
        }
        
        if ( $titel_rs['ondersteuning'] == 1 )
        {
            $table = 'links';
        }
        
        if ( $query == "" )
        {
            $query = "SELECT titel,link FROM " . $table . " WHERE feed_id='" . $array[$i] . $condition;
        }
        
        $result = mysql_query($query);
        
        while ( $show = mysql_fetch_array($result) )
        { 
            echo '<a href="' .
                $show['link'] .
                '" target="_blank" title="' .
                $show['titel'] .
                '" class="links">' .
                short($show['titel'],42) .
                "</a><br />\n";
        }
        
        echo '</td></tr></table>';
    }
}

?>


De tabel templinks bevalt me niet eigenlijk. Zou je een uitleg kunnen geven over wat je doet met de tabellen in de database? Anders is het lastig optimaliseren.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Vold
  • Registratie: September 2001
  • Laatst online: 22-01 23:04
@Suepahfly
Ik cache nu al de belangrijkste pagina's, maar ik vind het een beetje omslachtig om ALLES te gaan cachen .., dan verbeter ik liever eerst de structuur hiervan.

@Stamgastje
Klopt, het is wel iets minder er als het hier lijkt (copy past probleem ofzo), maar voorheen had ik geen goed programma om php code in de bewerken, en zag ik dus niet goed waar de loops eindigde. Desalniettemin mag dit soort commentaar verder achterwege blijven, want daar is dit topic niet voor bedoeld.

@Michali
Zo kan eht ook blijkbaar :D Dat ziet er echt stukken beter uit ja :X Die tempdatabase is een suf "projectje" wat door zijn schaal totaal uit de hand liep. (ik gebruikte alle feeds van marktplaatsen om een compleet overzicht te krijgen van alle laatste artikelen e.d., dit was binnen een week al voorbij de 180 000 records, en het update begon erg stroef te gaan, tot ergenis van mijn hostingprovider)

Dus dat tempdatabase gaat er uit :)

[ Voor 32% gewijzigd door Vold op 05-03-2005 14:49 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Vold schreef op zaterdag 05 maart 2005 @ 14:45:
Desalniettemin mag dit soort commentaar verder achterwege blijven, want daar is dit topic niet voor bedoeld.
Dat is dan wel zo, maar je hoeft van ons niet te verwachten dat we zulke code gaan zitten lezen. Je hebt dan geluk dat ik in een goede bui ben om het toch te doen, maar ik denk dat er niet veel zijn die daar zin in hebben. Het is zeker belangrijk om je code normaal leesbaar te houden, dan bespaar je jezelf al een hoop bugs en problemen.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Vold
  • Registratie: September 2001
  • Laatst online: 22-01 23:04
Michali schreef op zaterdag 05 maart 2005 @ 14:49:
[...]

Dat is dan wel zo, maar je hoeft van ons niet te verwachten dat we zulke code gaan zitten lezen. Je hebt dan geluk dat ik in een goede bui ben om het toch te doen, maar ik denk dat er niet veel zijn die daar zin in hebben. Het is zeker belangrijk om je code normaal leesbaar te houden, dan bespaar je jezelf al een hoop bugs en problemen.
Ja klopt, ik zeg het misschien ook een beetje bot. Maar het probleem is dat ik normaal wel heel overzichtelijk werk. Alleen nu is nog een paar factoren dit hele stukje code f*cked up, maar ik had natuurlijk voordat ik het posten even moeten schonen..

Acties:
  • 0 Henk 'm!

  • Stamgastje
  • Registratie: April 2003
  • Laatst online: 02-02-2020
Vold schreef op zaterdag 05 maart 2005 @ 14:52:
Ja klopt, ik zeg het misschien ook een beetje bot. Maar het probleem is dat ik normaal wel heel overzichtelijk werk. Alleen nu is nog een paar factoren dit hele stukje code f*cked up, maar ik had natuurlijk voordat ik het posten even moeten schonen..
Hmm, tja, dat laatste had sowieso gemogen. Maar ik denk dat je beter jezelf kunt aanleren altijd gestructureerder te werken, dan blijft je code veel overzichtelijker en kun je later veel gemakkelijker wat aanpassen. Op den duur scheelt het je echt veel tijd en frustraties. Ikzelf schrijf al mijn PHP code in NotepadEx, gewoon in plain text (dus zonder syntax highlighting en dergelijke). Zolang je je code kort (functions bij voorkeur niet langer dan een regel of 25 max.) en gestructureerd houdt werkt dat prima. Maar goed, tot zover off-topic.

[ Voor 19% gewijzigd door Stamgastje op 05-03-2005 17:00 ]

Pagina: 1