C++ i Mysql - odczytanie zawartości bazy

0

Witam otóż mam problem. Tworzę aplikację w C++, która będzie operować na bazie danych mysql i potrzebuje odczytać z niej pewne dane. Wiele szperałem po sieci i wszędzie napotykałem te samo rozwiązanie, które jednak u mnie nie chce działać.

Kod programu poniżej.

Mianowicie co chcę osiagnąć. Chcę wiedzieć, czy wydając zapytanie w funkcjach CheckUID i CheckNick istnieje coś w bazie o podanym UID/NICK (przykładowy kod jakim miałbym sprawdzać jest w CheckNick zakomentowany. Nie działa).

W funkcji Login zapytanie do bazy powoduje zwrot UID o podanym loginie i haśle. Niestety nie wiem jak się dobrać do tego. Wszelkie informacje mile widziane.

Uczę się tych wszystkich zapytań głównie ze stron anglojęzycznych dlatego nie wszystko jest jeszcze jasne.


#include "winlib.h"

using namespace std;

string databases::intToString(int number)
{
    stringstream ss;
    ss << number;
    return ss.str();
}
int databases::CheckUID(int UID, MYSQL *base)
{
    MYSQL_RES *result;
    MYSQL_ROW row;
    int num_fields=0;
    char query[100]="";

    strcat(query,"SELECT id FROM USERS where userid='");
    string sUID=intToString(UID);
    strcat(query, sUID.c_str());
    strcat(query,"';");

    cerr<<query <<endl;
    cerr<<mysql_query(base,query);
    cerr<<"\nZapytalo bazy\n";
    result=mysql_store_result(base);

    return num_fields;
}
int databases::CheckNick(char *nick, MYSQL *base)
{
    MYSQL_RES *result;
    MYSQL_ROW row;
    int num_fields=0;
    char query[100]="";
    strcat(query+strlen(query),"SELECT id FROM USERS where userid='");
    strcat(query+strlen(query),nick);
    strcat(query+strlen(query),"';");
    mysql_query(base, query);
    result = mysql_store_result(base);
    /*
    num_fields = mysql_num_fields(result);

    while ((row = mysql_fetch_row(result)))
    {
        for(int i = 0; i < num_fields; i++)
        {
            printf("%s ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    mysql_free_result(result);*/

    return 0;
}
int databases::CreateAccount(const char *login, const char *password, MYSQL *base)
{
/*
     FILE*loginf;
     loginf=fopen("log.temp", "at");
     if(loginf==NULL)
     {
           cerr<<"Błąd pliku\n";
           return 1;
     }*/
     mysql_select_db(base, "inote");
     srand((int) time(NULL));
     int userid=rand()%9999+1;
     int x;
     do{
         x=CheckUID(userid, base);
     }while(x!=0);
     if(CheckNick((char*)(login), base)!=0)
     {
         WindowC::ShowInfoWindow(g_strdup("iNote - błąd tworzenia konta"), g_strdup("Błąd. Konto nie zostało stworzone. Istnieje użytkownik o takim nicku"));
         return 1;
     }
     /*fprintf(loginf, "%s\t %s\t %i\n", login, password, userid);
     fclose(loginf);*/
     char query[100];
     strcat(query, "INSERT INTO users(nick, password, userid) values('");
     strcat(query, login);
     strcat(query, "','");
     strcat(query, password);
     strcat(query, "','");
     string UID=intToString(userid);
     strcat(query,UID.c_str());
     strcat(query, "');");

     if(mysql_query(base, query))
     {
           WindowC::ShowInfoWindow(g_strdup("iNote - błąd tworzenia konta"), g_strdup("Błąd. Konto nie zostało stworzone. Skontaktuj się z administratorem"));
     }

     return 0;
}

int databases::Login(const char *nick, const char *password, MYSQL *base)
{
    MYSQL_RES *result;
    MYSQL_ROW row;
    MYSQL_FIELD *field;
    char query[100];
    strcat(query,"SELECT id FROM users WHERE nick='");
    strcat(query, nick);
    strcat(query,"' and password='");
    strcat(query, password);
    strcat(query, "';");

    mysql_query(base, query);
    result=mysql_store_result(base);
    field = mysql_fetch_field(result);

    cerr<<field->name <<endl;

    mysql_free_result(result);
    return 0;
}
 

