Avatar billede crasher Nybegynder
04. november 2003 - 17:22 Der er 12 kommentarer og
1 løsning

IP logging!

Hej

Jeg har et script hvor man kan stemme på nogle billeder. Problemet med dette script er bare at man kan stemme så meget man vil på alle billederne.. så nogle brugere stemmer derfor mega meget på deres billede for at få det på top10!.. ville derfor høre om der var en der hurtigt kunne lave en kode som loggede ip'en på brugeren og hvad billede han havde stemt på således at han først kan stemme på det billede han lige har stemt på efter 24 timer.. håber i forstår hvad jeg mener..

/// Crasher
Avatar billede rackbox Nybegynder
04. november 2003 - 17:32 #1
Først skal du finde IP-adressen med: $remoteaddr = $_SERVER['REMOTE_ADDR']

Dernæst skal du i en fil eller database gemme denne IP sammen med et timestamp og det billede vedkommende har stemt på.

Når du genererer siden skal du så først tage højde for om vedkommende har stemt indenfor de sidste 24 timer, eks.:

$query = "select * from billedbase where ip = ".$remoteaddr." and timestamp"... (du skal lige have en rutine til at konvertere timestamp til noget, du kan regne 24 timer tilbage fra. MySQL TIMESTAMP er i formatet YYYYMMDDHHiiSS.

Hvis din query returnerer svar, så har vedkommende allerede stemt og du lader være med at tegne stemmeknappen.
Avatar billede crasher Nybegynder
04. november 2003 - 17:47 #2
hehe den der plan havde jeg også udtænkt mig men for mig er det desværre den anden havldel af arbejdet der ikke er til at finde ud af :((.. håber der er en der kan bixe det samme for mig :)

/// Crasher
Avatar billede rackbox Nybegynder
04. november 2003 - 17:53 #3
Hvilken halvdel? Den rå kode?
Avatar billede crasher Nybegynder
04. november 2003 - 17:54 #4
ja nemlig rackbox ;)
Avatar billede rackbox Nybegynder
04. november 2003 - 18:07 #5
Så bliver du nødt til at smide det vigtige af koden her...
Avatar billede crasher Nybegynder
04. november 2003 - 18:09 #6
okay i får lige noget:

  if($vote){
    mysql_select_db($db_table,$db);
    $result = mysql_query("SELECT points, votes FROM $db_table WHERE id = '$id'");
    list($points,$votes) = mysql_fetch_row($result);
    $points = $points + $vote;
    $votes++;
    mysql_query("UPDATE $db_table SET points = '$points', votes = '$votes' WHERE id = '$id'");
  }


håber det kan brugeS ;)
Avatar billede rackbox Nybegynder
04. november 2003 - 18:27 #7
Det er desværre ikke nok. Jeg mangler din komplette (eller i hvert fald relevante) datastruktur - tabellen over billeder og tabellen over votes.

Jeg antager følgende: Du har en billedtabel med id og lidt mere.

Først skal du oprette en tabel med din log:
  id int auto increment NOT NULL primary key
  IP text
  billed_id int (relation til billedtabellen)
  tid TIMESTAMP

Her følger så lidt kode, der tjekker en given IP for om den har votet på et givet billede indenfor de sidste 24 timer:

$USER_IP = $_SERVER['REMOTE_ADDR'];
$now_minus_24_hrs = strtotime("-24 hours");
//convert to MYSQL_FORMAT(YYYYMMDDHHiiSS)
$MYSQL_FORMAT = date("YmdHis", $now_minus_24_hrs);
//Construct query
$query = "select * from log where IP = '".$USER_IP."' and tid>".$MYSQL_FORMAT;
$result = mysql_query($query);

if ($row = mysql_fetch_array)
    echo "USER HAS ALREADY VOTED WITHIN 24 HRS!";
else
    echo "FREE ACCESS!";


