Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Duży Problem z Mysql


  • Zamknięty Temat jest zamknięty
15 odpowiedzi w tym temacie

#1 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 15.08.2011 19:17

Siemka robię sobie plugin z zapisem na mysql normalnie zapisuje do bazy ale gdy zapisze raz to już nie wykonuje się takjakby "UPDATE" dane zapisuje nick ile zabójstw ile śmierci ale potem przy zabójstwie i ponownym wejściu na serwer nie działa
Byłbym wdzięczny gdyby ktoś mógł mi powiedzieć gdzie jest błąd lub naprawić
Cały kod :
#include <amxmodx>
#include <csx>
#include <sqlx>

#define PLUGIN "test"
#define VERSION "1.0"
#define AUTHOR "speedkill"

new Host[]     = ""
new User[]    = ""
new Pass[]     = ""
new Db[]     = ""


new Handle:g_SqlTuple
new g_Error[512]


new stats[33]

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	set_task(1.0, "MySql_Init") 
}

public MySql_Init()
{
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
   

    new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
    if(SqlConnection == Empty_Handle)

        set_fail_state(g_Error)
       
    new Handle:Queries

    Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))")

    if(!SQL_Execute(Queries))
    {
        SQL_QueryError(Queries,g_Error,charsmax(g_Error))
        set_fail_state(g_Error)
       
    }
    
    SQL_FreeHandle(Queries)
   

    SQL_FreeHandle(SqlConnection)   
}

public plugin_end()
{
	SQL_FreeHandle(g_SqlTuple)
}

public Load_MySql(id)
{
	new name[32], szTemp[512]
	get_user_name(id, name, 31)
	
	
	new Data[1]
	Data[0] = id
	
	format(szTemp,charsmax(szTemp),"SELECT * FROM `top15` WHERE (`top15`.`name` = '%s')", name)
	SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}

public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
	if(FailState == TQUERY_CONNECT_FAILED)
	{
		log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)
	}
	else if(FailState == TQUERY_QUERY_FAILED)
	{
		log_amx("Load Query failed. [%d] %s", Errcode, Error)
	}
	
	new id
	id = Data[0]
	
	if(SQL_NumResults(Query) < 1) 
	{
		
		new stats[8], bodyhits[8];
		get_user_stats(id, stats, bodyhits);
		new name[32]
		get_user_name(id, name, 31)
		new szTemp[512]
		
		format(szTemp,charsmax(szTemp),"INSERT INTO `top15` ( `name` , `stats`, `deaths`)VALUES ('%s','%d','%d');",name,stats,stats[1])
		SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
	} 
	else 
	{
		stats[id]         = SQL_ReadResult(Query, 1)
	}
	
	return PLUGIN_HANDLED
}

public Save_MySql(id)
{
	new szTemp[512]
	new stats[8], bodyhits[8];
	get_user_stats(id, stats, bodyhits);
	new name[32]
	get_user_name(id, name, 31)
	
	
	format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name=%s",stats,stats[1],name)
	SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}

public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
	SQL_FreeHandle(Query)
	
	return PLUGIN_HANDLED
}

public client_putinserver(id)
{
	Load_MySql(id)
}

public client_disconnect(id)
{
	Save_MySql(id)
}
Pozdrawiam speedkill ;]
  • +
  • -
  • 2

If you can dream it, you can do it.


#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 20:31

stats[id]         = SQL_ReadResult(Query, 1)
na
stats[id]         = SQL_ReadResult(Query, SQL_FieldNameToNum(Quer,"stats"))

  • +
  • -
  • 1

#3 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 15.08.2011 20:45

Niestety , nie działa zapisze jednorazowo do bazy ile gość ma zabójstw i śmierci a potem już nie zapisuje jak się rozłącze z serwerem cały kod dodałem jeszcze zmienną deaths[33]
#include <amxmodx>
#include <csx>
#include <sqlx>

#define PLUGIN "test"
#define VERSION "1.0"
#define AUTHOR "speedkill"

new Host[]     = ""
new User[]    = ""
new Pass[]     = ""
new Db[]     = ""


new Handle:g_SqlTuple
new g_Error[512]


new stats[33]
new deaths[33]

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	set_task(1.0, "MySql_Init") 
}

public MySql_Init()
{
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
   

    new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
    if(SqlConnection == Empty_Handle)

        set_fail_state(g_Error)
       
    new Handle:Queries

    Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))")

    if(!SQL_Execute(Queries))
    {
        SQL_QueryError(Queries,g_Error,charsmax(g_Error))
        set_fail_state(g_Error)
       
    }
    
    SQL_FreeHandle(Queries)
   

    SQL_FreeHandle(SqlConnection)   
}

public plugin_end()
{
	SQL_FreeHandle(g_SqlTuple)
}

public Load_MySql(id)
{
	new name[32], szTemp[512]
	get_user_name(id, name, 31)
	
	
	new Data[1]
	Data[0] = id
	
	format(szTemp,charsmax(szTemp),"SELECT * FROM `top15` WHERE (`top15`.`name` = '%s')", name)
	SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}

