[PHP/mySQL] Ingewikkelde (?) counter

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • eXtReMeBiE
  • Registratie: Februari 2002
  • Laatst online: 07-09 13:29
Het idee:
Een counter maken. Eentje die én het aantal totale hits bijhoudt, én tegelijkertijd het aantal unieke bezoekers bijhoudt. Gebaseerd op mySQL.

Wat heb ik tot nu toe?
Het 'totale hits bijhouden' gebeuren werkt. Dit is ook niet moeilijk dus...
Ok, dus ik denk, op naar unieke visitors.
Ik heb in mijn achterhoofd onthouden dat ik liever niet teveel rijen in mijn tabelletje krijg, dat vind ik vervelend. Bovendien wou ik zowel de unieke visitors als het totale hits in één tabel, het zou onzin zijn om dan ook iedere hit in een rij te zetten...
Dus, de mySQL tabel:
code:
1
CREATE TABLE counter ( hits int(100) NOT NULL, visitors longtext NOT NULL)
Simpel, en klein, zoals ik het wil dus. ;)
Dit is hoe ik de data uit de tabel lees:
PHP:
1
2
3
$select= "SELECT * FROM counter";
$result = mysql_query($select);
$row = mysql_fetch_array($result);
Dit werkt ook allemaal, geen probleem.
Dan het aantal unieke bezoekers:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$visitors = $row['visitors'];

list($ip1, $ip2) = split('[-]', $visitors);
echo "$ip1, $ip2";

$ip = $REMOTE_ADDR;
$ip .= "-";
$add = $visitors;
$add .= $ip;

$query = "UPDATE counter SET visitors='$add'";
mysql_query($query) or die(mysql_error());
Wat hier dus gebeurt:
Hij haalt de gegevens op uit de rij 'visitors'. De gegevens in de rij 'visitors' bestaan uit IP-adressen, gescheiden door een -. Met behulp van de split() functie verwijder ik de streepjes ertussen, en met behulp van list() stop ik ze in aparte variabelen.

Nog enige toelichting:
Bij de eerste update-query plakt hij dus het IP-adres van de bezoeker, met een '-' eraan vastgeplakt, in de database, vast aan de al ingevoerde IP-adressen.

En verder?
Nu kom ik bij een probleem terecht. Op deze manier, moet ik iedere keer als er weer een unieke bezoeker op mijn site komt, bij list() weer een extra variabele typen, en het uploaden. Niet leuk, niet handig dus! :(
Een tweede probleem waar ik op stuitte, was dat ik niet wist/weet hoe ik de IP-adressen moet gaan tellen. :(

Nu vroeg ik mij af, is er niet een manier, om éérst het aantal unieke bezoekers te tellen (ná het verwijderen van '-' óf ervóór), en dan met 'iets' ervoor te zorgen dat hij bij list() begint met $ip1, en eindigt bij $ip*, met telkens stappen van 1 ertussen, waarbij * dan het aantal IP-adressen inhoudt (net zoiets als bij rand(), dat je een begin en een eindgetal moet kiezen).

Zou ik misschien het aantal '-' moeten gaan tellen? Hoe dan? Voor zover ik weet kan dit niet met de count() functie... :?

Nogmaals kort wat ik wil: ik wil het aantal IP-adressen tellen, en weten hoe ik dat list() makkelijker kan gebruiken :)
Is wat ik wil überhaupt wel mogelijk, of kan ik tóch beter ieder IP-adres in een andere rij stoppen?

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 22:59

chem

Reist de wereld rond

maak een aparte table ip, hits
en doe een replace into table set ip=$ip, hits=hits+1;
Daar bespaar je je heel veel gezeik en performance mee.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • eXtReMeBiE
  • Registratie: Februari 2002
  • Laatst online: 07-09 13:29
Ok, dus het kan niet op de manier waarop ik het wou?
edit:
Of kan het wel, maar is het gewoon langzamer/meer database-belastend/whatever? Als het wel mogelijk is, maar moeilijk, en je weet wel hóe het kan, plz tell me ;) Ik houd wel van een uitdaging... :)

[ Voor 68% gewijzigd door eXtReMeBiE op 22-12-2002 19:42 ]


Acties:
  • 0 Henk 'm!

  • Paradise
  • Registratie: Juni 2000
  • Niet online
Zal misschien wel kunnen maar is wel érg omslachtig..

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 22:59

chem

Reist de wereld rond

Wat is je probleem precies?
Het is een wat lang verhaal :P
Wat je denk ik wilt is spelen met de array functies, oa explode (niet split), implode, array_unique, array_map etc.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

eXtReMeBiE schreef op 22 December 2002 @ 19:31:
Het idee:
Een counter maken. Eentje die én het aantal totale hits bijhoudt, én tegelijkertijd het aantal unieke bezoekers bijhoudt. Gebaseerd op mySQL.
Database:
| id | ip | meer_zooi |
Script:
-Totaal aantal hits:
SELECT * FROM tabel
while (fetch object){
$totaal++
}
-Unieke:
SELECT DISTINCT ip FROM tabel
while (fetch object){
$totaal2++
}