Z góry dziękuję i pozdrawiam.

0

Ok sporo już poprawiłem. Sam kod powyższy dawno nie aktualny jednak w poniższym jest problem z Funkcją UpdateNotes(); Wywala mi się gdy ma zostać zrobiony update w bazie danych konkretnego rekordu. Pozdriawiam.

#include "winlib.h"

using namespace std;

string databases::intToString(int number)
{
    stringstream ss;
    ss << number;
    return ss.str();
}

int databases::CheckUID(int UID, MYSQL *base)
{
    MYSQL_RES *result;
    MYSQL_ROW row;
    int ret;
    char query[100]="";

    strcat(query,"SELECT nick FROM users WHERE userid='");
    string sUID=intToString(UID);
    strcat(query, sUID.c_str());
    strcat(query,"';");

    if(mysql_real_query(base, query,(unsigned int) strlen(query)))
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - błąd tworzenia konta"), g_strdup(mysql_error(base)));
    }
    result=mysql_use_result(base);
    if(result){
    row=mysql_fetch_row(result);
    int num_fields=mysql_num_fields(result);
            ret = (unsigned long) mysql_num_rows(result);
    mysql_free_result(result);
    }
    else
    {
        ret=-1;
    mysql_free_result(result);
    }
    return ret;
}

int databases::CheckNick(char *nick, MYSQL *base)
{
    MYSQL_RES *result;
    MYSQL_ROW row;
    int ret;
    char query[100]="";
    strcat(query+strlen(query),"SELECT * FROM users WHERE nick='");
    strcat(query+strlen(query),nick);
    strcat(query+strlen(query),"';");

    if(mysql_real_query(base, query,(unsigned int) strlen(query)))
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - błąd tworzenia konta"), g_strdup(mysql_error(base)));
    }
    result=mysql_use_result(base);
    if(result){
    row=mysql_fetch_row(result);
    int num_fields=mysql_num_fields(result);
            ret = (unsigned long) mysql_num_rows(result);
    mysql_free_result(result);
    }
    else
    {
        ret=-1;
    mysql_free_result(result);
    }
    return ret;
}

int databases::CreateAccount(const char *login, const char *password, MYSQL *base)
{
     mysql_select_db(base, "inote");
     srand((int) time(NULL));
     int userid=rand()%9999+1;
     int ret;
     do{
         ret=CheckUID(userid, base);
     }while(ret!=0);
     if(CheckNick((char*)(login), base)!=0)
     {
         WindowC::ShowInfoWindow(g_strdup("iNote - błąd tworzenia konta"), g_strdup("Błąd. Konto nie zostało stworzone. Istnieje użytkownik o takim nicku"));
         return 1;
     }
     char query[100];
     strcat(query, "INSERT INTO users(nick, password, userid) values('");
     strcat(query, login);
     strcat(query, "','");
     strcat(query, password);
     strcat(query, "','");
     string UID=intToString(userid);
     strcat(query,UID.c_str());
     strcat(query, "');");

     if(mysql_real_query(base, query,(unsigned int) strlen(query))!=0)
     {
           WindowC::ShowInfoWindow(g_strdup("iNote - błąd tworzenia konta"), g_strdup("Błąd. Konto nie zostało stworzone. Skontaktuj się z administratorem"));
     }
     else
     {
         WindowC::ShowInfoWindow(g_strdup("iNote- tworzenie konta"), g_strdup("Konto zostało stworzone pomyślnie"));
     }

     return 0;
}

