ugrás a tartalomhoz

IP cím rögzítése MSQL adatbázisba

darkride · 2008. Feb. 13. (Sze), 18.52
Valaki nem tudja hogy ez így miért nem jó?
<?
$ip = getenv('REMOTE_ADDR');
$username = $_SESSION['username'];

include 'constants.php';

$mysql = mysql_connect(DBHOST,DBUSER,DBPASS);
        mysql_select_db(DBNAME,$mysql);

$connection = mysql_pconnect(DBHOST,DBUSER,DBPASS)
or die ("Couldn't connect to server.");

$db = mysql_connect(DBHOST,DBUSER,DBPASS);
mysql_select_db(DBNAME,$db);


$parancs = "INSERT INTO `users` (`ip`) VALUES ('$ip') WHERE username = '$username'";

 ?>
Azt szeretném hogy:
A látogató ip címét a "users" táblában a felhasználóhoz tartozó mondjuk "ip" mezőbe beleíratni?
 
1

INSERT helyett UPDATE

Poetro · 2008. Feb. 13. (Sze), 19.46
//EOM
3

UPDATE nem jó

darkride · 2008. Feb. 13. (Sze), 23.55
UPDATE-el az a baj hogy én úgy szeretném hogy a felhasználó összes IP-címét tárolja, ne pedig lecserélje.
2

mysql_query

halee · 2008. Feb. 13. (Sze), 20.43
Valamint, ha jól látom a $parancs string-ben lévő SQL utasítás nincs futtatva. Ehhez a mysql_query() fgv-re lesz szükséged.
4

Próbáltam már

darkride · 2008. Feb. 13. (Sze), 23.59
beírtam még ezt:
mysql_query($query) or die('Error, Check MySql'); 
és ezt a hibaüzenetet kaptam:
mysql_query(): MySQL 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 'WHERE username = 'darkride'' at line 2 in /nfs/extra/v/vi/virtualis-tuning/wwwroot/main.php: mysql_query on line 554
in /nfs/extra/prepend/prepend.php(159) : system created function on line 36
Error, Check MySql
5

nem értem

Drawain · 2008. Feb. 14. (Cs), 00.46
Igazából nem értem mit akarsz csinálni. Az SQL INSERT utasításban tudtommal nincs WHERE. Ha minden egyes ip-t le akarsz menteni, akkor csinálj egy táblát amiben az ip-ket sorolod fel, és minden sor álljon egy felhasználóazonosítóból és egy ip-ből (lsd. még kapcsolt táblák, stb.). WHERE-t pedig hagyjad meg a SELECT-nek, az UPDATE-nek és a DELETE-nek. Ha egy sort akarsz módosítani akkor természetesen UPDATE kell, mint azt korábban említették.

SQL insert
MYSQL insert
És ajánlom a dokumentációkat is...
7

A cél az, hogy

darkride · 2008. Feb. 14. (Cs), 15.34
Nos tehát úgy akarom hogy minden felhasználóhoz tartozik egy "ip" mező ahova akkor fog bekerülni a felhasználó IP címe ha még nem szerepel ott, akkor beteszi a régi után.
Ez megoldható?
Röviden
felhasználó1:
ip1: 192.168.1.101
ip2: 192.168.1.102
ip3: 192.168.1.103
ip4: 192.168.1.104

Ha az 5. IP címről jelentkezik be, csak akkor teszi be ha még nem szerepelt ott.
9

update

Drawain · 2008. Feb. 14. (Cs), 18.23
Továbbra is UPDATE... Ha egy mezőt akarsz módosítani (ip), akkor ne INSERT-elj. Hogy ebben a mezőben hogy tárolsz több ip-t, hát oldd meg valahogy: tárold az ipket valami karakterrel - pl "|"-el - elválasztva és mikor lekérdezed explode-old a mező tartalmát, így ugye egy tömböt kapsz az ip-kkel - vagy írj bele egy xml, json tömböt vagy bármi :). A szebb megoldás mindenképpen külön táblába menteni az ip-ket, ahol egy-egy ip a tábla egy-egy sora lesz.

MySQL UPDATE

Komplett kódot szerintem ne várj.
10

Köszönöm válaszod

darkride · 2008. Feb. 14. (Cs), 20.16
Megtudom csinálni annnyit értek php-hez, csak azzal van problémám hogy kigondoljam az elvet.
Mégegyszer is thx
11

Például...

vbence · 2008. Feb. 15. (P), 10.33
Mindenképpen célszerű, ha a usereket nyilvántartó tábládban van egy numerikus ID is, nem pusztán a (string alapú) usenév azonosítja a rekordot. Ekkor létrehozhatsz egy másik táblát mondjuk user_ip néven:

