Français Solved Manipulation des données avec des requêtes SQL en SQF

  • Auteur de la discussion Auteur de la discussion MaxenceL
  • Date de début Date de début

MaxenceL

User
29/12/19
44
1
1
300
Hello !

Ayant déjà pas mal de base dans le SQF en local, je cherche à faire des choses simples pour commencer à prendre en main le code avec des données en DB à update, insert et select.
Je cherche sortir les valeurs d'une date de naissance avec le jour, le numéro, le mois et l'année.

Je souhaite mettre manuellement une date de naissance dans la BDD avec une execution unique, puis je souhaite retourné les valeurs de la date de naissance sous forme d'array pour les avoir dans un hint.

Voici les deux fichiers créer :

LifeServer : https://pastebin.com/F9K9rJ64
Client : https://pastebin.com/VQw2fGSf

Lors de la connexion, il m'affiche configuration du client. Je précise encore que je débute dans les donnée BDD et le global, donc les fonctions remoteExec et query sont encore floues ^^

Merci de votre aide :D
 
Solution
Ah mais pourquoi il y a des [] dans la _query ? J'ai même pas fait attention 😅

Il faut le faire comme ça :
Code:
_query = "SELECT ...";
ou comme ça :
Code:
_query = format ["SELECT ... WHERE ... ='%1'",_variable];

J'ai update ma réponse au dessus pour corriger ça :)
Pour la DB ça me semble bon
Hello !
Je suppose que la date de naissance est liée à un joueur ? Il faudra utiliser WHERE dans ta requête SELECT pour récupérer les données d'un joueur en particulier.

Sinon, ceci n'existe pas :
Code:
_annee = publicVariable getVariable ["DateAnnee"];
Il faut plutôt le faire comme ça :
Code:
_annee = DateAnnee;

Cependant, une publicVariable est commune à tous les joueurs, et je suppose qu'ils n'auront pas tous la même date de naissance du coup il n'y a pas besoin de la rendre publique.
Et si tu as toujours le problème en jeu, il faudrait nous envoyer tes logs client pour voir s'il y a une erreur :)
 
J'avoue que je n'avais pas fait attention à ces lignes, je me préoccupais du life_server qui me posais problème, j'avais simplement oublié de remettre mon init.sqf comme un ***...
Code:
_annee = publicVariable getVariable ["DateAnnee"];

Conçernant le lancement du script sur le life_server, ça marche avec ça dans l'init de la racine de la mission ?
Code:
[] call compile preprocessFileLineNumbers "\life_server\Functions\Script\fn_ScriptLifeServer.sqf";

Ensuite côté life_server je pense que le code ne fonctionne pas, lorsque je lance le script avec la ligne ci-dessus, mon serveur ne se lance pas et reste bloqué dans l'image "ArmaIII" sachant que pour le moment je ne cherche pas le WHERE car j'essaye juste avec une date et pas plusieurs ^^
Code:
_query = ["SELECT jour, numero, mois, annee FROM date"];
_queryResult = [_query,2] call DB_fnc_asyncCall;


DateJour = _queryResult select 0;
DateNumero = _queryResult select 1;
DateMois = _queryResult select 2;
DateAnnee = _queryResult select 3;


publicVariable "DateJour";
publicVariable "DateNumero";
publicVariable "DateMois";
publicVariable "DateAnnee";

Le script local fonctionne correctement après correction, je retrouve les valeurs "any" car je n'arrive pas à executer le script dans le life_server.

J'ai bien essayer de comprendre comment fonctionne les remoteExec, mais c'est toujours la même bouilli pour moi lol, et je veux que le script s'exécute au démarrage du serveur par le serveur et pas par un joueur.
 
Dernière édition:
En mettant des publics variable, celà veut dire que la variable, sera la même pour tous les joueurs ainsi que pour le serveur. Je pense que tu veux utiliser une variable global. et pour celà, pas besoin de la déclarer en public, seulement de la déclarer :
dateJour = _queryResult #0;

Tiens je t'ai fait ça, c'est un petit exemple, en espérant que tu comprendra :D
 
Le but étant que la variable soit défini en public pour le moment histoire de faire simple au début pour comprendre déjà à insert et select des données BDD vers le client ^^ Je rechercherai plus tard pour mettre des variables uniques pour chaque client si besoin mais j'avais déjà l'idée de faire comme tu as fais :)

Si je comprend bien, j'ai simplement oublié de faire un remoteExec vers le joueur depuis le script life_server jusque dans la mission ? Mais c'est vraiment que ça qui pose problème et qui fait crash le serveur ? Car c'est uniquement quand j'exécute le script du life_server que le serveur ne démarre pas et crash, si je ne démarre pas le script, aucun problème tout fonctionne bien.

Par contre niveau remoteExec, comment je peux faire pour faire un call d'un array car tout mes scripts sont dans un fichier unique sous forme :
Code:
SCRIPT_1 = {
    [] spawn {
    };
};

SCRIPT_2 = {
    [] spawn {
    };
};

En gros c'est vraiment histoire d'apprendre la base, donc l'idée c'est de faire un hint qui indique des infos de la BDD, vu que c'est la base des bases je ne cherche pas à faire ça pour plusieurs joueurs ^^ Si tu préfère, j'insert une date genre 14/02/2025 dans la base de donnée, et on viendra hint cette date en jeu :) C'est vraiment la façon de récupérer les infos qui m'intéresse car j'arrive déjà à les insérer, et comme je comprend rien même avec le wiki au remoteExec, c'est un peu tendu pour moi ^^