public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
	if(FailState == TQUERY_CONNECT_FAILED)
	{
		log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)
	}
	else if(FailState == TQUERY_QUERY_FAILED)
	{
		log_amx("Load Query failed. [%d] %s", Errcode, Error)
	}
	
	new id
	id = Data[0]
	
	if(SQL_NumResults(Query) < 1) 
	{
		
		new stats[8], bodyhits[8];
		get_user_stats(id, stats, bodyhits);
		new name[32]
		get_user_name(id, name, 31)
		new szTemp[512]
		
		format(szTemp,charsmax(szTemp),"INSERT INTO `top15` ( `name` , `stats`, `deaths`)VALUES ('%s','%d','%d');",name,stats,stats[1])
		SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
	} 
	else 
	{
		stats[id]         = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"stats"))
		deaths[id]         = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"deaths"))
	}
	
	return PLUGIN_HANDLED
}

public Save_MySql(id)
{
	new szTemp[512]
	new stats[8], bodyhits[8];
	get_user_stats(id, stats, bodyhits);
	new name[32]
	get_user_name(id, name, 31)
	
	
	format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name=%s",stats,stats[1],name)
	SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}

public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
	SQL_FreeHandle(Query)
	
	return PLUGIN_HANDLED
}

public client_putinserver(id)
{
	Load_MySql(id)
}

public client_disconnect(id)
{
	Save_MySql(id)
}

  • +
  • -
  • 0

If you can dream it, you can do it.


#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:08


#include <amxmodx>

#include <csx>

#include <sqlx>



#define PLUGIN "test"

#define VERSION "1.0"

#define AUTHOR "speedkill"



new Host[]     = ""

new User[]    = ""

new Pass[]     = ""

new Db[]     = ""





new Handle:g_SqlTuple





new stats[33]

new deaths[33]



public plugin_init() {

	register_plugin(PLUGIN, VERSION, AUTHOR)

	set_task(1.0, "MySql_Init") 

}



public MySql_Init()

{

	g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)

	

	SQL_ThreadQuery(g_SqlTuple,"register_client","CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))")

}



public plugin_end()

{

	SQL_FreeHandle(g_SqlTuple)

}



public Load_MySql(id)

{

	new name[32], szTemp[512]

	get_user_name(id, name, 31)

	

	

	new Data[1]

	Data[0] = id

	

	format(szTemp,charsmax(szTemp),"SELECT * FROM `top15` WHERE (`top15`.`name` = '%s')", name)

	SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)

}



public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)

{

	if(FailState == TQUERY_CONNECT_FAILED)

	{

		log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)

	}

	else if(FailState == TQUERY_QUERY_FAILED)

	{

		log_amx("Load Query failed. [%d] %s", Errcode, Error)

	}

	

	new id

	id = Data[0]

	

	if(SQL_NumResults(Query) > 0) 

	{

		stats[id]         = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"stats"))

		deaths[id]         = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"deaths"))

	} 

	else 

	{

		new stats[8], bodyhits[8];

		get_user_stats(id, stats, bodyhits);

		new name[32]

		get_user_name(id, name, 31)

		new szTemp[512]

		

		format(szTemp,charsmax(szTemp),"INSERT INTO `top15` ( `name` , `stats`, `deaths`)VALUES ('%s','%d','%d');",name,stats,stats[1])

		SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)

	}

	

	return PLUGIN_HANDLED

}



public Save_MySql(id)

{

	new szTemp[512]

	new stats[8], bodyhits[8];

	get_user_stats(id, stats, bodyhits);

	new name[32]

	get_user_name(id, name, 31)

	

	

	format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name = '%s'",stats,stats[1],name)

	SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)

}



public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)

{	

	return PLUGIN_HANDLED

}



public client_putinserver(id)

{

	Load_MySql(id)

}



public client_disconnect(id)

{

	Save_MySql(id)

}

  • +
  • -
  • 2

#5 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 15.08.2011 21:23

Hmm działa :) , ale za każdą zmianą mapy tworzy tak jakby pusty wpis zobacz na screenshota
Dołączona grafika
I da radę jakoś to usunąć jeśli nie to niech tak będzie jak jest ;]
  • +
  • -
  • 0

If you can dream it, you can do it.


#6 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:27

dziwne nie wiem od czego to może być
  • +
  • -
  • 0

#7 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 15.08.2011 21:33

no cóż to nic Dark dzięki ;]
Dobra hiro więc czekam ;]

Użytkownik speedkill123 edytował ten post 15.08.2011 21:43

  • +
  • -
  • 0

If you can dream it, you can do it.


#8 A może sma?

    Godlike

  • Power User

Reputacja: 547
Wszechwiedzący

  • Postów:1 464
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 21:43

Niby się nie znam, ale może dlatego, że masz nie używane miejsce w tablicach?
new stats[33]
new deaths[33] - po co 33 skoro graczy w CSie masz max 32? Wystarczy [32]