Zo kan het toch ook gewoon??

edit: Nu moet je niet gaan zeuren dat je geen rijen in je database wil... :P

[ Voor 8% gewijzigd door Verwijderd op 22-12-2002 20:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je wilt niet teveel rijen want dat vind je vervelend?

Ik wil niet heel rot doen hoor, maar volgens mij moet je maar eens een boek gaan lezen over databases. Het eerste dat ik tegenkom onder het hoofdstuk normaliseren, is dat elk veld in een tabel enkelwaardig moet zijn. Dat is bij jou niet zo, dus je database model voldoet niet eens aan de eisen voor de eerste normaalvorm.

Het is duidelijk dat je hier nog geen kaas van hebt gegeten. Dat geeft niet, maar ga dan ook niet rare eisen stellen, zoals 'ik wil zo weinig mogelijk rijen'. Je bent waarschijnlijk ook niet bekend met arrays.

Begin maar helemaal overnieuw, en houd het dan simpel.
òf je maakt bij elke hit een nieuwe record, òf je zoekt het record van een bepaald ip, en telt dan 1 bij het aantal hits op.

In het eerste geval ziet je tabel er zo uit:
hits ( hitID, ip )

In het tweede geval zo:
hits ( ip, hits )

Ik denk dat ik voor het tweede zou kiezen, als het tellen van hits je enige doel is. Eerst voer je dan een UPDATE query uit, je telt dus 1 op bij hits, van elk record waarvoor geldt dat hits.ip = $REMOTE_ADDR. Mochten er geen rijen beinvloed zijn, dan is het een nieuw ip, en voer je een INSERT query uit.

Optellen van alle hits laat je door MySQL doen, daar zijn functies voor.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 22:59

chem

Reist de wereld rond

slindenau, dat is wel HEEL ranzig
je zal dat nog altijd met count(*) willen doen, en nooit een loop binnen php. nooit, nooit NOOIT.

[ Voor 5% gewijzigd door chem op 22-12-2002 20:21 ]

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • eXtReMeBiE
  • Registratie: Februari 2002
  • Laatst online: 07-09 13:29
Ik wil niet heel rot doen hoor, maar volgens mij moet je maar eens een boek gaan lezen over databases.
Goed idee. Ik zal even rondkijken...
Het eerste dat ik tegenkom onder het hoofdstuk normaliseren, is dat elk veld in een tabel enkelwaardig moet zijn. Dat is bij jou niet zo, dus je database model voldoet niet eens aan de eisen voor de eerste normaalvorm.
Ok, wist ik dus niet. Inderdaad dus een goed idee om er een boek bij te halen.
Het is duidelijk dat je hier nog geen kaas van hebt gegeten.
Bulls-eye :)

Eigenlijk was het doel van dit hele gebeuren wat nieuwe functies ontdekken, en kijken hoe het óók kon... Met veel rijen, tuurlijk, geen probleem, maar het is 'te makkelijk', zeg maar, te voor de hand liggend...
Eerst voer je dan een UPDATE query uit, je telt dus 1 op bij hits, van elk record waarvoor geldt dat hits.ip = $REMOTE_ADDR. Mochten er geen rijen beinvloed zijn, dan is het een nieuw ip, en voer je een INSERT query uit.
Deze had ik van te voren al uitgedacht en getypt. Voor het geval dat wat ik eigenijk wou niet mogelijk zou zijn, had ik die tenminste al bij de hand...

Dus eigenlijk wou ik wat chem al zei:
spelen met de array functies, oa explode (niet split), implode, array_unique, array_map etc.
:)

Thx anyway voor jullie reacties.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 22:59

chem

Reist de wereld rond

ipv update, if affected ==0, insert kan je ook de eerder vermelde replace gebruiken om het in 1 query te bundelen.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • WouterG
  • Registratie: December 2000
  • Laatst online: 06:44

WouterG

Dit is geen ondertitel

Verwijderd schreef op 22 December 2002 @ 20:09:
In het tweede geval zo:
hits ( ip, hits )
Ik heb gisteren mijn eerste echt werkende script geschreven en dat was dus een counter die op deze manier werkt.
Je kunt hierachter nog de tijd zetten zodat je kunt zien wanneer je laatste bezoek was. Je moet dan wel een vertraging inbouwen die ervoor zorgt dat hij alleen de tijd in de tabel verandert als het laatste bezoek een uur of wat geleden was om ervoor te zorgen dat hij die tijd niet bij elke hit verandert.
Was een leuke uitdaging voor een eerste script maar hij werkt nu. Ik heb wel het idee dat de code verre van optimaal is en er zitten ook een paar ranzige oplossingen tussen maar hij werkt nu.

Volgens mij (ben nog maar een newbie) is deze manier veeel sneller voor een database, een database is er toch om snel de rijen af te zoeken op waardes? Het heeft naar mijn idee geen nut om alles in 1 veld te gaan zetten omdat hij dan toch een ruw textblok door moet gaan schoffelen om dat ip te vinden.
Pagina: 1