EDIT : Je viens de mettre le remoteExec vers un fichier différent (fn_scripttest.sqf) pour test, le serveur ne démarre toujours pas ^^
 
Dernière édition:
Oui, aucune erreur, c'est vraiment le déclenchement du script du life server qui me fait crash le serveur..

Les logs affiche les erreurs des mods et il crash direct, et sans le déclenchement du script dans le life_server il démarre niquel
 
Dernière édition:
Code:
_query = ["SELECT jour, numero, mois, annee FROM date WHERE actif='1'"];
_queryResult = [_query,2] call DB_fnc_asyncCall;


DateJour = _queryResult select 0;
DateNumero = _queryResult select 1;
DateMois = _queryResult select 2;
DateAnnee = _queryResult select 3;


publicVariable "DateJour";
publicVariable "DateNumero";
publicVariable "DateMois";
publicVariable "DateAnnee";

[_queryResult] remoteExec ["life_fnc_calendrier",0];
 
Je ne vois pas pourquoi le remoteExec ferait crash un serveur :unsure:

Personnellement ce que j'aurais fait, à la fin du life_server.sqf/init.sqf, ajouter ça :
Code:
_query = "SELECT jour, numero, mois, annee FROM date WHERE actif='1'";
_queryResult = [_query,2] call DB_fnc_asyncCall;

DateJour = "Lundi";
DateNumero = 1;
DateMois = "Janvier";
DateAnnee = 2021;

if ((count _queryResult) >= 1) then {
    DateJour = _queryResult select 0;
    DateNumero = _queryResult select 1;
    DateMois = _queryResult select 2;
    DateAnnee = _queryResult select 3;
};

publicVariable "DateJour";
publicVariable "DateNumero";
publicVariable "DateMois";
publicVariable "DateAnnee";
Et pour le hint il suffit de faire ça, dans l'action d'un bouton, dans un script peut importe :
Code:
hint format ["%1 %2 %3 %4",DateJour,DateNumero,DateMois,DateAnnee];
 
Dernière édition:
Après plusieurs expérience, c'est pas le fichiers ou le remoteExec mais la récupération des datas :)

Si j'enlève ces lignes le serveur démarre :
Code:
_query = ["SELECT jour, numero, mois, annee FROM date WHERE actif='1'"];
_queryResult = [_query,2] call DB_fnc_asyncCall;

Du coup je pense que c'est moi qui à un soucis avec la BDD et la création de la table, si c'est possible de me faire un exemple d'un code SQL à exécuter directement dans l'interface PHPmyAdmin ? ^^

Et si c'est possible de faire un petit topo sur le fonctionnement des valeurs INT, VARCHAR, etc.. lors de la création de la BDD, ce serait top et ça aiderai pas mal de monde je pense ^^ Je regarde sur le Docs.Microsoft mais j'avoue que c'est la merde à comprendre lol
 
C'est toutes les structures de données qu'il existe, tu peux avoir le détail ici (en Anglais comme beaucoup de documentations) : https://www.w3schools.com/sql/sql_datatypes.asp
Mais en gros les principaux c'est : INT, VARCHAR, TEXT, TIMESTAMP

Sinon pour la table, personnellement j'aurais fait un truc comme ça :
Code:
CREATE TABLE `date` (
  `id` INT(6) NOT NULL AUTO_INCREMENT,
  `jour` text NOT NULL,
  `numero` int(11) NOT NULL,
  `mois` text NOT NULL,
  `annee` int(11) NOT NULL,
  `actif` int(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Et pour les données dedans :
Code:
INSERT INTO `date` (`id`, `jour`, `numero`, `mois`, `annee`, `actif`) VALUES (NULL, '\"Lundi\"', '1', '\"Février\"', '2021', '1');
 
Ah oui beaucoup mieux pour la documentation, merci ! :D

Bon, ça fonctionne toujours pas, je comprend vraiment rien là !! Le serveur fonctionne très bien sans ça :
Code:
_query = ["SELECT jour, numero, mois, annee FROM date WHERE id='1'"];
_queryResult = [_query,2] call DB_fnc_asyncCall;

Il y a quelques choses que j'ai loupé ? J'ai plus d'idée pour la suite là ^^

Dans la BDD j'ai mis ça car je veux que des chiffres :
Code:
CREATE TABLE `date` (
  `id` INT(6) NOT NULL AUTO_INCREMENT,
  `jour` int(11) NOT NULL,
  `numero` int(11) NOT NULL,
  `mois` int(11) NOT NULL,
  `annee` int(11) NOT NULL,
  `actif` int(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
Dernière édition:
Ah mais pourquoi il y a des [] dans la _query ? J'ai même pas fait attention 😅

Il faut le faire comme ça :
Code:
_query = "SELECT ...";
ou comme ça :
Code:
_query = format ["SELECT ... WHERE ... ='%1'",_variable];

J'ai update ma réponse au dessus pour corriger ça :)
Pour la DB ça me semble bon
 
Solution
Bonjour ! Désolé de la réponse tardive..

Tout fonctionne bien maintenant, le problème était bien les [ ] du _query ! Merci bien de l'aide et de la documentation :D