int databases::Login(const char *nick, const char *password, MYSQL *base, int &UID)
{
    MYSQL_RES *result;
    MYSQL_ROW row;
    int ret =0;
    char query[100]="";
    strcat(query,"SELECT userid FROM users WHERE nick='");
    strcat(query, nick);
    strcat(query,"' and password='");
    strcat(query, password);
    strcat(query, "';");

    if(mysql_real_query(base, query, (unsigned int) strlen(query)))
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - Logowanie"),g_strdup("Błąd logowania. Spróbuj ponownie lub skontaktuj się z administratorem."));
        return -1;
    }
    result=mysql_use_result(base);
    if(result)
    {
        row=mysql_fetch_row(result);
        int num_fields=mysql_num_fields(result);
        if(row>=0)
        {
             UID=atoi(row[0]);
        }
            ret = (unsigned long) mysql_num_rows(result);
    }
    else
    {
        ret=-1;
    }
    mysql_free_result(result);
    return ret;
}
UpdNote databases::UpdateNote(int UID, string topic, string tekst, MYSQL *base, bool loged)
{
    if(!loged)
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - błąd dodawania notatki"), g_strdup("Nie jesteś zalogowany"));
        return UP_NO;
    }
    //będziemy sprawdzać, czy coś juz mamy z tym tematem
    string temp=intToString(UID);
    string query;
    query+="SELECT note FROM notes WHERE userid='"+temp+"' && topic='"+topic+"';";

    if(!mysql_real_query(base,query.c_str(),(unsigned int) query.length()))
    {
        MYSQL_RES *res=mysql_use_result(base);
        if(res)
        {
            MYSQL_ROW row;
            if(row=mysql_fetch_row(res))
            {
                WindowC::ShowInfoWindow(g_strdup("iNote - tworzenie notatki"), g_strdup("W twojej bazie istnieje już wpis o tym o temacie i nastąpi próba o jego aktualizacji."));
                    query="UPDATE notes SET note='"+tekst+"' WHERE topic='"+topic+"' && userid='"+temp+"';";
                    cerr<<"Kommend:"<<endl <<query <<endl;
                    if(mysql_real_query(base,query.c_str(), query.length()))
                    {
                        WindowC::ShowInfoWindow(g_strdup("iNote - dodawanie notatek"), g_strdup("Błąd aplikacji. Notatka nie została zaktualizowana."));
                        return UP_NOPE;
                    }
                    else
                    {
                        WindowC::ShowInfoWindow(g_strdup("iNote - dodawanie notatek"), g_strdup("Notatka została zaktualizowana."));
                        return UP_YES;
                    }
            }
        }
        mysql_free_result(res);
    }
    return UP_NO;
}
int databases::CreateNote(int UID, string topic, string tekst, MYSQL *base, bool loged)
{

    if(!loged)
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - błąd dodawania notatki"), g_strdup("Nie jesteś zalogowany"));
        return 1;
    }
    string temp=intToString(UID);
    //wybieramy bazę danych
    mysql_select_db(base, "inote");
    //zwyczajnie dodajemy notatke
    string com;
    string query;
    query+="INSERT INTO notes(userid, topic, note) values('";
    query+=temp.c_str();
    query+="', '";
    query+=topic;
    query+="', '";
    query+=tekst;
    query+="');";

    //cerr<<query <<endl;
    if(mysql_real_query(base, query.c_str(), query.length()))
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - dodawanie notatek"), g_strdup("Błąd aplikacji. Notatka nie została dodana."));
    }
    else
    {
        WindowC::ShowInfoWindow(g_strdup("iNote - dodawanie notatek"), g_strdup("Pomyślnie dodano notatkę do twojej bazy."));
    }

    return 0;
}

int databases::GetNotes(int UID, vector<string> &retText, MYSQL *base, string what)
{
    retText.clear();
    MYSQL_ROW topicL;
    int ret=0;
    MYSQL_RES *topicR;
    mysql_select_db(base, "inote");
    string query;
    string temp=intToString(UID);
    //tworzymy zapytanie dla tematów
    query+="SELECT "+what+" FROM notes WHERE userid='"+temp+"';";
    //wywolujemy zapytanie z bazy
    if(mysql_real_query(base,query.c_str(),strlen(query.c_str())))//jeśli nam nie pójdzie kończymy działanie
    {
        query="SELECT "+what+" FROM notes WHERE userid='-1';";
        if(mysql_query(base,query.c_str()))//ew wyswietlamy powitalna notatke;
        {
            mysql_free_result(topicR);
            WindowC::ShowInfoWindow(g_strdup("iNote - notatki"), g_strdup("Błąd pobierania notatek - Tematy"));
            return 1;
        }
    }
    //zapisujemy tabele tematów
    topicR=mysql_use_result(base);
    if(topicR)
    {
        while(topicL=mysql_fetch_row(topicR))
        {
            ++ret;
            retText.push_back(topicL[0]);
        }
    }

    mysql_free_result(topicR);

    return ret;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1