Problem bei einem Script

Ich habe wieder ein Problem mit einen VoteNPC Scrpt undzwar ich weiß nicht wie ich eine Query in einen String umwandle.

Script:


#include "QueryResult.h"

#include "QueryHolder.h"

#include "ScriptPCH.h"

#include <cstring>

#include <string.h>

class vote_NPC : public CreatureScript

{

public:

	 vote_NPC()

		 : CreatureScript("vote_NPC")

	 {

	 }

	 template <typename T>

	 std::string number_to_string(T number)

	 {

	 return dynamic_cast<std::stringstream *> (&(std::stringstream() << number))->str();

	 }

	 bool OnGossipHello(Player* player, Creature* creature)

	 {

		 std::string AccID = number_to_string(player->GetSession()->GetAccountId());

		 QueryResult query;

		 query = LoginDatabase.PQuery("SELECT `username` FROM `account` WHERE `id`='%s'", AccID);

MfG

L1nk27

Warum möchtest du die AccID den als String haben?

Warum nicht einfach:

uint32 AccID = player->GetSession()->GetAccountId();

query = LoginDatabase.PQuery(“SELECT username FROM account WHERE id=‘%u’”, AccID);

Danke für die schnelle Hilfe es lag wirklich an dem AccID als String, jetzt funktioniert der Script.

MfG

L1nk27

Hätte auch funktioniert, wenn du die AccID in einen CString umwandelst mit AccID.c_str()

Okay ich nochmal ich habe das nächste Problem wo ich wiedermal nicht weiter weiß.

Der Server stürtzt immer ab wenn ich die NPC anspreche.

Code:


#include "QueryResult.h"

#include "QueryHolder.h"

#include "ScriptPCH.h"

#include <cstring>

#include <string.h>

class vote_NPC : public CreatureScript

{

    public:

	    vote_NPC()

		    : CreatureScript("vote_NPC")

	    {

  }

  template <typename T>

  std::string number_to_string(T number)

  {

  return dynamic_cast<std::stringstream *> (&(std::stringstream() << number))->str();

  }

  bool OnGossipHello(Player* player, Creature* creature)

	    {

   uint32 AccID = player->GetSession()->GetAccountId();

   QueryResult query;

   query = LoginDatabase.PQuery("SELECT `username` FROM `account` WHERE `id`='%u'", AccID);

   Field* queryrow = query->Fetch();

   std::string username = queryrow->GetCString();

   QueryResult result;

   result = LoginDatabase.PQuery("SELECT `votepoints` FROM `vote_points` WHERE `username`='%s'", username);


   Field* resultrow = result->Fetch();

   uint32 votepoints = resultrow->GetUInt32();


   std::string VotePointsString = "Votepoints: " + number_to_string(votepoints);

   player->ADD_GOSSIP_ITEM(2, VotePointsString,								  GOSSIP_SENDER_MAIN,   1);

MfG

L1nk27

Erstmal solltest du für den Fall der Fälle immer überprüfen ob der QueryResult denn gültig ist.


QueryResult query = LoginDatabase.PQuery("SELECT `username` FROM `account` WHERE `id`='%u'", AccID);


if (!query) //Error Query ungültig oder NULL

return true;

Und das selbe auch beim 2. QueryResult also “result”.

Ich wette du hast einen Fehler im Query für die vote_points Tabelle, wodurch der QueryResult uninitalisiert bleibt. Und da du nachher mit dem QueryResult einfach weiterrechnest kommt denke ich mal der Crash.

Hättest du Michas Post gelesen wärst du evtl. auch drauf gekommen.

Probier mal so:


result = LoginDatabase.PQuery("SELECT `votepoints` FROM `vote_points` WHERE `username`='%s'", username.c_str());

Denn sonst suchst du in einer Spalte wie “username” wo es wahrscheinlich nur Text gibt, nach einer Zahl. Die logischerweise nicht existiert und die Query ungültig/leer/NULL ist.

Und wie gesagt, hättest du die Checks für die QueryResults drin würde es selbst bei einem Fehler in der Query, oder einer Leeren Query die nichts zurückgibt (evtl. weil es den username durch irgendeinen Grund nicht in vote_points geben sollte), nicht Crashen.

Vielen Dank, jetzt funktioniert der Script endlich komplett ohne Fehler.

MfG

L1nk27