Avatar billede mr_bula Nybegynder
14. november 2006 - 11:34 Der er 17 kommentarer og
1 løsning

Counter: Tælle hvor mange unikke klik en side har haft

Hejsa,

Dette er et php/mySQL spørgsmål.

Jeg har en database med noget indhold, forskellige vare.
Jeg vil så gerne lave en liste over de 10 mest sete vare.

Ved jeg skal oprette en attribut i databasen der kan opbevare klikværdien, og at jeg "bare" skal kalde den op hver gang varen loades og så plusse med een, men nu vil jeg gerne have at det skal være unikke kliks.
Ved det kan gøres vha cookies, men kan ikke få det til at virke, så håber der er een som sidder inde med sådan noget kode eller kan hjælpe mig.

SØGER: kode til oprettelse af cookie samt dertilhørende db opkald
Avatar billede coderdk Praktikant
14. november 2006 - 13:27 #1
Ja, du skal bare smide en UPDATE/SET på dit tællerfelt i databasen hver gang produktet vises, du kan evt. gøre det unikt pr. session, ved:

session_start();

if ( empty( $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'] = array();
}

if ( !in_array( $_GET['produktid'], $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'][] = $_GET['produktid'];
  // DIN UPDATE AF TÆLLEREN HER
}
Avatar billede mr_bula Nybegynder
15. november 2006 - 13:26 #2
Hmmm jeg har gjort nogen forkert:

session_start();

if ( empty( $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'] = array();
}

if ( !in_array( $_GET['id'], $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'][] = $_GET['id'];
      $sql  = "select hits from produkt where produkt_id = '" . $_GET['id'] . "'";
    $hits = mysql_query($sql, $conn);
        $sql  = "update produkt set";
    $sql .= " hits=" .$hits++;
        $sql .= " where produkt_id = '" . $_GET['id'] . "'";
        $result = mysql_query($sql, $conn);   
   
      if (!$result) {
              die ("query ikke udført: " . $sql. "<br /><strong>Fejl:</strong>" . mysql_error());
        }
}

Får id'et fra url'en (vis_produkt.php?id=1), men der er noget galt med syntaksen (hits). Får dette output: update produkt set hits=Resource id #4 where produkt_id = '1'
Avatar billede coderdk Praktikant
15. november 2006 - 14:04 #3
Du hev hits ud forkert, prøv:

session_start();

if ( empty( $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'] = array();
}

if ( !in_array( $_GET['id'], $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'][] = $_GET['id'];
  $sql  = "select hits from produkt where produkt_id = '" . $_GET['id'] . "'";
  $hits = mysql_result( mysql_query($sql, $conn), 0, 0 );

  $sql  = "update produkt set";
  $sql .= " hits=" .$hits++;
  $sql .= " where produkt_id = '" . $_GET['id'] . "'";
  $result = mysql_query($sql, $conn); 
  if (!mysql_affected_rows( $result ) == 0 )
  {
    die("query ikke udført: " . $sql. "<br /><strong>Fejl:</strong>" . mysql_error());
  }
}
Avatar billede coderdk Praktikant
15. november 2006 - 14:05 #4
Måske bare:

$hits = mysql_result( mysql_query($sql, $conn), 0 );

i stedet for:

$hits = mysql_result( mysql_query($sql, $conn), 0, 0 );

som jeg skrev
Avatar billede mr_bula Nybegynder
15. november 2006 - 14:53 #5
Jeg får denne warning: mysql_affected_rows(): supplied argument is not a valid MySQL-Link resource in

Hvis jeg bruger: if (!$result) {
              die ("query ikke udført: " . $sql. "<br /><strong>Fejl:</strong>" . mysql_error());
        }
}
I stedet indlæses siden som den skal men der sker intet i hits feltet i databasen. De står stadig med default værdien 0?
Avatar billede coderdk Praktikant
15. november 2006 - 14:55 #6
Prøv lige at lave:

$result = mysql_query($sql, $conn);

om til:

$result = mysql_query($sql, $conn) or die( mysql_error() );

Jeg tror at query'en fejler
Avatar billede mr_bula Nybegynder
15. november 2006 - 15:03 #7
Får samme warning
Avatar billede coderdk Praktikant
15. november 2006 - 15:11 #8
prøv lige en echo $sql; - før mysql_query'en :)
Avatar billede mr_bula Nybegynder
15. november 2006 - 15:14 #9
update produkt set hits=0 where produkt_id = '1'
Avatar billede coderdk Praktikant
15. november 2006 - 15:48 #10
Prøv lige:

session_start();

if ( empty( $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'] = array();
}

if ( !in_array( $_GET['id'], $_SESSION['sete_produkter'] ) )
{
  $_SESSION['sete_produkter'][] = $_GET['id'];
  $sql  = "select hits from produkt where produkt_id = '" . $_GET['id'] . "'";
  $hits = mysql_result( mysql_query($sql, $conn), 0 );

  $hits++;
  $sql  = "update produkt set hits = $hits where produkt_id = '" . $_GET['id'] . "'";
  $result = mysql_query($sql, $conn);
  if ( mysql_affected_rows( $result ) == 0 )
  {
    die("query ikke udført: " . $sql. "<br /><strong>Fejl:</strong>" . mysql_error());
  }
}
Avatar billede mr_bula Nybegynder
15. november 2006 - 15:59 #11
Okay nu virker tælleren, men får den warning og en tom fejl:

Warning: mysql_affected_rows(): supplied argument is not a valid MySQL-Link resource in  on line 24
query ikke udført: update produkt set hits = 2 where produkt_id = '2'
Fejl:
Avatar billede coderdk Praktikant
15. november 2006 - 16:13 #12
Bah, my bad! Ændr:

mysql_affected_rows( $result )

til

mysql_affected_rows( $conn )

så burde den virke!
Avatar billede mr_bula Nybegynder
15. november 2006 - 16:17 #13
Det er jo helt fantastisk =)

Mange tak for hjælpen
Avatar billede coderdk Praktikant
15. november 2006 - 16:19 #14
Var så lidt :)
Avatar billede coderdk Praktikant
15. november 2006 - 16:20 #15
Point of interest! Hvis du skal gøre det mere sikkert (mod SQL-injection) skal du lave:

where produkt_id = '" . $_GET['id'] . "'";

om til:

where produkt_id = '" . mysql_real_escape_string( $_GET['id'] ) . "'";
Avatar billede mr_bula Nybegynder
15. november 2006 - 16:22 #16
Jep er jeg opmærksom på
Avatar billede mr_bula Nybegynder
15. november 2006 - 16:26 #17
Men ellers tak for tippet ;)
Avatar billede coderdk Praktikant
15. november 2006 - 17:19 #18
Bare i orden :) Kunne jo være du havde overset det :)
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