CREATE TABLE user_ip (
    user_id int(8) unsigned not null,
    ip varchar(15) not null,
    timestamp datetime not null
);
Majd ellenőrzöd, hogy szerepel-e az adott IP az adatbázisban:
SELECT * FROM user_ip WHERE user_id='$user_id' AND ip='$ip';
Ha szerepel, akkor frissíted a rekordot (erről bővebben a takarításnál):
UPDATE user_ip SET timestamp=NOW() WHERE user_id='$user_id' AND ip='$ip';
Ha nincs eredmény, akkor nem szerepel, tehát beszúrhatod:
INSERT INTO user_ip (user_id, ip, timestamp) VALUES ('$user_id', '$ip', NOW());
A takarítás, pedig annyit, jelent, hogy nem szeretnél egy örökkön örökké dagadó táblával foglalkozni, ezért az aktualitásukat vesztett információkat (mondjuk a 3 hónapnál régebbieket) törlöd:
DELETE FROM user_ip WHERE TO_DAYS(timestamp) < TO_DAYS(NOW()) - 90 * 86400;
Ezt elég naponta egyszer futtatnod, nem ajánlott minden egyes alkalommal, mert egyszerűen fölösleges. (Az időkülönbségre van szebb megoldás is, de a példa kedvéért ez is megteszi).
13

INSERT ... ON DUPLICATE KEY ...

saxus · 2008. Feb. 15. (P), 12.08
Akkor már inkább

CREATE TABLE user_ip (  
    user_id int(8) unsigned not null,  
    ip varchar(15) not null,  
    timestamp datetime not null  
    PRIMARY KEY (user_id)
); 
és UPDATE, INSERT helyett ez, egyben:

INSERT INTO user_ip (user_id, ip, timestamp)
VALUES ('$user_id', '$ip', NOW())
ON DUPLICATE KEY UPDATE timestamp=NOW();
És nem kell ellenőrizni, hogy szerepel-e.
14

talán

vbence · 2008. Feb. 15. (P), 13.21
De akkor a user_id és ip együtt legyen a primary key.
17

Igaz

saxus · 2008. Feb. 15. (P), 22.32
Igaz, kicsit siettem a válasszal, mert el kellett mennem vhova.
6

ellenőrzés

lacy · 2008. Feb. 14. (Cs), 11.36
1. Nyílván ha a megadott kódrész simán be van ágyazva az oldalba(javítva mert így nem működik), akkor annyiszor kerül be a felhasználó ipje az adatbázisba, ahányszor lekéri a lapot.
2. Nem tudom érdemes-e tárolni hosszútávon minden felhasználó minden ip címét, persze ezt mondom úgy, hogy nem ismerem hol lesz rá szükséges, lehet indokolt. én például inkább eseményekhez rögzítek ip címet, pl. fórumhozzászólás.
8

Így szeretném

darkride · 2008. Feb. 14. (Cs), 15.43
Hát először szeretném hogy így lenne jó és ha jó lesz akkor majd megcsinálom if-el.
12

a kérdésnél maradva

tanar46 · 2008. Feb. 15. (P), 10.49
Hi

Vbence már megmondta a frankót, én csak az adott példát javítanám működőképesre, hogy legyen miből kiindulni:

<?  
$ip = getenv('REMOTE_ADDR');  
$username = $_SESSION['username'];  

include 'constants.php';  

$db = mysql_connect(DBHOST,DBUSER,DBPASS);  
mysql_select_db(DBNAME,$db);  

$parancs = "INSERT INTO `users` (`ip`, `username`) VALUES ('$ip', '$username')";  
mysql_query($parancs, $db) or die (mysql_error());
?>
Ez a kód szintaktikailag jó (valószínű :) ), de szemantikailag nem. Sztem mindenképp kövesd a többiek gondolatmenetét.

Üdv!
Tanar
15

Miért nem unsigned int?

siposa · 2008. Feb. 15. (P), 13.38
Szerintem inkább unsigned int not null adattípusba kellene IP-ket tárolni:
  • INET_ATON() és INET_NTOA() konvertál
  • kisebb helyet foglal, valszeg gyorsabb is
  • adatbázisba nem kerülhet rossz szintaktikájú adat
  • könnyen lehet netmask szerint szűrni, pl: IP & INET_ATON('255.255.255.224') = INET_ATON('192.168.1.1')
16

Csupán egyetlen probléma

vbence · 2008. Feb. 15. (P), 16.31
..hogy a PHP 32 bites signed integert használ, abban a pillanatban, hogy számként kezeled elszabadul a pokol. - persze csak C osztályú címeknél ;)

Szerk: most látom, hogy ezeket a mysql natívban tudja... úgyhogy nem mondtam semmit.
18

Köszönöm válaszotokat

darkride · 2008. Feb. 17. (V), 10.36
köszönöm szépen a válaszotokat
most már jó
üdv.: darkride