Jump to content
View in the app

A better way to browse. Learn more.

Forum Supreme-Elite

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[TUTO] Utiliser une base SQL en sourcepawn

Featured Replies

ATTENTION

Ce post concerne les développeurs très avancés dans le sourcepawn et il requiert d'avoir les bases niveau SQL (bdd, table, requête SQL etc ....)

 

Yo tout le monde !

 

Je vais vous faire le partage de l'utilisation d'une bdd en sourcepawn. Cela va vous changez la vie. Cela va permettre de stocker des informations des joueurs à long terme et avec une facilité d'utilisation assez impressionnant ^^. C'est même indispensable arriver à un certain moment.

 

1°) Comment se connecter à sa base de donnée ?

Premier point, il n'y a pas besoin d'include spécifique pour utiliser les fonctions SQL car elles sont déjà implémentées dans l'include sourcemod.

 

Deuxième point, nous aurons besoin de certain define et de certaines variables pour que cela fonctionne, voici la liste (après à vous à modifier les defines) :

#define DATABASE_NAME "LeNomDeTaBdd"

new Handle:g_hDatabase = INVALID_HANDLE;

On va pouvoir commencer, donc pour le début voici deux fonctions toutes prêtes pour se connecter à une bdd, se déconnecter d'une bdd et checker la connexion en cours d'exécution :

public ConnectBDD()
{
	// On check la config présente dans database.cfg
	if (SQL_CheckConfig(DATABASE_NAME))
	{
		new String:error[255];
		// On créé une connexion à la base de donné via la config présente dans database.cfg
		g_hDatabase = SQL_Connect(DATABASE_NAME,true,error, sizeof(error));
		if (g_hDatabase == INVALID_HANDLE)
		{
			LogMessage("Erreur de connexion: %s", error);
		}
		else
		{
			LogMessage("Connexion à la BDD MySQL réussie");
		}
	}
	else
	{
		LogError("Impossible de trouvé <%s> dans le fichier databases.cfg", DATABASE_NAME);
	}

}


stock bool:DisconnectSQL()
{
	if(g_hDatabase != INVALID_HANDLE)
	{
		CloseHandle(g_hDatabase);
		g_hDatabase = INVALID_HANDLE;
	}
	
	return true;
}

stock bool:CheckSQL()
{
	if(g_hDatabase == INVALID_HANDLE)
	{
		ConnectBDD();
		return false ;
	}
	
	return true;
}

Où et quand se connecter et se déconnecter d'une bdd ? Pour faire simple, le mieux afin d'être assez optimiser, c'est de se connecter au lancement de la map et se déconnecter à la fin, après à vous à faire comme bon vous semble ^^. Voici un exemple :

public OnMapStart()
{
	ConnectBDD();
}

public OnMapEnd()
{
	DisconnectSQL();
}

Maintenant, que vous êtes connecté à votre base de donnée, on va pouvoir rentrer dans le vif du sujet et aborder quelque point précis qui peuvent être piège.

 

2°) L'utilisation des requêtes SQL

 

Utilisation simple (c'est à dire envoit d'information à la bdd) :

public MaFonction()
{
	if(CheckSQL())
	{
		new Handle:hQuery = INVALID_HANDLE;
		new String:sQuery[255];
		Format(sQuery, sizeof(sQuery), "UPDATE matable SET numeros=0 ");
		hQuery = SQL_Query(g_hDatabase, sQuery);
		CloseHandle(hQuery);
	}
	else
	{
		DisconnectSQL();
	}
}

-En tout premier lieux, on va tester si la connexion à la bdd est bonne avec la fonction CheckSQL qui retourne un booléen (sinon crash serveur assuré lors d'envois de requêtes SQL) si c'est pas bon, on se déconnecte par sécurité (reconnexion automatique dans le checkSQL si on était déconnecté).

-Ensuite on va créer deux variable, une variable de type Handle, qui est un type spécifique à sourcemod, qui va ensuite faire le même rôle qu'un pointeur en C (mais je sais pas ce qui est bidouillé dedans, enfin je m'en fous lol) et l'autre variable, une chaîne de caractère qui va permettre de stocker la requête SQL sous forme de texte.

