MySQL Crash bei nicht vorhandenem Datensatz



  • Hallo,

    ich habe mich ein wenig mit MySQL in C++ befasst.

    std::string MySQL_getId(MYSQL conn, std::string nName)
    	{
    		MYSQL_RES *res;
    		MYSQL_ROW row;
    		std::stringstream ss;
    		ss << "SELECT * FROM `user` WHERE `name` = '" << nName << "'";
    		std::string query = ss.str();
    		if(!mysql_query(&conn, query.c_str()))
    		{
    			res = mysql_store_result(&conn);
    			if(res != NULL)
    			{
    				while ((row = mysql_fetch_row(res)) != NULL)
    				{
    				std::cout << "Fertig";
    				mysql_free_result(res);
    				return row[0];
    				}
    			}
    			else
    			{
                                    // Hier stürzt es ab
    				mysql_free_result(res);
    				return "0";
    			}
    		}
    	}
    

    Wenn ich die Id von einem Account abrufe, der existiert, funktioniert es.
    Nehme ich jedoch "Testacc123", der nicht existiert: Crash.
    Weiß jemand woran das liegt?

    MfG



  • guten morgen,

    ich tippe mal darauf, dass mysql_store_result() speicher allokiert, der durch mysql_free_result() wieder freigegeben wird.
    du gibst hier auch in dem fall speicher frei, auch wenn nichts allokiert wurde.



  • Hey,

    erstmal danke für die Antwort.
    Auch wenn ich das "mysql_free_result(res);" entferne, crashed es.
    Hab es aber mal wieder entfernt, hatte ich nur zu Testzwecken dort stehen.

    Weitere Vorschläge? 😃


  • Mod

    Und wo bitte crashed es wenn Du die Zeile entfernst?
    Doch nichtmehr dort...
    Bitte mehr Infos, bevor Du mehr Vorschläge verlangst...



  • bool check(MYSQL conn)
    	{
    		// Id rausfinden
    		std::string sId = MySQL_getId(conn, name);
    
    		//Entweder crashed es hier
    
    		int id = atoi(sId.c_str());
    		std::cout << id << name;
    		if(id != 0)
    		{
    			if(name == MySQL_getName(conn, id))
    			{
    				return true;
    			}
    			else
    			{
    				return false;
    			}
    		}
    	}
    
    	std::string MySQL_getId(MYSQL conn, std::string nName)
    	{
    		MYSQL_RES *res;
    		MYSQL_ROW row;
    		std::stringstream ss;
    		ss << "SELECT * FROM `user` WHERE `name` = '" << nName << "'";
    		std::string query = ss.str();
    		if(!mysql_query(&conn, query.c_str()))
    		{
    			res = mysql_store_result(&conn);
    			if(res != NULL)
    			{
    				while ((row = mysql_fetch_row(res)) != NULL)
    				{
    				std::cout << "Fertig";
    				mysql_free_result(res);
    				return row[0];
    				}
    			}
    			else
    			{
                                    // Oder hier
    				// Das d wird bereits schon nicht mehr ausgegeben
                    std::cout << "d";
    				return "0";
    			}
    		}
    	}
    


  • Kann leider nicht editieren, da unregistriert. Sorry dafür.

    Debugger sagt übrigens folgendes:
    Unbehandelte Ausnahme bei 0x0082B628 (msvcr100d.dll) in Lizenzsystem.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xCCCCCCCC



  • So, habe den Fehler gefunden.
    Kann geschlossen werden.


Log in to reply