@down: gdy policzę od 0 do 31 to wypowiem 32 cyfry, +1 na "zakończenie" tablicy daje mi cyfrę 32 w nawiasie kwadratowym...
Choć tak jak już mówiłem - ma wiedza z zakresu Pawna jest nie wielka, ba nawet bilska zeru xD

Użytkownik A może sma? edytował ten post 15.08.2011 22:12

  • +
  • -
  • 0

#9 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:46

bo maksymalne id gracza to 32
a
new tab[33];
tworzy tablice o polach od 0 do n-1
w tym przypadku od 0 do 32
przeczytaj jakikolwiek tutorial o tablicach
  • +
  • -
  • 0

#10 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 16.08.2011 18:41

ref może ktoś pomoże ;)
  • +
  • -
  • 0

If you can dream it, you can do it.


#11 diggs

    Wszechwidzący

  • Użytkownik

Reputacja: 28
Życzliwy

  • Postów:229
  • Lokalizacja:Internet
Offline

Napisano 17.08.2011 16:26

Wiesz dla czego tak się dzieje? Tzn tworzy się przy zmianie mapy pusty wpis.

Już ci mówię ;] Błąd jest trywialny i nawet fajny xD. Dam ci możliwość pogłówkowania nad tą zagadką i nie napisze odpowiedzi od razu. Jeśli sam na to nie wpadniesz powiem ci o co chodzi. Powiem ci że błąd jest w kodzie, przyjrzyj się mu jeszcze raz dokładnie, jak nie znajdziesz błędu to ci napisze co jest nie tak ;) tylko daj znać.
  • +
  • -
  • 0

cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
b_350_20_D91408_470002_FFFFFA_000000.png

cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
b_350_20_F8D241_B69427_0F100D_000000.png


#12 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 17.08.2011 16:29

No właśnie niestety szukałem już ale nie znalazłem , więc jeśli mógłbyś napisać co jest źle :)
  • +
  • -
  • 0

If you can dream it, you can do it.


#13 Gh0st

    :)

  • Power User

Reputacja: 852
Czempion

  • Postów:920
  • GG:
  • Imię:Tomek
  • Lokalizacja:Rabka-Zdrój
Offline

Napisano 17.08.2011 16:31

format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name = '%s'",stats,stats[1],name)


polecam dać :

format(szTemp,charsmax(szTemp),"UPDATE `top15` SET `stats`='%d' , `deaths`='%d' WHERE `name` = '%s'",stats,stats[1],name)


choć to nie rozwiąże problemu ^^ , taka poprawka

Użytkownik Gh0st edytował ten post 17.08.2011 16:37

  • +
  • -
  • 1

#14 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 17.08.2011 16:39

To właściwie nic nie zmieni czekam jeszcze na odpowiedź diggs'a bo mówił , że wie gdzie jest błąd
  • +
  • -
  • 0

If you can dream it, you can do it.


#15 diggs

    Wszechwidzący

  • Użytkownik

Reputacja: 28
Życzliwy

  • Postów:229
  • Lokalizacja:Internet
Offline

Napisano 17.08.2011 16:42

Chodzi o tą część kodu:
public MySql_Init()
{
	g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
	
	SQL_ThreadQuery(g_SqlTuple,"register_client","CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))")
}

Ściślej o funkcje jakiej używasz do obsługi zapytania - "register_client" ona powoduje że tworzony jest pusty wpis w bazie.
Zmień to na np takie coś:
public MySql_Init()
{
	g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
	
	SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle","CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))")
}
I po sprawie.

Proponuję ci też zaraz po stworzeniu uchwytu do danych do połączanie z bazą sprawdzić czy wprowadzone parametry są poprawne i można nawiązać połączenie z bazą danych, a jeśli go nie ma najlepiej wstrzymać działanie pluginu bo po co mają być wysyłane zapytania które i tak nie zostaną wykonane. Taki test możesz wykonać za pomocą SQL_Connect + sprawdzenie errorów.

Tutaj masz przykład takiego sprawdzenia połączenia:
new ErrorCode, Error[512];
new Handle:SqlConnection = SQL_Connect(g_SqlTuple, ErrorCode, Error, 511);

if(SqlConnection)
{
	SQL_FreeHandle(SqlConnection);
	//tworzenie baz danych za pomoca SQL_ThreadQuery()
}
else
{
	log_to_file("addons/amxmodx/logs/moej logi.log", "Error (%d): %s", ErrorCode, Error);
	SQL_FreeHandle(SqlConnection);
	set_fail_state(g_Error);
}

  • +
  • -
  • 2

cFun.pl BaseBuilderPro v6.5.8 Tirant edit by diggs
IP: 80.82.16.66:27034
b_350_20_D91408_470002_FFFFFA_000000.png

cFun.pl Only AWP - 1000 FPS [SkinsMod]
IP: 80.72.42.113:27015
b_350_20_F8D241_B69427_0F100D_000000.png


#16 speedkill

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 17.08.2011 16:52

taki błąd a tyle hałasu działa pięknie :)
Oczywiście + ;]
można close

Użytkownik speedkill123 edytował ten post 17.08.2011 16:53

  • +
  • -
  • 0

If you can dream it, you can do it.





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych