morpheus -> Jo, det er underordnet hvilke af DE 4 informationer du søger på, da der ikke er vildt stor forskel på lægnden af værdierne.. Dog vil det da gøre en del på det endelige resultat hvis du har mange records der skal søges igennem, hvor det er underordnet hvilken du henter..
Men hvorfor ikke bare tælle på variablerne?!? (Se løsning lidt længere nede)
ved ikke hvem du mener h4x0r2tm.. men den kunne da "cleanes" meget, hvis det stod til mig.. Misforstå mig ikke morpheus.. er slet ikke ude efter dig som person, men ønsker vi ikke alle at lære noget, og især af vores fejl? ;D
For at optimere koden kunne vi gøre følgende ting:
1) Slette den første sql-select-query.. Det er irelevandte informationer du henter. Mere om det længere nede..
2) For at starte inderst i din while, kan vi starte med at slette din if-sætning som udelukkende har til opgave at update din tabel, hvis if-statementet er opfyldt. Hvorfor vil du update din tabel, når du alligevel opdatere alle felterne. Vil det så ikke være langt det letteste bare at slette dem alle, og så sætte ind lige meget hvad.. (Altså kan din checkvariabel $noupdate også slettes)
3) Nu har whilelykken ingen egentlig funktion, ud over at køre data igennem som ikke bliver valgt, da vi jo tidligere også slettede sql-statementet. Så den slettes
4) Tilbage står vi med de to sidste "kapitler".. For at forenkle opgaven en del, bytter vi nu rundt på disse, så alle de for gamle starter med at blive slettet! Hvis vi til vores delete-statement tilføjer at den også gerne må slette hvis den finder en post hvor id'et er lig den ip den pågældende computer har, uafhængigt af datoen, er vi sikker på at vores egen ip IKKE længere optræder i databasen, og vi har derfor ingen grund til at tjekke herpå.
Så if-sætningen rundt om, kan nu slettes, så vi kun står tilbage med to sql-statments.
ét til at slette records, og ét til at indsætte en enkelt.
Det sidste statement lader vi nu være (din select der viser hvor mange data der er i tabellen. Men for at optimere den en del, spørger vi nu udelukkende sql-serveren HVOR mange tilfælde der er. Som hovedregel skal du kun spørge om sådanne ting, hvis du alligevel ikke skal bruge dataene.
I dit eget eksempel gør det nu ikke så meget. Men glæder mig til at se en responstid på dit script når det engang bliver langt ind på en side, men bare små 10.000 hits dagligt.. SÅ er det pludseligt ikke så hurtigt mere, vil jeg gerne have lov at gætte på..
Et samlet script kunne nu se således ud:
<?php
/*
DESC:
http://www.eksperten.dk/spm/408079*/
//database
/*
CREATE TABLE `counter` (
`id` int(11) NOT NULL auto_increment,
`ipaddr` varchar(255) NOT NULL default '',
`tid` int(11) NOT NULL default '0',
`side` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM;
*/
include("dbconn.php");
dbConn();
$yourip = $_SERVER['REMOTE_ADDR'];
$yoursite = $_SERVER['PHP_SELF'];
$timenow = time();
$m24 = $timenow - 86400;
mysql_query('DELETE FROM counter WHERE tid < \'' . $m24 . '\' OR ipaddr = \'' . $yourip . '\'') or die(mysql_error());
mysql_query('INSERT INTO counter (ipaddr, tid, side) VALUES (\'' . $yourip . '\', \'' . $timenow . '\', \'' . $yoursite . '\')') or die(mysql_error());
$count = mysql_query('SELECT count(*) AS numbers FROM counter') or die(mysql_error());
$res = mysql_fetch_array($count);
echo $res['numbers'];
?>
Som du kan se har jeg brugt en count i stedet for din num_rows.. Den skal du KUN bruge hvis du samtidig skal bruge alle de data du får ud.. Ellers er den funktion banlyst..!
Har ikke testet koden, da jeg ikke lige gider sidde at gemme den, og en database, på en server for at gøre det.. Men prøv den og kom med en fejlkode, hvis fejlen er en du ikke lige selv kan rette!
Håber alle fik lidt ud af rettelserne, og kunne se ideen i at rette op på koden frem for at skrive en ny :)
/Nicklas B.