GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Jcvag44800 le 01 Mai 2014, 16:04:52

Titre: Problème requête SQL
Posté par: Jcvag44800 le 01 Mai 2014, 16:04:52
Bonjour,

Voici ma requête SQL:

format(string, sizeof(string), "UPDATE players_stats SET PlayerLevel=%d,AdminLevel=%d, StatusRp=%d, Registered=%d,Sex=%d,Origin=%d,Muted=%d,Money=%d,Bank=%d,Pret=%d,Phonebook=%d,SuspendedTime=%d,Swat=%d,Job=%d,PayCheck=%d,Jailed=%d,JailTime=%d,Drugs=%d,Member=%d,Rank=%d,Chara=%d,pHealth=%f,Inte=%d WHERE id=%d",
PlayerInfo[playerid][pLevel],
PlayerInfo[playerid][pAdmin],
PlayerInfo[playerid][pStatusRp],
PlayerInfo[playerid][pReg],
PlayerInfo[playerid][pSex],
PlayerInfo[playerid][pOrigin],
PlayerInfo[playerid][pMuted],
PlayerInfo[playerid][pCash],
PlayerInfo[playerid][pAccount],
PlayerInfo[playerid][pPret],
PlayerInfo[playerid][pPhoneBook],
PlayerInfo[playerid][pSuspendedTime],
PlayerInfo[playerid][pSwat],
PlayerInfo[playerid][pJob],
PlayerInfo[playerid][pStealCheck],
PlayerInfo[playerid][pJailed],
PlayerInfo[playerid][pJailTime],
PlayerInfo[playerid][pDrugs],
PlayerInfo[playerid][pMember],
PlayerInfo[playerid][pRank],
PlayerInfo[playerid][pChar],
PlayerInfo[playerid][pHealth],
PlayerInfo[playerid][pInt],
PlayerInfo[playerid][pSQLID]);
MySQLCheckConnection();
    mysql_query(string);

Elle est censée sauvegarder les variables ci-dessous, mais rien du tout...

Avez vous une idée ?
Titre: Re : Problème requête SQL
Posté par: GtaManiac le 01 Mai 2014, 16:31:34
Salut,

Tu as des erreurs de syntaxe à la fin de ta requête, tu as mis une virgule et tu ne ferme pas la parenthèse.

Change :

Code: (mysql) [Sélectionner]
WHERE id=%d",
Par :

Code: (mysql) [Sélectionner]
WHERE id=%d");
Mais normalement pawno te retourne les erreurs non ? tu aurais du t'en apercevoir tout seul, c'est comme en php, quand il y a un soucis de syntaxe ça n'affiche rien et/ou ne fait rien car il ne comprends pas.
Titre: Re : Problème requête SQL
Posté par: Infu le 01 Mai 2014, 16:38:00
Ce n'est pas ça l'erreur Maniac, il a laissé une virgule car sa fonction n'était pas terminée. Mais si je me trompe pas c'est une histoire d'Anti-slash ... Car il fait ça sous forme de liste, et pas à la suite.
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 01 Mai 2014, 16:40:57
Salut, merci pour vos réponses  :laugh:

Oui, c'est codé sous forme de liste :)
Titre: Re : Problème requête SQL
Posté par: Ssk le 01 Mai 2014, 16:55:59
Salut, tu utilises quel plugin SQL ?
Titre: Re : Problème requête SQL
Posté par: GtaManiac le 01 Mai 2014, 17:01:06
Ah ok d'accord je pensais pas que c'était différent sous pawn.

Tu as bien mit un : new string [valeur] avant ton format ? et pourquoi il y a un double apostrophe avant ta liste, c'est spécifique au pawn ?



Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 01 Mai 2014, 17:07:42
Le " (accompagné d'un deuxième "), c'est pour délimité la commande SQL :)
J'utilise a_mysql
Titre: Re : Problème requête SQL
Posté par: GtaManiac le 01 Mai 2014, 17:44:21
Tu peux nous montrés ton code avant la requête ?

