Skocz do zawartości

Rekomendowane odpowiedzi

Hej, mam pewien problem, mianowicie próbuję zrobić bazę danych do MySQL. Znalazłem dość stary poradnik do MySQL. Napisałem testowy plugin do dodawania do tabeli nicku,steamid oraz liczby. Jednak chciałbym zrobić coś więcej, więc chciałbym poprosić o pomoc. Mianowicie czy ktoś by mi wytłumaczył jak poprawnie i przejrzyście zrobić taki zapis do MySQL?
Tutaj mój plugin testowy
 

Spoiler
#include <sdktools>
#include <sdkhooks>

int liczba[MAXPLAYERS+1];

Handle DB;
char Error[120];
public void OnPluginStart()
{
	DB = SQL_Connect("Test", true, Error, sizeof(Error));
	if (DB == INVALID_HANDLE)
	{
		PrintToServer("Nie można połączyć z bazą danych: %s", Error);
		CloseHandle(DB);
	}
	else
	{
		PrintToServer("Połączono");
	}
	
	RegAdminCmd("sm_test", CMD_Test, ADMFLAG_ROOT);
	RegAdminCmd("sm_tr", CMD_Reset, ADMFLAG_ROOT);
}

public void OnClientAuthorized(int client)
{
	char steamid[64];
	GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
	
	char query[150];
	Format(query, sizeof(query), "SELECT steamid FROM test WHERE steamid='%s'", steamid);
	Handle queryH = SQL_Query(DB, query);
	if (queryH != INVALID_HANDLE)
	{
		if (SQL_FetchRow(queryH))
		{
			char number[32];
			SQL_FetchString(queryH, 1, number, sizeof(number));
			Format(number, sizeof(number), "%i", liczba[client]);
			liczba[client] = StringToInt(number);
		}
		else {
			SQL_GetError(DB, Error, sizeof(Error))
			PrintToServer("Nie można ustawić liczby MYSQL ERROR: %s", Error)
		}
	}
}
public Action CMD_Reset(int client, int args)
{
	liczba[client] = 0;
}

public Action CMD_Test(int client, int args)
{
	char name[64], steamid[64]
	char query[300];
	GetClientName(client, name, sizeof(name));
	GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid));
	Format(query, sizeof(query), "INSERT INTO `test` (`name`, `steamid`, `number`) VALUES('%s', '%s', '%d') ON DUPLICATE KEY UPDATE `name` = '%s', `number` = %d", name, liczba[client]);
	
	Handle queryH = SQL_Query(DB, query);
	
	if (queryH != INVALID_HANDLE)
	{
		ReplyToCommand(client, "[SM] Dodano +1");
		liczba[client]++;
		LogToFile("/addons/sourcemod/logs/test.cfg", "Admin dodał +1");
	}
	else
	{
		SQL_GetError(DB, Error, sizeof(Error));
		ReplyToCommand(client, "[SM] Nie dodales +1 :%s", Error);
	}
	PrintToChat(client, "Aktualnie masz:%i", liczba[client]);
	return Plugin_Handled;
} 

 

 

Edytowane przez Brum Brum
Literówka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli pytasz o przejrzystość kodu to:

  • Zmienna error broń Boże nie globalna
  • Lepsze nazewnictwo zmiennych. Ktoś mądry kiedyś powiedział że długość nazwy zmiennej powinna reprezentować jej wagę w kodzie. Na przykład DB -> DataBaseHandle. Inny ktoś powiedział, że żadna pełna nazwa zmiennej nie powinna zawierać się w innej zmiennej, czyli jeśli masz już query, zamień queryH na coś innego.
  • Polecam za wstawionymi includami wkleić poniższy kod żeby zawsze pamiętać o nowej składni i semicolonach:
    Cytat

    #pragma semicolon 1
    #pragma newdecls required

     

Ponadto w CMD_Test w Formacie masz 5 %s/%d a do stringu przesyłasz tylko 2 zmienne ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
11 minut temu, Vasto_Lorde napisał:

Jeśli pytasz o przejrzystość kodu to:

  • Zmienna error broń Boże nie globalna
  • Lepsze nazewnictwo zmiennych. Ktoś mądry kiedyś powiedział że długość nazwy zmiennej powinna reprezentować jej wagę w kodzie. Na przykład DB -> DataBaseHandle. Inny ktoś powiedział, że żadna pełna nazwa zmiennej nie powinna zawierać się w innej zmiennej, czyli jeśli masz już query, zamień queryH na coś innego.
  • Polecam za wstawionymi includami wkleić poniższy kod żeby zawsze pamiętać o nowej składni i semicolonach:

     

Ponadto w CMD_Test w Formacie masz 5 %s/%d a do stringu przesyłasz tylko 2 zmienne ?

Faktycznie, po dodaniu "ON DUPLICATE KEY UPDATE" zapomniałem dodać pozostałych. #pragma newdecls required używam w includzie którego tutaj nie ma ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Połączenie z bazą danych musi wykonywać się co mapę. OnPluginStart tego nie robi. Co jeśli się zdarzy ten jeden jedyny raz przy instalacji pluginu że nie będzie połączenia z bazą danych? Serwer trzeba będzie restartować przez panel

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Czy problem został rozwiązany? Czy masz jeszcze jakieś pytania co do SQL?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Pomoc udzielona

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...