[php/mysql] Optimalisatie code activiteitenkalender

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MadFly
  • Registratie: Juli 1999
  • Laatst online: 10-04-2023
Ik heb een tijdje terug een scriptje geschreven welke op een site de eerst volgende 6 activiteiten welke volgen (of nog bezig zijn) na huidige datum weergeeft.

De activiteiten staan in een mysql-database:
* titel varchar
* startdatum date
* einddatum date
Voor de beeldvorming, een date voer je dus in als 2004-05-09.

Hier volgt mijn 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
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
$huidigedatum = date("Y-m-d");
$querykalender = "SELECT * FROM site_kalender WHERE startdatum
 >= '$huidigedatum' OR einddatum >= '$huidigedatum' ORDER BY 
startdatum ASC LIMIT 0,6";
$resultkalender = mysql_query ($querykalender,$databak_db);
$brteller = 0;
while ($kalenderitem = mysql_fetch_object($resultkalender))
{ 
$brteller++;

switch (substr($kalenderitem->startdatum, 5, 2))
{
   default: $maand1 = "Deze maand bestaat niet - 1";
   case 00: $maand1 = "Maand kan geen 0 zijn - 1"; break;
   case 1: $maand1 = "Januari"; break;
   case 2: $maand1 = "Februari"; break;
   case 3: $maand1 = "Maart"; break;
   case 4: $maand1 = "April"; break;
   case 5: $maand1 = "Mei"; break;
   case 6: $maand1 = "Juni"; break;
   case 7: $maand1 = "Juli"; break;
   case 8: $maand1 = "Augustus"; break;
   case 9: $maand1 = "September"; break;
   case 10: $maand1 = "Oktober"; break;
   case 11: $maand2 = "November"; break;
   case 12: $maand2 = "December"; break;
}
$dag1 = substr($kalenderitem->startdatum, 8, 2);
$jaar1 = substr($kalenderitem->startdatum, 0, 4);

if ($kalenderitem->einddatum != '0000-00-00')
{
$dag2 = substr($kalenderitem->einddatum, 8, 2);
$jaar2 = substr($kalenderitem->einddatum, 0, 4);
    switch (substr($kalenderitem->einddatum, 5, 2))
    {
    default: $maand1 = "Deze maand bestaat niet - 2";
    case 00: $maand2 = "Maand kan geen 0 zijn - 2"; break;
    case 1: $maand2 = "Januari"; break;
    case 2: $maand2 = "Februari"; break;
    case 3: $maand2 = "Maart"; break;
    case 4: $maand2 = "April"; break;
    case 5: $maand2 = "Mei"; break;
    case 6: $maand2 = "Juni"; break;
    case 7: $maand2 = "Juli"; break;
    case 8: $maand2 = "Augustus"; break;
    case 9: $maand2 = "September"; break;
    case 10: $maand2 = "Oktober"; break;
    case 11: $maand2 = "November"; break;
    case 12: $maand2 = "December"; break;
    }
    
    if(substr($kalenderitem->einddatum, 8, 2)-1 == 
substr($kalenderitem->startdatum, 8, 2) && $maand1==$maand2)
    { $tussenvoegsel = "en"; }
    else
    { $tussenvoegsel = "t/m"; }
}
else
{ $dag2=""; $jaar2=""; $maand2=""; $tussenvoegsel=""; }
if ($brteller == 1) { }
else{ print("<BR>"); }
print("<strong>$dag1 $maand1 $jaar1 $tussenvoegsel $dag2 $maand2
 $jaar2</strong><BR>$kalenderitem->titel<BR>"); }


Je ziet waarschijnlijk wel, een beginnende programmeur. De boel werkt uiteraard, echter wil ik de boel nu optimaliseren (zodat het sneller wordt). Heb geen idee waar ik moet & hoe ik moet beginnen.

Suggesties?

[ Voor 36% gewijzigd door MadFly op 09-05-2004 13:21 ]


Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

PHP:
1
2
if ($brteller == 1) { } 
else{ print("<BR>"); }

Dit vind ik wel slecht eig (neem je niks kwalijk).
Je kunt het beter zo doen:
PHP:
1
2
3
if ($brteller != 1) {
  print("<BR>"); 
}
!= is trouwens "niet gelijk aan".

Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 19-09 13:37
Ook ik ben nog niet zo lang bezig met php, maar ik zou denken dat je de maanden in een array kunt stoppen en die aan te roepen ipv het met een switch+case te doen...

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PHP:
1
2
3
4
5
6
7
8
9
$maanden  = array('januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli','augustus','september','oktober','november','decembter');
// n.b. maanden worden in het Nederlands met een kleine letter geschreven, itt. het Engels.

list($dag1,$maand1,$jaar1) = explode('-',$kalenderitem->begindatum);
$maand1 = $maanden[$maand1];

list($dag2,$maand2,$jaar2) = explode('-',$kalenderitem->einddatum);
$maand2 = $maanden[$maand2];

ipv.
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
switch (substr($kalenderitem->startdatum, 5, 2))
{
   default: $maand1 = "Deze maand bestaat niet - 1";
   case 00: $maand1 = "Maand kan geen 0 zijn - 1"; break;
   case 1: $maand1 = "Januari"; break;
   case 2: $maand1 = "Februari"; break;
   case 3: $maand1 = "Maart"; break;
   case 4: $maand1 = "April"; break;
   case 5: $maand1 = "Mei"; break;
   case 6: $maand1 = "Juni"; break;
   case 7: $maand1 = "Juli"; break;
   case 8: $maand1 = "Augustus"; break;
   case 9: $maand1 = "September"; break;
   case 10: $maand1 = "Oktober"; break;
   case 11: $maand2 = "November"; break;
   case 12: $maand2 = "December"; break;
}
$dag1 = substr($kalenderitem->startdatum, 8, 2);
$jaar1 = substr($kalenderitem->startdatum, 0, 4);

if ($kalenderitem->einddatum != '0000-00-00')
{
$dag2 = substr($kalenderitem->einddatum, 8, 2);
$jaar2 = substr($kalenderitem->einddatum, 0, 4);
    switch (substr($kalenderitem->einddatum, 5, 2))
    {
    default: $maand1 = "Deze maand bestaat niet - 2";
    case 00: $maand2 = "Maand kan geen 0 zijn - 2"; break;
    case 1: $maand2 = "Januari"; break;
    case 2: $maand2 = "Februari"; break;
    case 3: $maand2 = "Maart"; break;
    case 4: $maand2 = "April"; break;
    case 5: $maand2 = "Mei"; break;
    case 6: $maand2 = "Juni"; break;
    case 7: $maand2 = "Juli"; break;
    case 8: $maand2 = "Augustus"; break;
    case 9: $maand2 = "September"; break;
    case 10: $maand2 = "Oktober"; break;
    case 11: $maand2 = "November"; break;
    case 12: $maand2 = "December"; break;
    }

edit:

ZanderZ, 2 great minds alike

[ Voor 103% gewijzigd door Skaah op 09-05-2004 13:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Classes zijn ook ook niet bijster snel heb ik mij wel eens laten vertellen. PHP is een scripttaal, en die moet je dus eigenlijk, voor optimale snelheid en functionaliteit, ook zo behandelen. Dus niet OO. Maar in hoeverre dit waar is weet ik niet zo goed. Ik houd gewoon niet zo van classes. ;)

Gebruik daarom niet fetch_object maar fetch_array
switchcase constructies zijn ook niet zo snel dacht ik.

Acties:
  • 0 Henk 'm!

Verwijderd

In plaats van de maanden in een array te stoppen kun je ook dit doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# php vertellen dat we hier in NL zijn
# en dat php dus Nederlands moet praten ;D
# LETOP: 'nl_NL' (non-windows) en 'nld_nld' (windows)
setlocale(LC_ALL, 'nld_nld');

# Timestamps uitrekenen (dit is het aantal seconden va 1jan 1970)
$timespamp_vandaag = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
//$timespamp_vandaag = date("U"); #timestamp realtime
$timestamp_vorige_maand = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));

# Hier volgt een functie de iets met tijd terug geeft.
$maand_vorige = strftime("%B", $timestamp_vorige_maand);
$maand_nu = strftime("%B", $timespamp_vandaag);

echo $maand_vorige."\n".$maand_nu;

als alles goed gaat krijg je nu:
code:
1
2
april
mei


Denk dat het wel iets sneller is en het is minder werk :) . Zou zeggen zoek de functies hier op: http://nl.php.net/quickref.php en je komt er zelf denk ik wel uit dan.

edit: de php code is foutloos ;)

De timestamps horen eigelijk uit de database te komen he . Zo kun je nog eens dat datum format veranderen.

[ Voor 114% gewijzigd door Verwijderd op 09-05-2004 17:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

MadFly schreef op 09 mei 2004 @ 13:18:
PHP:
1
2
3
$querykalender = "SELECT * FROM site_kalender WHERE startdatum
 >= '$huidigedatum' OR einddatum >= '$huidigedatum' ORDER BY 
startdatum ASC LIMIT 0,6";
Een OR kan nogal eens traag zijn in MySQL (met een goed gevulde table).
Is het niet zo dat als startdatum >= $huidigedatum dat dan automatisch ook einddatum >= $huidigedatum is?
Dan kan de query geoptimaliseerd worden door de WHERE clause in te korten tot
WHERE einddatum >='$huidigedatum'

Verder wil het ook wel helpen om een index te maken die bestaat uit de kolommen startdatum en einddatum. Deze zal dan door MySQL gebruikt worden om te filteren op einddatum en om te sorteren. Ook dat is weer wat sneller.

Meestal zijn query's de vertragende factor in het geheel (tenzij je images bewerkt, of met giga-array's gaat lopen goochelen).
Pagina: 1