Et rajoute (si ça n'est pas déjà fait) :

Code: (mysql) [Sélectionner]
mysql_debug(1);
Il devrait normalement te dire ce qui cloche.
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 01 Mai 2014, 19:07:38
Code: (pawn) [Sélectionner]
public OnPlayerUpdateSQL(playerid)
{
if(IsPlayerConnected(playerid))
{
    if(PlayerInfo[playerid][pReg]==0) {return 1;}
if(gPlayerLogged[playerid])
{
MySQLCheckConnection();
new string[512];
//SQLLog(query);
if(PlayerInfo[playerid][pHealth] < 2.0) PlayerInfo[playerid][pHealth] = 20.0;

Voila le début de mon code.
J'ai mis le mysql_debug(1); et j'ai pas mal de ligne que je comprends. Mais que dois-je faire ?

NB: j'ai créer une commande qui éxecute la callback qui sauvegarde les données des joueurs, et voici la ligne qui me concerne:

Code: (txt) [Sélectionner]
[19:29:06] CMySQLHandler::Query(UPDATE players_stats SET Roop=0,Baillon=0,Jerrican=0,Confiserie=0,Adrenaline=0,Cigarettes=0,Feuilles=0,Tabac=0,Connected=1,Talkie=1,CarKeyOffer=9999,OfferTime=-1,Wanted=0,Ip='127.0.0.1',CombatStyle=3,Journal=0,Parrain=-1,Email='[email protected]',De=0,Bombe=0,BoomBox=0,Cheque=0 WHERE ID=1055) - An error has occured. (Error ID: 1054, Unknown column 'BoomBox' in 'field list')
En occurrence, ça a l'air de marcher...

Titre: Re : Problème requête SQL
Posté par: GtaManiac le 01 Mai 2014, 21:58:51
Utiliser la balise

Code: (text) [Sélectionner]
[code=pawn] ou [code=mysql]

Parce-que ça pique un peu les yeux.

Le debug est la pour te montrer les erreurs en logeant les actions, ça a peut être l'air de marcher comme tu dis mais tu as une erreur dans la liste des champs, ta requête est donc invalide et n'effectuera pas en théorie l'update ce qui est apparemment le cas ici et en l’occurrence comme mentionner par le log du debug, la colonne "BoomBox" est inconnu.

Généralement avec ce type d'erreur, c'est qu'il manque une colonne dans ta table players_stats, tu as peut être oublié de la créer :smile:
Titre: Re : Problème requête SQL
Posté par: Xolokos le 02 Mai 2014, 18:54:05
La colonne BoomBox n'existe pas va la créer ou vérifie si c'est pas un autre nom.
Code: (SQL) [Sélectionner]
ALTER TABLE `players_stats` ADD `BoomBox` INT(nb)
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 06 Mai 2014, 11:56:03
Salut,

Oui c'était ça en effet, merci  :biggrin:
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 07 Mai 2014, 12:00:35
Une autre question ou je dois créer un autre sujet ?

J'ai un problème avec cette ligne:

format(query, 300, "UPDATE players SET %s=%f WHERE id=%d", sqlvalname, sqlupdateflo, sqlplayerid);
mysql_query(query);

Quand je compile, il me dit "tag mismatch"... J'ai regardé pas mal de fois sur le wiki et je ne vois pas ce qui cloche...

http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_query (http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_query)

Merci à vous
Titre: Re : Problème requête SQL
Posté par: Ssk le 07 Mai 2014, 12:23:02
Tu utilise quelle version du plugin ?
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 07 Mai 2014, 12:41:23
La toute dernière, la R38
Titre: Re : Problème requête SQL
Posté par: Ssk le 07 Mai 2014, 12:43:59
Les dernières versions sont faites pour le multi-threading.

"NOTE: DON'T USE VERSION R7 OR ABOVE IF YOU HAVE NO IDEA WHAT THREADING MEANS OR HOW IT WORKS. YOU MIGHT HARM YOUR SERVER WHEN USING IT NOT PROPERLY."


Utilise la version R6, ça marchera mieux.

http://forum.sa-mp.com/showthread.php?t=56564 (http://forum.sa-mp.com/showthread.php?t=56564)
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 07 Mai 2014, 15:14:22
Ca marche merci ;)

Mais je dois être chiant...
Voici mon code:

Code: (pawn) [Sélectionner]
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_DB   "larp2"


forward MySQLConnect(sqlhost[], sqluser[],  sqldb[], sqlpass[]);

MySQLConnect(MYSQL_HOST,MYSQL_USER,MYSQL_DB,MYSQL_PASS);

public MySQLConnect(sqlhost[], sqluser[], sqldb[], sqlpass[])
{
print("Connexion à la base de données..."); // Connecting to the database
if(mysql_connect(sqlhost,sqluser,sqldb,sqlpass))
{
    print("Connexion à la base de données réussie."); // success
    return 1;
}
else
{
    print("Connexion à la base de données échouée."); // !success
    if(mysql_connect(sqlhost,sqluser,sqldb,sqlpass))
    {
        print("Connexion à la base de données rétablie."); // success
        return 1;
}
else
{
    print("Connexion à la base de données perdue. Le serveur est eteint."); // close server
    SendRconCommand("exit");
    return 0;
}
}
}

Et voici les logs:

Serveur SQL fermé:

[13:44:51] CMySQLHandler::CMySQLHandler() - constructor called.

[13:44:51] CMySQLHandler::CMySQLHandler() - Connecting to "localhost" | DB: "larp2" | Username: "root" ...

[13:44:52] CMySQLHandler::Connect() - Can't connect to MySQL server on 'localhost' (10061) (Error ID: 2003)


Serveur SQL ouvert:

[13:42:29] CMySQLHandler::CMySQLHandler() - constructor called.

[13:42:29] CMySQLHandler::CMySQLHandler() - Connecting to "localhost" | DB: "larp2" | Username: "root" ...

[13:42:29] CMySQLHandler::Connect() - Connection was successful.

[13:42:29] CMySQLHandler::Connect() - Auto-Reconnect has been enabled.

Le problème: que le serveur mysql soit ouvert ou fermé, mon GM dira toujours que la connexion a été établie.
Or, dans les logs ce n'est pas le cas...
Je ne vois pas où ça coince =(

Merci d'avance
Titre: Re : Problème requête SQL
Posté par: Ssk le 07 Mai 2014, 16:00:02
Personnellement je fais comme ça


Code: (pawn) [Sélectionner]
forward ConnectToDatabase();
public ConnectToDatabase()
{
if(g_iMysqlConnection == 0)
{
g_iMysqlConnection = mysql_connect("localhost", "XXXXX", "XXXXX", "XXXXX");
}
else
{
mysql_reconnect(g_iMysqlConnection);
}

if(mysql_ping() == -1)
{
Error("Unable to connect to MySQL server.", 0);
Error("Retrying ...", 0);
SetTimer("ConnectToDatabase", 5000, 0);
}
else
{
Debug("Connected to MySQL server.", 0);
}
}
Titre: Re : Problème requête SQL
Posté par: Jcvag44800 le 07 Mai 2014, 16:09:30
D'accord,

J'ai donc fait comme ça, et ça marche:

Code: (pawn) [Sélectionner]
public MySQLConnect(sqlhost[], sqluser[], sqldb[], sqlpass[])
{
        print("Connexion à la base de données..."); // Connecting to the database
        mysql_connect(sqlhost,sqluser,sqldb,sqlpass);
        if(mysql_ping() == -1)
        {
print("Connexion à la base de données échouée."); // !success
            if(mysql_ping() == -1)
            {
print("Connexion à la base de données perdue. Le serveur est eteint."); // close server
    SendRconCommand("exit");
                return 0;

            }
            else
            {
                print("Connexion à la base de données rétablie."); // success
                return 1;
            }

        }
        else
        {
            print("Connexion à la base de données réussie."); // success
            return 1;
        }
}
Titre: Re : Problème requête SQL
Posté par: Infu le 07 Mai 2014, 18:10:41
Je comprends mieux pourquoi j'ai jamais réussi à m'en servir  :laugh: