1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Downloads
  4. Galerie
    1. Alben
  5. Toolbox
    1. Passwort Generator
    2. Portchecker
  6. Mitglieder
    1. Mitgliedersuche
    2. Benutzer online
    3. Trophäen
    4. Team
Fr: 16 Mai 2025
  • Anmelden oder registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Forum
  • Dateien
  • Seiten
  • Bilder
  • Erweiterte Suche

Schön, dass du den Weg zu NodeZone.net gefunden hast! Aktuell bist du nicht angemeldet und kannst deshalb nur eingeschränkt auf unsere Community zugreifen. Um alle Funktionen freizuschalten, spannende Inhalte zu entdecken und dich aktiv einzubringen, registriere dich jetzt kostenlos oder melde dich mit deinem Account an.

Anmelden oder registrieren
    1. Nodezone.net Community
    2. Forum
    3. Gameserver & Hosting
    4. ArmA Series - ArmA 3 / Reforger
    5. Hilfeforum

    Error Nicht definierte Variable in Ausdruck: db_fnc_asynccall

      • Altis Life
    • Harry Knueller
    • 7. Juni 2023 um 08:00
    • Erledigt
    • Harry Knueller
      Frischling
      Reaktionen
      1
      Trophäen
      5
      Beiträge
      20
      • 7. Juni 2023 um 08:00
      • #1

      Moin Moin,

      ich bin sonst eigentlich hier nur der stille Mitleser, aber aktuell stehe ich irgendwie auf dem Schlauch... ein simples Datenbankupdate raubt mir zur Zeit den Nerv.

      Möchte gerne folgende Funktion für das DB Update nutzen, da diese auch in sämtlichen anderes Scripts ohne Probleme genutzt wird... Da ich dachte, ich hätte irgendwas bei den Variablen vertauscht, habe ich mir die Variablen im SystemChat ausgegeben - Das passt soweit alles. :/

      Code
      _query = format ["UPDATE vehicles SET chip='%3' WHERE pid='%1' AND plate='%2'",_owner , _plate, _chip];
      
      _thread = [_query,2] call DB_fnc_asyncCall;



      Das komplette Script:

      Code: fn_tuningkit_V4.sqf
      #include "..\..\script_macros.hpp"
      /*
      File: fn_tuningkit_V4.sqf
      Author: Harry Knueller
      
      Description:
      Tuningchip for edit acceleration and maxspeed.
      */
      private ["_vehicle","_chip","_thread","_cpRate","_title","_progressBar","_titleText","_cp","_ui","_plate","_owner"];
      
      _vehicle = cursorObject;
      _vehInfo = _vehicle getVariable ["dbinfo",[]];
      _vehChip = _vehicle getVariable ["chip",[]];
      _owner = _vehInfo select 0;
      _plate = _vehInfo select 1;
      
      if (isNull cursorObject) exitWith {["Aktion","Wo soll der Chip eingebaut werden?","error"] spawn cplus_notification_fnc_notification;};
      if (player distance _vehicle > 5) exitWith {["Aktion","Du bist zu weit vom Fahrzeug weg!","error"] spawn cplus_notification_fnc_notification;};
      if (!(_vehicle isKindOf "car")) exitWith {["Aktion","Der Chip kann nicht an diesem Fahrzeugtypen angebracht werden!","error"] spawn cplus_notification_fnc_notification;};
      if (count _vehInfo isEqualTo 0) exitWith {["Aktion","Der Chip kann nicht an einem Mietfahrzeug angebracht werden!","error"] spawn cplus_notification_fnc_notification;};
      //if (playerSide in [independent, west]) exitWith {["Aktion","Du kannst diesen Chip nicht verwenden!","error"] spawn cplus_notification_fnc_notification;};
      if (!(_owner isEqualto getPlayerUid player)) exitWith {["Aktion","Das ist nicht dein Fahrzeug!","error"] spawn cplus_notification_fnc_notification;};
      if (!(alive _vehicle)) exitWith {["Aktion","Das Fahrzeug ist zerstört","error"] spawn cplus_notification_fnc_notification;};
      if (_vehChip > 0) exitWith {["Aktion","Du musst den bereits montierten Chip ausbauen!","error"] spawn cplus_notification_fnc_notification;};
      if (life_inv_tuningkit_V4 < 1) exitWith {["EXPLOIT","Bugusing ist strengstens verboten!","error"] spawn cplus_notification_fnc_notification;};
      
      life_action_inUse = true;
      
      disableSerialization;
      _title = "Chip wird montiert...";
      "progressBar" cutRsc ["life_progress","PLAIN"];
      _ui = uiNamespace getVariable "life_progress";
      _progressBar = _ui displayCtrl 38201;
      _titleText = _ui displayCtrl 38202;
      _titleText ctrlSetText format ["%2 (1%1)...","%",_title];
      _progressBar progressSetPosition 0.01;
      _cP = 0.01;
      _cpRate = 0.0036;
      
      
      for "_i" from 0 to 1 step 0 do {
      if (animationState player != "AinvPknlMstpSnonWnonDnon_medic_1") then {
      [player,"AinvPknlMstpSnonWnonDnon_medic_1",true] remoteExecCall ["life_fnc_animSync",RCLIENT];
      player switchMove "AinvPknlMstpSnonWnonDnon_medic_1";
      player playMoveNow "AinvPknlMstpSnonWnonDnon_medic_1";
      };
      uiSleep 0.18;
      if (isNull _ui) then {
      "progressBar" cutRsc ["life_progress","PLAIN"];
      _ui = uiNamespace getVariable "life_progress";
      _progressBar = _ui displayCtrl 38201;
      _titleText = _ui displayCtrl 38202;
      };
      _cP = _cP + _cpRate;
      _progressBar progressSetPosition _cP;
      _titleText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_title];
      if (_cP >= 1 || !alive player) exitWith {};
      if (life_istazed) exitWith {};
      if (life_isknocked) exitWith {};
      if (life_interrupted) exitWith {};
      };
      
      "progressBar" cutText ["","PLAIN"];
      player playActionNow "stop";
      if (!alive player || life_istazed || life_isknocked) exitWith {};
      if (player getVariable ["restrained",false]) exitWith {};
      if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;};
      
      life_action_inUse = false;
      
      _vehicle setVariable ["chip",4,true];
      
      [false,"tuningkit_V4",1] call life_fnc_handleInv;
      ["Aktion","Du hast den Chip am Fahrzeug montiert!","success"] spawn cplus_notification_fnc_notification;
      
      _chip = _vehicle getVariable ["chip",[]];
      
      systemChat format["UID: %1 - Kennzeichen: %2 - Chip: %3", _owner, _plate, _chip];
      
      _query = format ["UPDATE vehicles SET chip='%3' WHERE pid='%1' AND plate='%2'",_owner , _plate, _chip];
      
      _thread = [_query,2] call DB_fnc_asyncCall;
      Alles anzeigen


      .rpt - Ausschnitt

      Code
      _thread = [_query,2] call DB_fnc_asyncCall;>
      7:48:42   Error position: <DB_fnc_asyncCall;>
      7:48:42   Error Nicht definierte Variable in Ausdruck: db_fnc_asynccall
      7:48:42 File mpmissions\__CUR_MP.Altis\core\items\fn_tuningkit_V4.sqf..., line 78

      Ich hoffe, ihr könnt mir weiter helfen.

      Liebe Grüße

      Dateien

      Arma3_x64_2023-06-07_07-16-40.rpt 125,23 kB – 86 Downloads
    • Henne
      Nerd
      Reaktionen
      155
      Trophäen
      7
      Beiträge
      840
      Bilder
      7
      • 7. Juni 2023 um 08:45
      • #2

      Dein Script befindet sich in der Mission und wird Clientseitig ausgeführt. Du möchtest dann aber eine Funktion aufrufen, die sich nur Serverseitig befindet und somit der Client nicht kennt. Daher kommt richtigerweiße eine Fehlermeldung.

      Du musst also dem Server mitteilen, dass er die Funktion aufrufen soll. Das ist mit remoteExec möglich.

      Nach dem ändern der Zeile, sollte alles richtig funktionieren.

    • Harry Knueller
      Frischling
      Reaktionen
      1
      Trophäen
      5
      Beiträge
      20
      • 7. Juni 2023 um 08:50
      • #3
      Zitat von Henne

      Dein Script befindet sich in der Mission und wird Clientseitig ausgeführt. Du möchtest dann aber eine Funktion aufrufen, die sich nur Serverseitig befindet und somit der Client nicht kennt. Daher kommt richtigerweiße eine Fehlermeldung.

      Du musst also dem Server mitteilen, dass er die Funktion aufrufen soll. Das ist mit remoteExec möglich.

      Nach dem ändern der Zeile, sollte alles richtig funktionieren.

      Vielen Dank für die super schnelle Rückmeldung. Was mich jetzt aber nach deiner Aussage wundert, ist das die anderen Scripts ohne remoteExec laufen - Ich bin etwas verwirrt.

      Ich teste es schnell und werde gleich berichten !

    • thechosen1one1
      Anfänger
      Reaktionen
      19
      Beiträge
      58
      Dateien
      1
      Bilder
      2
      • 7. Juni 2023 um 09:16
      • #4

      Oder einfach _query oben in private []; hinzufügen? :D

      private ["_vehicle","_chip","_thread","_cpRate","_title","_progressBar","_titleText","_cp","_ui","_plate","_owner","_query"];

      Außerdem hat Henne recht, du solltes die query in eine andere Datei packen, die serverseitig ausgeführt wird sonst wird das nix

      Einmal editiert, zuletzt von thechosen1one1 (7. Juni 2023 um 09:22)

    • Harry Knueller
      Frischling
      Reaktionen
      1
      Trophäen
      5
      Beiträge
      20
      • 7. Juni 2023 um 09:27
      • #5
      Zitat von Henne

      Dein Script befindet sich in der Mission und wird Clientseitig ausgeführt. Du möchtest dann aber eine Funktion aufrufen, die sich nur Serverseitig befindet und somit der Client nicht kennt. Daher kommt richtigerweiße eine Fehlermeldung.

      Du musst also dem Server mitteilen, dass er die Funktion aufrufen soll. Das ist mit remoteExec möglich.

      Nach dem ändern der Zeile, sollte alles richtig funktionieren.

      Code
      _query = format ["UPDATE vehicles SET chip='%3' WHERE pid='%1' AND plate='%2'",_owner , _plate, _chip];
      _thread = [_query,2] remoteExec ['DB_fnc_asyncCall',2];

      Jetzt ist der Scriptfehler zwar weg, aber kein Datenbankupdate - Jetzt herrscht komplette Verwirrung ?(^^

      Zitat von thechosen1one1

      Oder einfach _query oben in private []; hinzufügen? :D

      private ["_vehicle","_chip","_thread","_cpRate","_title","_progressBar","_titleText","_cp","_ui","_plate","_owner","_query"];

      Hat nichts geändert...

    • Henne
      Nerd
      Reaktionen
      155
      Trophäen
      7
      Beiträge
      840
      Bilder
      7
      • 7. Juni 2023 um 09:29
      • #6
      Zitat von thechosen1one1

      Oder einfach _query oben in private []; hinzufügen? :D

      private ["_vehicle","_chip","_thread","_cpRate","_title","_progressBar","_titleText","_cp","_ui","_plate","_owner","_query"];

      Mach es nicht. -> private-Performance

      Man sollte sowieso den besseren Syntax verwenden.

      SQF hat aber kein Problem damit, wenn man eine Variable nicht mit private deklariert, da durch "_" die Variable automatisch private wird.


      Zitat von Harry Knueller

      Vielen Dank für die super schnelle Rückmeldung. Was mich jetzt aber nach deiner Aussage wundert, ist das die anderen Scripts ohne remoteExec laufen - Ich bin etwas verwirrt.

      Ich teste es schnell und werde gleich berichten !

      Liegt daran, weil es dann auf dem Server ausgeführt wird und der Server die Funktion kennt.

    • Henne
      Nerd
      Reaktionen
      155
      Trophäen
      7
      Beiträge
      840
      Bilder
      7
      • 7. Juni 2023 um 09:31
      • #7
      Zitat von Harry Knueller

      Jetzt ist der Scriptfehler zwar weg, aber kein Datenbankupdate - Jetzt herrscht komplette Verwirrung ?(^^

      Dann schau mal in die Serverlog was dort ausgegeben wird.

      Vor allem auch in die extDB-Log.

    • Harry Knueller
      Frischling
      Reaktionen
      1
      Trophäen
      5
      Beiträge
      20
      • 7. Juni 2023 um 09:33
      • #8
      Zitat von Henne

      Dann schau mal in die Serverlog was dort ausgegeben wird.

      Vor allem auch in die extDB-Log.

      Bin im Serverlog fündig geworden:

      Code
      2023/06/07,  9:25:38 Scripting function 'db_fnc_asynccall' is not allowed to be remotely executed
      2023/06/07,  9:25:38 User Harald Knueller (76561198255301431) tried to remoteExec a disabled function
    • Henne
      Nerd
      Reaktionen
      155
      Trophäen
      7
      Beiträge
      840
      Bilder
      7
      • 7. Juni 2023 um 09:37
      • #9

      Führst du denn bisher schon Datenbank-Abfragen Clientseitig aus, oder wie machst du es bisher?

      Dann schau wie es bisher funktioniert, oder gib die Funktion für remoteExec frei. Wobei dies normal mit guter Absicht nicht freigeschaltet ist.

      Ansonsten kannst du eine weitere Funktion Serverseitig erstellen (nur mit dem Aufruf der Datenbank-Funktion), die du per remoteExec aufrufst, die dann die wirkliche Datenbank-Abfrage durchführt. Somit kann nicht jeder alles an die Datenbank senden.

    • Harry Knueller
      Frischling
      Reaktionen
      1
      Trophäen
      5
      Beiträge
      20
      • 7. Juni 2023 um 10:06
      • #10
      Zitat von Henne

      Ansonsten kannst du eine weitere Funktion Serverseitig erstellen (nur mit dem Aufruf der Datenbank-Funktion), die du per remoteExec aufrufst, die dann die wirkliche Datenbank-Abfrage durchführt. Somit kann nicht jeder alles an die Datenbank senden.


      Das hatte ich zwischen durch auch mal probiert aber wieder verworfen... hätte ich man nochmal in den Serverlog reingeguckt, dann hätte ich gesehen das ich die Abfrage nur hätte freigeben müssen.dash

      Habs jetzt wie folgt gelöst und funktioniert, dank deiner Hilfe !

      Code: fn_tuningkit_V4.sqf
      [...]
      
      [_owner, _plate, _chip] remoteExecCall ["TON_fnc_updateVehChip", 2];
      Code: fn_updateVehChip.sqf
      private["_query", "_queryResult"];
      params [
      ["_pid", -1, [0,""]],
      ["_plate", -1, [0,""]],
      ["_chip", -1, [0,""]]
      ];
      
      
      private _query = format ["UPDATE vehicles SET chip='%3' WHERE pid='%1' AND plate='%2'",_pid , _plate, _chip];
      private _queryResult = [_query,2] call DB_fnc_asyncCall;
      Code: config.cpp
      class TON_System {
      tag = "TON";
      class Systems {
      file = "\life_server\Functions\Systems";
      [...]
      class updateVehChip{};
      Code: CfgRemoteExec.hpp
      F(TON_fnc_updateVehChip,SERVER)
    • Harry Knueller
      Frischling
      Reaktionen
      1
      Trophäen
      5
      Beiträge
      20
      • 7. Juni 2023 um 10:19
      • #11

      Erledigt

    • Henne
      Nerd
      Reaktionen
      155
      Trophäen
      7
      Beiträge
      840
      Bilder
      7
      • 7. Juni 2023 um 10:27
      • #12

      Sehr gut das du es hinbekommen hast. :thumbup:

    • DragonGER
      Gast
      • 7. Juni 2023 um 12:02
      • #13

      Rein aus interesse, ist der Name vom Chip oder der Plate rein zufällig selber wählbar? Also könnte mein Kennzeichen sowas sein: "OR 1=1; DROP TABLE players; --" ? :D
      Wollte darauf hinaus das es kein prepared statement zu sein scheint und theoretisch so sehr anfällig für sql injection.

    • Henne
      Nerd
      Reaktionen
      155
      Trophäen
      7
      Beiträge
      840
      Bilder
      7
      • 7. Juni 2023 um 14:51
      • #14
      Zitat von DragonGER

      Rein aus interesse, ist der Name vom Chip oder der Plate rein zufällig selber wählbar? Also könnte mein Kennzeichen sowas sein: "OR 1=1; DROP TABLE players; --" ? :D
      Wollte darauf hinaus das es kein prepared statement zu sein scheint und theoretisch so sehr anfällig für sql injection.

      Sollte kein großes Problem sein. Denn meines wissens nimmt extDB3 immer nur einen SQL-Befehl. Sollten mehrere Befehle erkannt werden, gibt es einen Fehler.

      Zumindest habe ich gerade dies auf dem Server ausgeführt:

      "extDB3" callExtension "0:SQL:SELECT COUNT(*) FROM player; TRUNCATE statistics; SELECT COUNT(*) FROM player"

      Dadurch gibt es folgenden Fehler:

      Code
      [14:48:59 +02:00] [Thread 1314574] extDB3: SQL: Error MariaDBQueryException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'TRUNCATE statistics; SELECT COUNT(*) FROM player' at line 1
      [14:48:59 +02:00] [Thread 1314574] extDB3: SQL: Error MariaDBQueryException: Input: SELECT COUNT(*) FROM player; TRUNCATE statistics; SELECT COUNT(*) FROM player

      Wenn ich allerdings SELECT COUNT(*) FROM player; TRUNCATE statistics; SELECT COUNT(*) FROM player direkt auf die Datenbank ausführe, wird die Tabelle "statistics" geleert.

      Ich habe zuvor auch diesen Befehl "extDB3" callExtension "0:SQL:TRUNCATE statistics" ausgeführt, um zu testen ob er grundsätzlich funktioniert.

      Bevor die Frage kommt, ja ich habe immer dafür gesorgt, dass wieder Einträge vorhanden sind. ^^

      Aber auch so sind preparedStatements der bessere Weg und es ist vorteilhaft diese zu nutzen.

    Registrieren oder Einloggen

    Du bist noch kein Mitglied von Native-Servers.com? Registriere dich kostenlos und werde Teil einer großartigen Community!

    Benutzerkonto erstellen

    Wichtige Links & Informationen

    Server & Hosting-Ressourcen

      Server Administration & Hosting Basics

      Windows Server Support & Guides

      Linux Server Configuration & Help

      Setting up TeamSpeak 3 & VoIP Servers

      Domains & Web Hosting for Beginners & Professionals

      Cloud Hosting, Docker & Kubernetes Tutorials

    Gameserver & Modding-Ressourcen

      ArmA 3 Tutorials & Script Collection

      Renting & Operating Gameservers

      DayZ Server Management & Help

      FiveM (GTA V) Server & Script Development

      Rust Server Modding & Administration

      Setting up & Optimizing ARK Survival Servers

    NodeZone.net – Deine Community für Gameserver, Server-Hosting & Modding

      NodeZone.net ist dein Forum für Gameserver-Hosting, Rootserver, vServer, Webhosting und Modding. Seit 2015 bietet unsere Community eine zentrale Anlaufstelle für Server-Admins, Gamer und Technikbegeisterte, die sich über Server-Management, Hosting-Lösungen und Spielemodding austauschen möchten.


      Ob Anleitungen für eigene Gameserver, Hilfe bei Root- und vServer-Konfigurationen oder Tipps zu Modding & Scripting – bei uns findest du fundiertes Wissen und praxisnahe Tutorials. Mit einer stetig wachsenden Community findest du hier Antworten auf deine Fragen, Projektpartner und Gleichgesinnte für deine Gaming- und Serverprojekte. Schließe dich NodeZone.net an und werde Teil einer aktiven Community rund um Server-Hosting, Gameserver-Management und Modding-Ressourcen.

    Wer jetzt nicht teilt ist selber Schuld:
    1. Nutzungsbestimmungen
    2. Datenschutzerklärung
    3. Impressum
    4. Urheberrechts- oder Lizenzverstoß melden
  • Trimax Design coded & layout by Gino Zantarelli 2023-2025©
    Community-Software: WoltLab Suite™