GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Dark_revan le 30 Août 2011, 16:50:01
-
Bonjour a tous,
Voila j'ai un petit probleme avec cette fonction de samp mysql :
samp_mysql_fetch_row
Voila le morceaux de code :
Code:
new query[64];
format(query, sizeof(query), "SELECT %s FROM joueurs WHERE id = %d LIMIT 1", sqlvalname, sqlplayerid);
samp_mysql_query(query);
samp_mysql_store_result();
if(samp_mysql_fetch_row(sqlresult)==1)
{
return 1;
}
Le serveur crash après l'utilisation de la fonction, si vous pourriez m'aidez a réglé ce légé problème.
Merci d'avance Très souriant
PS: excusez moi d'avoir poster dans la mauvaise section la premiere fois.
-
http://www.gtaonline.fr/forums/index.php/topic,12060.0.html (http://www.gtaonline.fr/forums/index.php/topic,12060.0.html)
-
J'ai edit mon message pour le code.
-
D'où sort la variable sqlresult ?
-
La variable sqlresult provien de la fonction dans ce cas précis elle égal PlayerInfo[playerid][pPassword]
Enfaite le but de ce code est de voir si le password de la variable PlayerInfo[playerid][pPassword] et le password dans la BD est le même.
Je me suis inspirer de modern topia pour ce code. Vu que je suis débutant en mysql.
-
C'est simplement que tu ne comprend pas réellement l'utilité des fonctions.
La fonction mysql_fetch_row permet de parcourir les résultats renvoyés par la requête faite précédemment (mysql_query).
new sQuery[64];
format(sQuery, sizeof(sQuery), "SELECT \"%s\" FROM joueurs WHERE id = %d LIMIT 1", sqlvalname, sqlplayerid);
samp_mysql_query(sQuery);
samp_mysql_store_result();
if(samp_mysql_num_rows() == 1)
{
return 1;
}
samp_mysql_free_result();
Et un conseil, change de plugin pour utiliser MySQL ;).
Un second conseil, utilise des guillemets pour encadrer une chaîne de caractères si tu ne veux pas avoir de mauvaise surprise.
-
Merci pour tes conseils, je les est appliquer et j'ai pris le plugin de G-Style (Mysql.dll)
Le problème avec ce plugin c'est que j'arrive pas a save mes données avec le onplayerupdate.
Pour le moment j'utilise le système de mordern topia qui est assez complexe je trouve pour le Onplayerupdate.
Voila mon morceaux de code :
Onplayerupdate
if(IsPlayerConnected(playerid))
{
if(gPlayerLogged[playerid] == 1)
{
MySQLCheckConnection();
new query[MAX_STRING];
format(query, MAX_STRING, "UPDATE players SET ");
MySQLUpdatePlayerStr(query, PlayerInfo[playerid][pSQLID], "Password", PlayerInfo[playerid][pKey]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Tut", PlayerInfo[playerid][pTut]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Faction", PlayerInfo[playerid][pFaction]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Race", PlayerInfo[playerid][pRace]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Sexe", PlayerInfo[playerid][pSex]);
MySQLUpdateFinish(query, PlayerInfo[playerid][pSQLID]);
}
}
Fonction :
public MySQLUpdateFinish(query[], sqlplayerid) // by Luk0r
{
if (strcmp(query, "WHERE id=", false) == 0) mysql_query(query);
else
{
new whereclause[32];
format(whereclause, sizeof(whereclause), " WHERE id=%d", sqlplayerid);
strcat(query, whereclause, MAX_STRING);
mysql_query(query);
format(query, MAX_STRING, "UPDATE joueurs SET ");
}
return 1;
}
public MySQLUpdatePlayerInt(query[], sqlplayerid, sqlvalname[], sqlupdateint) // by Luk0r
{
MySQLUpdateBuild(query, sqlplayerid);
new updval[64];
format(updval, sizeof(updval), "%s=%d", sqlvalname, sqlupdateint);
strcat(query, updval, MAX_STRING);
return 1;
}
public MySQLUpdatePlayerFlo(query[], sqlplayerid, sqlvalname[], Float:sqlupdateflo) // by Luk0r
{
/* new query[128];
format(query, sizeof(query), "UPDATE players SET %s=%f WHERE id=%d", sqlvalname, sqlupdateflo, sqlplayerid);
mysql_query(query);*/
new flotostr[32];
format(flotostr, sizeof(flotostr), "%f", sqlupdateflo);
MySQLUpdatePlayerStr(query, sqlplayerid, sqlvalname, flotostr);
return 1;
}
public MySQLUpdatePlayerStr(query[], sqlplayerid, sqlvalname[], sqlupdatestr[]) // by Luk0r
{
MySQLUpdateBuild(query, sqlplayerid);
new escstr[128];
new updval[128];
mysql_real_escape_string(sqlupdatestr, escstr);
format(updval, sizeof(updval), "%s='%s'", sqlvalname, escstr);
strcat(query, updval, MAX_STRING);
return 1;
}
Si vous voyez l'erreur dans la sauvegarde faite le moi savoir :D, De mon coté si je trouve j'indiquerai mon erreur.
Merci,
-
Évite d'utiliser la fonction évènementielle OnPlayerUpdate pour sauvegarder tes données.
Pour commencer, l'utilisation de MySQL est assez lourde et que en plus de ça, tu l'utilise PLUSIEURS FOIS PAR SECONDE.
-
Tu devrai genre enregistrer le nombre de mort a la mort du joueur uniquement, son password juste au register et au changement de pass, je pense pas qu'un joueur change de sexe donc pas besoin de l'enregistrer apres l'enregistrement du debut
-
Ok je vais pas mettre le save dans onplayerupdate mais le soucis enfaite. C'est que sa sauvegarde toujours pas. le code est certainement mauvais dans mon onplayerupdate.
Enfaite il faut que je trouve l'equivalent de cette fonction samp_mysql_strtok avec le nouveau plugin mysql.
Car onplayerlogin ne marche pas aussi, il ne charge pas les données.
Voici le code d'origine :
samp_mysql_strtok(Fields, "|", Data);
while (samp_mysql_strtok(Fields, "|", "")==1)
{
Pour remplacer ce code j'ai fait :
while(mysql_fetch_row(Data)==1)
{
Je sait que sait foireux mais je sait pas comment remplacer cette fonction qui n'est plus sur le nouveau plugin
Au pire si quelqu'un peut m'aider par msn ou autre sa serai sympa :D.
Ou alors si vous avez un autre système de sauvegarde joueur par sql je suis prenant (mis a part Modern Topia)
Merci pour vos aides.
EDIT : Probleme résolut a lock,
Le problème venait de l'ancien système de modern topia.
J'ai refait le système de save et load entierement et sa a marcher je me suis appuyer de plusieur exemple de script SQL tel que Radmin et d'autre.
Merci a tous ceux qui m'ont répondu et donner des conseils.
++ Darkrevan
-
Et voilà un code vite fait, MAL fait ... avec plein de petit bout de code ... VOLÉ à droite, à gauche.
-
Hum hum ce code si tu l'aurai lu a était refait entièrement, et si tu m'aurai un peu plus aidé j'aurai peut être fait mieux...
Je te signale aussi que c'était le gros foutoirs pendant que j'essaye plusieurs truc en même donc normal que sa te paraissent mal fait.
-
À partir du moment où tu prends à gauche à droite, tu n'as pas tous refait.
Et selon ton raisonnement, si tu serais seul, tu ne pourrait RIEN faire ?
Apprend à vraiment programmer ou change d'objectif, car tu n'es pas fait pour ça si c'est ta vision des choses.
-
Le problème est résolu ? si oui on stop le HS ;)
-
J'ai dit que je l'est refait, donc un système sql que j'ai fait moi même pas en piquant un bout a gauche ou a droite, J'ai réussit a bien comprendre le SQL pour refaire mon propre système enregistrement et de chargement de donnée.
Bref vous pouvez lock.