Avatar billede fld Nybegynder
27. maj 2005 - 21:31 Der er 8 kommentarer og
1 løsning

Simpel klik tæller?

Jeg ved ski ikke om dette spg. er lagt det rigtige sted med her kommer det:

Jeg har fundet dette her på eksperten. Men hvad skal jeg gøre med redirect.php, skal jeg oprette en php fil eller hvad skal jeg.? Det er til at tæller hvor mange klik jeg har på et link og det er det eneste link jeg skal tælle.


<a href="redirect.php?url=en_url.dk">

redirect.php
-----------
// gem i .txt eller database antal klik
header("location: ".$_GET['url']); // send brugeren af sted
Avatar billede nielle Nybegynder
28. maj 2005 - 07:41 #1
Først og fremmest skal du have en database (alternativt kan du skrive til en almindelig tekstfil). Nedenstående er skrevet mht. MySQL. I denne skal du have en tabel til at opbevare statistikken - jeg har kaldt tabellen for "ClickTable" i koden. Den skal have minimum 2 søjler; En til urlet (typen af denne skal være tekst) og en til at opbevare antal click (typen skal være tal). Jeg har kald disse to søjler for "Url" og "AntalClick".

Og så skal du oprette en fil du kalder redirect.php med nogenlunde følgende indhold:

===== redirect.php =====

<?php
$Url = $_GET['url'];
$Url = mysql_escape_string($Url);

$Db = mysql_connect("DinDatabaseServer", "DinUser", "DitPassword");
mysql_select_db("DinDatabase", $Db);

// Vi undersøger først om der er en post for $Url i tabellen...
$SQL = "SELECT count(*) FROM ClickTabel WHERE Url='$Url'";
$Res = mysql_query($SQL, $Db);

$Row = mysql_fetch_row($Res);
if ($Row[0] == 0)
{
    // ... det var der ikke - vi opretter en post med AntalClick=1.
    $SQL = "INSERT INTO ClickTabel (Url, AntalClick) VALUES ('$Url', 1)";
}
else
{
    // ... det var der - vi optæller AntalClick med 1.
    $SQL = "UPDATE ClickTabel SET AntalClick=AntalClick+1 WHERE Url='$Url'";
}

// INSERT eller UPDATE
$Res = mysql_query($SQL, $Db);

mysql_close($Db);

// Send brugeren vidre.
header("location: " . $_GET['url']);
?>
Avatar billede coderdk Praktikant
28. maj 2005 - 14:29 #2
Alternativt med en tekstfil:

<?php

    $fil = 'ud/klik.dat'; // Webserveren skal kunne skrive til denne

    if ( !empty( $_GET['url'] ) && strlen( $url = trim( $_GET['url'] ) ) > 0 )
    {
        if ( !file_exists( $fil ) )
        {
            if ( !touch( $fil ) )
            {
                die( 'Kunne ikke oprette ' . $fil . ' - Sørg for at der kan skrives til folderen!');
            }
        }
       
        $cnt = file_get_contents( $fil );
        $arr = array();
   
        if ( strlen( $cnt ) > 0 )
        {
            $arr = unserialize( $cnt );
        }
       
        if ( array_key_exists( $_GET['url'], $arr ) )
        {
            $arr[ $_GET['url'] ]++;
        }
        else
        {
            $arr[ $_GET['url'] ] = 1;
        }
       
        if ( $fp = fopen( $fil, 'w' ) )
        {
            if ( flock( $fp, LOCK_EX ) )
            {
                fwrite( $fp, serialize( $arr ) );
                flock( $fp, LOCK_UN );
            }
            fclose( $fp );
        }
       
        header( 'location: ' . $url );
    }
    else
    {
        header( 'location: http://' . $_SERVER['HTTP_HOST'] );
    }

?>
Avatar billede fld Nybegynder
28. maj 2005 - 20:29 #3
Hey, tak for jeres svar !

Jeg kan ikke få det til at virke nielle. Jeg får følgende fejl:

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /usr/home/dan19029/public_html/redirect.php on line 12

Warning: Cannot modify header information - headers already sent by (output started at /usr/home/dan19029/public_html/redirect.php:12) in /usr/home/dan19029/public_html/redirect.php on line 30
Avatar billede fld Nybegynder
28. maj 2005 - 20:38 #4
coderdk, jeg har fået din op at køre, men kan man ikke lave det sådan at den kun tæller en ip adresse pr. døgn?
Avatar billede nielle Nybegynder
28. maj 2005 - 22:24 #5
Lyder mystisk. Prøv at udvide med lit fejlhåndtering:

...
// Vi undersøger først om der er en post for $Url i tabellen...
$SQL = "SELECT count(*) FROM ClickTabel WHERE Url='$Url'";
$Res = mysql_query($SQL, $Db);

if (!$Res)
{
  echo 'Could not run query: ' . mysql_error();
  exit;
}

$Row = mysql_fetch_row($Res);
if ($Row[0] == 0)
{
    // ... det var der ikke - vi opretter en post med AntalClick=1.
    $SQL = "INSERT INTO ClickTabel (Url, AntalClick) VALUES ('$Url', 1)";
}
else
...
Avatar billede coderdk Praktikant
29. maj 2005 - 04:12 #6
Jooh, du kan jo sætte en cookie på klienten som udløber midnat - Hvis cookie'n findes skal den ikke tælle :)
Avatar billede fld Nybegynder
31. maj 2005 - 18:41 #7
Tak til jer begge, jeg valgte coderdk løsning da det var det nemeste. Så gider du ikke lægge et svar.?
Avatar billede coderdk Praktikant
11. juni 2005 - 19:16 #8
Yeps, sorry for den lange tid, men eksperten.dk virker ikke længere - Jeg får ingen mails længere :(
Avatar billede fld Nybegynder
13. juni 2005 - 14:48 #9
coderdk, Det samme siger jeg :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester