Permalänk
Medlem

Spara besökares IP-adresser?

Hej!

Nu har jag börjat leka lite smått med mysql och php. Jag kom på att det skulle vara kul att kunna spara besökares IP-adresser. Jag har gjort ett script, dock får jag fel på rad 25. Vad kan jag gjort för fel?

<?php $con = mysql_connect("localhost","root","") or die(mysql_error()); if (!$con) { die('Could not connect: ' . mysql_error()); } else { mysql_select_db("test", $con); $ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; $unix = time(); $date = date("d:m:Y"); $sql="INSERT INTO ipadresser (ip, datum, unix) VALUES ('$ip','$unix','$date')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } mysql_close($con) ?>

EDIT: Jag vill alltså att det ska ske utan att något echo:as ut.

Permalänk
Medlem

Du stänger aldrig första if-satsen väl?

Du behöver inte köra else efter if (!$con), eftersom att om die() körs så exekveras ändå inte koden nedanför

EDIT: du kan till och med ta bort hela den if-satsen eftersom du gör den kontrollen längre upp $con = mysql_connect("localhost","root","") or die(mysql_error())

Permalänk
Medlem

Else-blocket har inget slut.

Permalänk
Medlem

<?php $con = mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db("test", $con); $ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; $unix = time(); $date = date("d:m:Y"); $sql="INSERT INTO ipadresser (ip, datum, unix) VALUES ('$ip','$unix','$date')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } mysql_close($con) ?>

Är det korrekt nu? Är lite osäker på sista if-satsen...

Permalänk
Medlem

Och sen ska man inte spara IP-adresser som strängar. Kör på en unsigned 32-bitars integer istället. Sparar plats och gör uppslagningar snabbare.

Permalänk
Medlem
Skrivet av iXam:

Och sen ska man inte spara IP-adresser som strängar. Kör på en unsigned 32-bitars integer istället. Sparar plats och gör uppslagningar snabbare.

Ursäkta min färskhet, men vad är det?

Permalänk
Medlem

"111.111.111.111" som en sträng är 15 bytes.
1869573999 som är samma som ovanstående IP-adress är 4 bytes om man lagrar det som ett numretiskt värde (int unsigned i MySQL).

Permalänk
Medlem
Skrivet av iXam:

"111.111.111.111" som en sträng är 15 bytes.
1869573999 som är samma som ovanstående IP-adress är 4 bytes om man lagrar det som ett numretiskt värde (int unsigned i MySQL).

Hur gör man det då? Är lite utav en färsking...

Permalänk
Medlem
Skrivet av csmannen:

Hur gör man det då? Är lite utav en färsking...

Du använder funktionen ip2long: http://php.net/manual/en/function.ip2long.php

Permalänk
Medlem
Skrivet av Marwelln:

Eller MySQLs funktioner. http://dev.mysql.com/doc/refman/4.1/en/miscellaneous-function...

Permalänk
Medlem
Skrivet av iXam:

"111.111.111.111" som en sträng är 15 bytes.
1869573999 som är samma som ovanstående IP-adress är 4 bytes om man lagrar det som ett numretiskt värde (int unsigned i MySQL).

Fungerar bra så länge man inte har IPv6 stöd.

Permalänk
Medlem
Skrivet av Sir. Haxalot:

Fungerar bra så länge man inte har IPv6 stöd.

Finns andra metoder för IPv6 dock

Visa signatur

| Fractal Design R4 White | Intel I5 6600k@4Ghz| Asus Z170-A | MSI GTX 970 @1425Mhz | Corsair 16GB DDR4 2133mhz | Samsung 840 250GB | Corsair 650Watt nätagg |

https://soundcloud.com/symbolofficial

Permalänk
Medlem
Skrivet av vikham:

Finns andra metoder för IPv6 dock

Ska börja gräva i det snart åsså. Jag kommer INTE gilla de datavolymer jag kommer behöva lagra för min dnsdigger.com

Permalänk
Medlem

Nu har jag försökt fixa till det. Dock fungerar det inte. Här är koden:

<?php $con = mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db("test", $con); $ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; $unix = time(); $date = date("d:m:Y"); $query = mysql_query ("INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')"); if (!mysql_query($query,$con)) { die('Error: ' . mysql_error()); } mysql_close($con) ?>

Jag får följande fel: "Query was empty". Vad gick fel?

Permalänk
Inaktiv

Du kör din fråga två gånger, eller ja, en tom fråga andra gången.
Kör det här istället:

if (!mysql_query("INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')")) { die('Error: ' . mysql_error()); }

Permalänk
Medlem

Det saknas även ett ; efter mysql_close($con) på näst sista raden.

Antingen gör du som havsmonstret skriver, eller så ändrar du
$query = mysql_query ("INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')");

till
$query = "INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')";

Permalänk
Medlem
Skrivet av anon150287:

Du kör din fråga två gånger, eller ja, en tom fråga andra gången.
Kör det här istället:

if (!mysql_query("INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')")) { die('Error: ' . mysql_error()); }

Skrivet av johker:

Det saknas även ett ; efter mysql_close($con) på näst sista raden.

Antingen gör du som havsmonstret skriver, eller så ändrar du
$query = mysql_query ("INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')");

till
$query = "INSERT INTO ipadresser ('','".$ip."','".$datum."','".$unix."')";

Tack, nu har jag ändrat min kod till era förslag, men då får jag "Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''','127.0.0.1','','1306611459')' at line 1". Alltså är det något fel i min query.

KOD: http://pastie.org/1986093

Permalänk

tycker det är kul när det dyker om trådar som man inte fattar ett skvatt av

Visa signatur

#1 Antec 300 | P5E X48 Deluxe | Q9550 @ 3,8GHz, Scythe Orochi | 4GB XMS2 @ 1066MHz | 2x HD4870 1GB - CF X - Accelero S1 R2 x2 | Corsair TX650W |
#2 Antec 300 | Gigabyte GA-P35-DS4 | E6850 3Ghz @ 3,6Ghz, Scythe Ninja | HyperX 2GB @ 1066Mhz | NX8800GT 512MB OC | Corsair CX 400W |

Permalänk
Medlem

Hej tänkte jag kunde låna tråden lite, eftersom många har dynamisk IP är det bättre att spara hostname istället?

Visa signatur
Permalänk
Medlem
Skrivet av XzaR:

Hej tänkte jag kunde låna tråden lite, eftersom många har dynamisk IP är det bättre att spara hostname istället?

Många är väl att att ta i, och hostnamet är väl inte lika intressant?

Permalänk
Medlem
Skrivet av XzaR:

Hej tänkte jag kunde låna tråden lite, eftersom många har dynamisk IP är det bättre att spara hostname istället?

Kort svar :
Nej.

Långt svar :
Nej. För jag antar att du menar att du skulle logga xxx.dyndns.tld istället för IP-adressen? Det är *sällan* någon har reverse på sin host när dom skaffar ett sådant domännamn och hostar saker på sin hemmalina.

Permalänk
Medlem

Vet inte riktigt, jag har gjort en poll där rösterna verifieras med IP men vissa personer kan rösta igen när deras IP ändras. Så jag tänkte använda hostname istället för den ändras väl inte alla fall den man får från sin ISP? Nu använder jag Cookies + IP men finns det något bättre?

Visa signatur
Permalänk
Inaktiv
Skrivet av csmannen:

Tack, nu har jag ändrat min kod till era förslag, men då får jag "Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''','127.0.0.1','','1306611459')' at line 1". Alltså är det något fel i min query.

KOD: http://pastie.org/1986093

INSERT INTO `ipadresser` VALUES ('','".$ip."','".$datum."','".$unix."');

Permalänk
Medlem

Är det inte bättre och skippa datum helt och hållet och bara använda unix? Sen kanske du måste välja vilka timezone du är i när du kör med date.

Visa signatur
Permalänk
Medlem
Skrivet av XzaR:

Är det inte bättre och skippa datum helt och hållet och bara använda unix? Sen kanske du måste välja vilka timezone du är i när du kör med date.

Tog med det för att få en lättöverskådlig bild i databasen, så det spelar egentligen ingen roll, men jag vill ha det där.

Permalänk
Medlem
Skrivet av csmannen:

Tog med det för att få en lättöverskådlig bild i databasen, så det spelar egentligen ingen roll, men jag vill ha det där.

Nu får jag dock en udda ip-adress en som börjar på 127 och inte min som jag får via diverse myip-sidor. Via vilken funktion i php får jag ut min riktigta?

Permalänk
Medlem
Skrivet av csmannen:

Nu får jag dock en udda ip-adress en som börjar på 127 och inte min som jag får via diverse myip-sidor. Via vilken funktion i php får jag ut min riktigta?

Funkar datumet eller, du bör köra med PHP strict så blir det bättre i framtiden sen så använd date("r") istället.

Vet inte varför du får fel IP men jag kör med den här funktionen sen så är 127.0.0.1 nästan samma sak som localhost så om du använder localhost i din adress så får du så klart 127.0.0.1 som din IP.

function get_ip_address() { if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return $ip; }

Visa signatur
Permalänk
Medlem

Jag kom på att det kan vara bra att kolla om ipadressen redan finns i databasen för att förhindra spam som i värsta fall kan leda till en full databas.

För att göra det ska jag göra en query som kolla om ipt redan finns. Det fungerar bra enligt mig, vad tycker ni? Kan det här sega ner hemsidan?

KOD: http://pastie.org/1988224

EDIT: Nu testade jag scriptet på en sida, det fungerade. Dock så kan man inte komma tillbaka till sidan, för då blir det vitt. Jag antar att det har att göra med mina sista rader,

else die

Dock skuile jag vilja att scriptet ignorerars om det redan finns en rad med det unika ipt, finns det någon sån funktion i php?

Permalänk
Medlem

Observera att du måste starta en session före.

<?php // Kollar ifall IP-adressen finns i session if (isset($_SESSION['Ip'])) { $ip_first = $_SESSION['Ip']; } //finns den inte kollar den om den finns i databasen else { $ip_first = $_SERVER['REMOTE_ADDR']; $_SESSION['Ip'] = $ip_first; $Time_first = date('U'); require("connect.php"); $check = mysql_query("SELECT * FROM connections WHERE Ip='$ip_first'"); $numrows_ip = mysql_num_rows($check); while ($row2 = mysql_fetch_assoc($check)) { $Ip_store = $row2['Ip']; } //ifall den inte finns så skriver den in det if ($Ip_store != $ip_first) { $write = mysql_query("INSERT INTO connections VALUES ('','$ip_first','0','$Time_first',NULL)"); } } ?>

connect.php innehåller förljande:

<?php $connect = mysql_connect("localhost","namn","pass") or die("Connection failed! Contact admin."); mysql_select_db("databasnamn") or die("Connection failed! Contact admin."); ?>

På detta sätt slipper du ens göra en förfrågan till databasen ifall sessionen finns. Detta borde minska trafiken lite grann. För ifall du gör en förfrågan varje gång kommer det ju ändå gå åt en del prestanda varje gång någon laddar en sida.

Permalänk
Medlem
Skrivet av kobb3:

Observera att du måste starta en session före.

<?php // Kollar ifall IP-adressen finns i session if (isset($_SESSION['Ip'])) { $ip_first = $_SESSION['Ip']; } //finns den inte kollar den om den finns i databasen else { $ip_first = $_SERVER['REMOTE_ADDR']; $_SESSION['Ip'] = $ip_first; $Time_first = date('U'); require("connect.php"); $check = mysql_query("SELECT * FROM connections WHERE Ip='$ip_first'"); $numrows_ip = mysql_num_rows($check); while ($row2 = mysql_fetch_assoc($check)) { $Ip_store = $row2['Ip']; } //ifall den inte finns så skriver den in det if ($Ip_store != $ip_first) { $write = mysql_query("INSERT INTO connections VALUES ('','$ip_first','0','$Time_first',NULL)"); } } ?>

connect.php innehåller förljande:

<?php $connect = mysql_connect("localhost","namn","pass") or die("Connection failed! Contact admin."); mysql_select_db("databasnamn") or die("Connection failed! Contact admin."); ?>

På detta sätt slipper du ens göra en förfrågan till databasen ifall sessionen finns. Detta borde minska trafiken lite grann. För ifall du gör en förfrågan varje gång kommer det ju ändå gå åt en del prestanda varje gång någon laddar en sida.

Jag får då "Undefined index: Ip" på rad 22. Vilka fält ska man ha för att det här ska fungera? Det jag tycker känns logiskt är id, ip, unix/date. Vad har du?

Redigerat tebellnamn på begäran