Håber at det kan bruges...
Avatar billede rackbox Nybegynder
04. november 2003 - 18:29 #8
UPS! Jeg glemte at tjekke billednummeret... Her er query'en igen..

$billed_id = 4; //eksempel

$query = "select * from log where IP = '".$USER_IP."' and billed_id = ".$billed_id." and tid>".$MYSQL_FORMAT;
Avatar billede crasher Nybegynder
04. november 2003 - 18:54 #9
er ikke med på om jeg skal oprette en ny tabel udover den anden tabel jeg har med billeder og billedeid i ?
Avatar billede crasher Nybegynder
04. november 2003 - 18:56 #10
hvorhenne smider man info ind i databasen når der ER stemt ?
Avatar billede rackbox Nybegynder
04. november 2003 - 19:34 #11
Kan du ikke smide din tabelstruktur her, så kan jeg bedre hjælpe...
Avatar billede crasher Nybegynder
04. november 2003 - 20:37 #12
kan du bruge det her ?

CREATE TABLE imagevote (
  id int(10) unsigned NOT NULL auto_increment,
  creator varchar(255) NOT NULL default '',
  comment varchar(255) NOT NULL default '',
  points int(10) unsigned NOT NULL default '0',
  votes int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (id)
) TYPE=MyISAM;
Avatar billede rackbox Nybegynder
05. november 2003 - 14:25 #13
Ja - men jeg skal også vide, hvad de forskellige felter repræsenterer. Mit eksempel bygger på, at du har en tabel, der indeholder information om billedet (det du selv har skrevet?) og en tabel, der holder styr på votes (Det, jeg har skrevet). Så bare behold din tabel og lad min tabel relatere til id'en i din egen tabel, således at:
Table LOG:
Field billed_id: indeholder informationer om, hvilket billede voten tæller for. Jeg foreslår derfor følgende:

Opret en tabel, LOG, der er som før beskrevet. Ret din egen tabel, så der ikke er votes i den mere. Den beregner vi nemlig ud fra den anden tabel.

LOG tabellen kan indeholde eks.
  id IP                billed_id    tid
  1  212.242.5.90      2            20031105130344
  2  80.16.5.92        2            20031105160741
  3  81.242.15.90      2            20031105215901
  4  211.201.5.97      2            20031106110202

Herfra kan du lave en query, der tæller antallet af votes:
SELECT count(*) FROM log where billed_id = 2
som tæller hvor mange votes der er på billed nr. 2. I dette tilfælde 4 votes.

Eksemplet ovenfor er stadig gangbart til at se om en IP har stemt indenfor de sidste 24 timer. Når der kommer en ny stemme, så laves følgende query:
INSERT INTO log VALUES ('', $IP, $billed_id, $timestamp)
Den første er blank, så MySQL indsætter auto increment values.
$IP = $_SERVER['REMOTE_ADDR'];
$timestamp = date("YmdHis");
$billed_id kan du vel selv gætte ;-)

Nu opdateres din log for hver gang der stemmes. Her er et virkende eksempel:

$USER_IP = $_SERVER['REMOTE_ADDR'];
$now_minus_24_hrs = strtotime("-24 hours");
//convert to MYSQL_FORMAT(YYYYMMDDHHiiSS)
$MYSQL_FORMAT = date("YmdHis", $now_minus_24_hrs);
//Construct query
$query = "select * from log where IP = '".$USER_IP."' and tid>".$MYSQL_FORMAT;
$result = mysql_query($query);

if ($row = mysql_fetch_array)
    echo "DU HAR ALLEREDE STEMT INDENFOR DE SIDSTE 24 TIMER!";
else{
    $query = "INSERT INTO log VALUES ('', $IP, $billed_id, $timestamp)";
    mysql_query($query);
    }

Og for at finde ud af antallet af stemmer:
$query = "SELECT count(*) FROM log where billed_id = ".$billed_id;
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$antal_votes = $row['count(*)'];

Hvis det her ikke hjælper, så...  ;-)

Bare skriv!
Rackbox
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