Veteran Member
Join Date: Jan 2010
Location: mom's basement
|
05-09-2020
, 13:45
Re: [ISSUE] Problem while storing data in the database
|
#5
|
- This create table, which set timestamp on every record.
- When query player IP from database, plugin fetch first row only. Because we order query results by timestamp DESC.
- Plugin compare player IP with database IP. If not match, it makes new record.
PHP Code:
Handle MyDataBase;
public void OnPluginStart()
{
SQL_TConnect(connect_callback, "test");
}
public void connect_callback(Handle owner, Handle hndl, const char[] error, any data)
{
MyDataBase = hndl;
if(MyDataBase == null)
{
SetFailState("Error: %s", error);
}
SQL_TQuery(MyDataBase, createtable_callback, "CREATE TABLE IF NOT EXISTS `players` (`name` varchar(64),`steamid` varchar(64),`ip` varchar(64),`timestamp` timestamp DEFAULT CURRENT_TIMESTAMP)");
}
public void createtable_callback(Handle owner, Handle hndl, const char[] error, any data)
{
if(hndl == null)
{
LogError("Create table Error: %s", error);
return;
}
}
public void OnClientPostAdminCheck(int client)
{
char query[255], auth[30];
if(!GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth))) return;
Format(query, sizeof(query), "SELECT `ip` FROM `players` WHERE `steamid`='%s' ORDER BY `players`.`timestamp` DESC", auth);
SQL_TQuery(MyDataBase, query_callback, query, GetClientUserId(client));
}
public void query_callback(Handle owner, Handle hndl, const char[] error, any data)
{
int client = GetClientOfUserId(data);
if(client == 0 || !IsClientInGame(client)) return;
char query[255], name[32], auth[30], ip[60];
GetClientName(client, name, sizeof(name));
char name2[64];
SQL_EscapeString(MyDataBase, name, name2, sizeof(name2)); // Don't save raw names in database!!
GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth));
GetClientIP(client, ip, sizeof(ip));
// Query is not UPDATE, INSERT or DELETE
if(hndl != null && SQL_HasResultSet(hndl))
{
if(SQL_GetRowCount(hndl))
{
if(!SQL_FetchRow(hndl)) return;
char buffer[64];
SQL_FetchString(hndl, 0, buffer, sizeof(buffer)); // fetch first row only (timestamp DESC)
//PrintToServer("buffer %s", buffer);
if(StrEqual(buffer, ip))
{
return;
}
}
Format(query, sizeof(query), "INSERT INTO `players` (`name`,`steamid`,`ip`) VALUES ('%s', '%s','%s')", name2, auth, ip);
SQL_TQuery(MyDataBase, save_callback, query);
}
}
public void save_callback(Handle owner, Handle hndl, const char[] error, any data)
{
PrintToServer("Done");
}
old
https://www.w3schools.com/sql/sql_primarykey.asp
https://www.w3schools.com/sql/sql_unique.asp
If player SteamID and IP records are important, and you not want duplicate records, you want use either PRIMARY KEY or UNIQUE in table.
I'm hurry, so I give you quick bad example.
PHP Code:
Handle MyDataBase;
public void OnPluginStart()
{
SQL_TConnect(connect_callback, "test");
}
public void connect_callback(Handle owner, Handle hndl, const char[] error, any data)
{
MyDataBase = hndl;
if(MyDataBase == null)
{
SetFailState("Error: %s", error);
}
SQL_TQuery(MyDataBase, createtable_callback, "CREATE TABLE IF NOT EXISTS players (name varchar(64), steamid varchar(64), ip varchar(64), PRIMARY KEY (steamid,ip))");
}
public void createtable_callback(Handle owner, Handle hndl, const char[] error, any data)
{
if(hndl == null)
{
LogError("Create table Error: %s", error);
return;
}
}
public void OnClientPostAdminCheck(int client)
{
char query[255], name[32], auth[30], ip[60];
GetClientName(client, name, sizeof(name));
char name2[64];
SQL_EscapeString(MyDataBase, name, name2, sizeof(name2)); // Don't save raw names in database!!
GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth));
GetClientIP(client, ip, sizeof(ip));
Format(query, sizeof(query), "INSERT INTO players(name,steamid,ip) VALUES('%s','%s','%s')", name2, auth, ip);
SQL_TQuery(MyDataBase, record_callback, query);
}
public void record_callback(Handle owner, Handle hndl, const char[] error, any data)
{
if(hndl == null)
{
LogError("record Error: %s", error);
// you going to see "... record Error: UNIQUE constraint failed: players.steamid, players.ip" when save duplicate steamid+IP record
return;
}
PrintToServer("success");
}
This will record different steamid+ip, no duplicates.
__________________
Do not Private Message @me
Last edited by Bacardi; 05-10-2020 at 01:29.
|
|