-On utilise la fonction Format pour stocker le texte dans sQuery.Ensuite on envoit la requête grâce à la fonction SQL_Query (on lui passe en paramètre le handle de la bdd ainsi que la requête sous forme de texte.

Puis on arrête de pointer afin de libérer la plage mémoire alloué.

 

Voilà maintenant vous savez lancer une requête SQL simplement.

 

ATTENTION

Ce n'est pas parce que votre plugin compile que tout votre code est bon. En effet si votre requête SQL est fausse, il n'y aura pas d'erreur de compilation mais rien ne se passera dans votre table voir même votre plugin sera incohérent. (Cf. Fankine mdr)

 

Utilisation plus complexe (réception de donnée) :

new Handle:hQuery = INVALID_HANDLE;
		new String:sQuery[255];
		Format(sQuery, sizeof(sQuery), "SELECT id FROM Matable WHERE authid='%s'", sAuth);
		hQuery = SQL_Query(g_hDatabase, sQuery);
		if(SQL_GetRowCount(hQuery) == 0)
		{
			Format(sQuery, sizeof(sQuery), "INSERT INTO Matable (authid, name, numero, ok) VALUES('%s', '%s', 0, 0)", sAuth, szClientNameSQL );
			hQuery = SQL_Query(g_hDatabase, sQuery);
			return SQL_GetInsertId(hQuery);
		} else {
			SQL_FetchRow(hQuery);
			return SQL_FetchInt(hQuery, 0);
		}

Ceci est un exemple, donc si il y a des variables qui sont utilisé mais pas défini, c'est normal, c'est tiré d'un de mes codes.

Ici on fait plusieurs choses.

Dans un premier temps on essaye de sélectionner l'id d'une personne dans la table SQL.

Ensuite avec "if(SQL_GetRowCount(hQuery) == 0)"  On teste si on trouve une ligne ou pas (donc trouvez la personne ou non, ici sAuth c'est le steam id).

Si on trouve personne, on va l'insérer dans la table, avec plusieurs paramètres correspondant à ma table. "return SQL_GetInsertId(hQuery);" cette permet de retourner l'index où a été insérer la personne (le numéro de la ligne qui est normalement unique).

Si on trouve quelqu'un : 

SQL_FetchRow(hQuery);

return SQL_FetchInt(hQuery, 0);

La première ligne permet de récupérer le contenu de la table après la recherche et la deuxième ligne permet de récupérer le premier éléments (la première colonne) de la ligne qui a été retourné grâce à la fonction juste avant. (je dis premier car j'ai mis en paramètre "0" mais si vous mettez "2", ce sera le troisième élément de la ligne vu que l'on commence à compter à partir de 0.

 

Pour connaître toutes les fonctions SQL disponibles, rendez-vous (comme d'hab) sur le wiki alliedmod section SQL et la doc de l'API sourcemod.

 

 

Astuce

Des fois vous aurez des bugs lorsque vous essayerez de mettre en paramètre les pseudos des joueurs avec la fonction "GetClientName", pour cela utiliser juste après cette fonction "SQL_EscapeString" avec les paramètre qui vont bien

 

 

Ce tuto n'est pas exhaustif mais vu qu'il s'adresse au personne expérimenté, vous en aurez assez pour utiliser correctement une bdd (après faut savoir utiliser les docs à disposition).

 

Si il y a des erreurs dans mon tuto, faites le moi savoir, je me suis pas relu tout en entier ^^.

 

A la prochaine.

  • 1 month later...

bonjours serait t'il possible d'avoir un tuto qui explique comment afficher un résultat récupérer ?

 

exemple si un joueur veut connaitre son STEAM id il tape /id qui execute cette commande par exemple :

 

 PrintToChat(client, "Votre steam id es "STEAMID" !"); ? 

 

sa serait cool et utile pour ceux qui souhaite évoluer dans le sourcepawn comme moi 

 

 

ou alors comment faire une UPDATE sql en sélectionnant une touche dans un menu par exemple 

 

car tes code sont bien mais on sait pas trop comment les combinner enfin j'ai reussi l'nsert mais maintenant je voudrait afficher les infos correspondantes 

Edited by fantomas66610

  • Author

Salut,

 

J'ai pas très bien compris ce que tu veux faire ? Je crois que tu n'es pas dans la bonne partie de mes tutoriels, je te conseillerai de commencer par le commencement :

http://forum.supreme-elite.fr/topic/13073-tuto-d%C3%A9buter-dans-la-programmation-sourcepawn/

http://forum.supreme-elite.fr/topic/13167-tuto-votre-premier-plugin-en-sourcepawn/

 

Ensuite pour afficher un steam id, tu n'as pas besoin de base de donnée. Sur ce que je peux juger sur ton niveau en Sourcepawn, revient dans cette partie dans quelques semaines lorsque tu auras bien appris en créant quelque petit plugin et je t'expliquerai plus amplement avec plaisir.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.