Pytania, uwagi do programu C++ + MYSQL

0

Witam,
jestem w trakcie pisania programu semestralnego i miałbym taką prośbę aby ktoś zobaczył czy to co napisałem ma jakiś sens i czy jest napisane w miarę obiektowo.

Sam program to jest po prostu prosta obsługa bazy danych MYSQL.
Jednym z takich problemów jest to że muszę w programie zastosować przeciążenie operatorów. Napisałem te funkcje ale o ile operator wyjścia jeszcze jakoś daje radę o tyle operator wejścia powoduje że mam problem bo wcześniej napisałem sobie funkcję "wymagane_pole()" która to sprawdza mi oraz odpowiednio formatuje to co zostaje wprowadzane. I teraz problem jest taki że jak bym chciał to zastosować w przeciążeniu to bym musiał 9 raz to skopiować a to przecież mija się celem...

I jeszcze kilka takich pytań(słowo mogę oznacza czy jest to poprawne):

  1. Czy mogę robić w metodach obiekty ?
  2. Czy mogę w każdej metodzie nawiązywać połączenie z bazą danych.
  3. Czy jeśli pobieram z bazy i dane te są jako tablica "row" to czy muszę je zapisywać do obiektu żeby wyświetlić ? Jeśli tak to jak to zrobić bo jeśli próbuję napisać osoba.imie = row[1]; to jest błąd, dlaczego ?

PS: program działa :)

Po niżej wrzucam kod klasy dane_osobowe.h

#include "stdafx.h"
#pragma once
class dane_osobowe
{
protected:
    string imie;
    string nazwisko;
    string telefon;
    string ulica;
    string nr_domu_mieszkania;
    string kod_pocztowy;
    string miejscowosc;
    string email;

public:
    dane_osobowe(void);
    ~dane_osobowe(void);
    void dane_osobowe_dodaj(dane_osobowe *osoba);
    void dane_osobowe_edytuj();
    void dane_osobowe_wyswietl();
    void dane_osobowe_wpisz(); /// wymagane pole
    void dane_osobowe_usun();
    void dane_osobowe_sortuj();
    void dane_osobowe_logi();

    friend void polaczenie_MYSQL();
    friend void zamykanie_MYSQL();

    friend string wymagane_pole( string nazwa_pola, string pole );

    friend ostream& operator<< (ostream&, dane_osobowe const&);
    friend istream& operator>> (istream& , dane_osobowe&); 
    
};

 

dane_osobowe.cpp

 

#include "StdAfx.h"
#include "dane_osobowe.h"


dane_osobowe::dane_osobowe(void) // konstruktro ktory wykonuje sie podczas uruchminie classy(zawiera domyślne wartości)
{
    imie = "";
    nazwisko= "brak";
    telefon= "brak";
    ulica= "brak";
    nr_domu_mieszkania= "brak";
    kod_pocztowy= "brak";
    miejscowosc= "brak";
    email= "brak";

    //cout << "konstruktor";
}


dane_osobowe::~dane_osobowe(void)
{
    //cout << "destruktor";

}




void dane_osobowe::dane_osobowe_dodaj(dane_osobowe *osoba)
{
    
    cout << osoba->imie << endl;
    cout << osoba->imie << endl;
    cout << osoba->imie << endl;
}

void dane_osobowe::dane_osobowe_edytuj() 
{
    string id;
    
    bool sprawdzenie_id = false, wyjscie_end = false;
    for(;;)
    {
    while(sprawdzenie_id == false)
    {
        cout << endl << "(Wyjscie po wpisaniu 'end') - Prosze wpisac id osoby ktora chcesz edytowac: ";
        cin >> id;
        id = id.substr(0,3); // uciananie stringu do 3 miejsc
        int dlugosc_id = id.length();
        
        if(id == "end")
        {
            wyjscie_end = true;
            break;/// wyjscie z funkcji
            
        }
        else 
        {

            int sprawdza = 0;
            for(int i = 0; i < dlugosc_id; i++)
            {
                if(id[i] >= '0' && id[i] <= '9' )
                {
                    sprawdza = sprawdza +1;
                }
            }
            if(sprawdza == dlugosc_id) {
                sprawdzenie_id = true;
            }
            else
            {
                cout << "Prosze wprowadzic liczby!";
                sprawdzenie_id = false;
            }
        }
    }

    if(wyjscie_end)
    {
        break;
    }


    polaczenie_MYSQL();


    MYSQL_ROW  row; // pojedynczy wiersz 

    char bufor [500];
    sprintf(bufor, "SELECT * FROM osoby WHERE id_osoba = %s",id.c_str());
    mysql_query(conn,bufor);
    result = mysql_store_result(conn); // pobieramy wynik poprzedniego zapytania

    int ile_wierszy = mysql_num_rows(result);



    if( ile_wierszy == 1) 
    {

        dane_osobowe osoba_edycja;
        
        osoba_edycja.imie = wymagane_pole("imie",imie); 
        osoba_edycja.nazwisko = wymagane_pole("nazwisko",nazwisko); 
        osoba_edycja.ulica = wymagane_pole("ulica",ulica); 
        osoba_edycja.nr_domu_mieszkania = wymagane_pole("nr domu/mieszkania",nr_domu_mieszkania); 
        osoba_edycja.miejscowosc = wymagane_pole("miejscowosc",miejscowosc); 
        osoba_edycja.kod_pocztowy = wymagane_pole("kod pocztowy",kod_pocztowy); 
        osoba_edycja.telefon = wymagane_pole("telefon",telefon); 
        osoba_edycja.email = wymagane_pole("email",email); 


        if(result){
            unsigned long num_fields = mysql_num_fields(result);
            while (row = mysql_fetch_row(result)){
            
                for(int i = 1; i < num_fields; i++)
                {
                    cout << row[i];
                    switch(i)
                    {    
                        case 1:
                            imie = row[i];
                            if(imie != osoba_edycja.imie){ imie = osoba_edycja.imie; } 
                            break;
                        case 2:
                            nazwisko = row[i];
                            if(nazwisko != osoba_edycja.nazwisko){ nazwisko = osoba_edycja.nazwisko; } 
                            break;
                        case 3:
                            ulica = row[i];
                            if(ulica != osoba_edycja.ulica){ ulica = osoba_edycja.ulica; } 
                            break;
                        case 4:
                            nr_domu_mieszkania = row[i];
                            if(nr_domu_mieszkania != osoba_edycja.nr_domu_mieszkania){ nr_domu_mieszkania = osoba_edycja.nr_domu_mieszkania; } 
                            break;
                        case 5:
                            miejscowosc = row[i];
                            if(miejscowosc != osoba_edycja.miejscowosc){ miejscowosc = osoba_edycja.miejscowosc; } 
                            break;
                        case 6:        
                            kod_pocztowy = row[i];
                            if(kod_pocztowy != osoba_edycja.kod_pocztowy){ kod_pocztowy = osoba_edycja.kod_pocztowy; } 
                            break;
                        case 7:
                            telefon = row[i];
                            if(telefon != osoba_edycja.telefon){ telefon = osoba_edycja.telefon; } 
                            break;
                        case 8:
                            email = row[i];
                            if(email != osoba_edycja.email){ email = osoba_edycja.email; } 
                            break;
                    }
                }
            }
        }

        char query[900]; //bufor
        sprintf(query, "UPDATE osoby SET imie='%s', nazwisko='%s', ulica='%s', nr_domu_mieszkania='%s', miejscowosc='%s', kod_pocztowy='%s', telefon='%s', email='%s' WHERE id_osoba = %s LIMIT 1", imie.c_str(), nazwisko.c_str(), ulica.c_str(), nr_domu_mieszkania.c_str(),  miejscowosc.c_str(), kod_pocztowy.c_str(), telefon.c_str(), email.c_str(), id.c_str());
        mysql_query(conn,query);

        if(mysql_query(conn,query))
        {
             cout << "Blad: " << mysql_error(conn) << endl;
        }
        else
        {
             cout << "Rekord o id " << id <<" poprawnie edytowano!" << endl;
        }

        break;
    }
    else
    {
        cout << "Podane id nie istnieje w bazie danych!";
        sprawdzenie_id = false;

    }
    
    mysql_free_result(result); // zwalnia pamieć zajeta przez res
    zamykanie_MYSQL();

    }

}

void dane_osobowe::dane_osobowe_wyswietl()
{
    dane_osobowe osoba;

    polaczenie_MYSQL();
    cout << osoba;

    zamykanie_MYSQL();


}

void dane_osobowe::dane_osobowe_wpisz()
{
    dane_osobowe osoba;
    cin >> osoba;

    cout << osoba.imie;
    
    polaczenie_MYSQL();
    
    char query[500]; //bufor
    sprintf(query, "INSERT INTO osoby VALUES('', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');", osoba.imie.c_str(), nazwisko.c_str(), ulica.c_str(), nr_domu_mieszkania.c_str(), miejscowosc.c_str(), kod_pocztowy.c_str(), email.c_str(), telefon.c_str());
    //mysql_query(conn,query);
    
    if(mysql_query(conn,query))
    {
        cout << "Blad: " << mysql_error(conn) << endl;
    }
    else
    {
        cout << "Dodano poprawnie osobe!" << endl;
    }
    
    zamykanie_MYSQL(); // zamkniecie polaczenia



}

void dane_osobowe::dane_osobowe_usun()
{
    
    polaczenie_MYSQL();
    zamykanie_MYSQL();

}

void dane_osobowe::dane_osobowe_sortuj()
{
}

void dane_osobowe::dane_osobowe_logi()
{
}

//---------------------------------------------------------------------------------------------

string wymagane_pole( string nazwa_pola, string pole )
{
    bool sprawdzenie = FALSE;
    while(sprawdzenie == FALSE) 
    { 
        cout << "Wpisz " << nazwa_pola << ":";
        getline(cin,pole);
    
        if(pole == "")
        {
            sprawdzenie = FALSE;
            cout << "Pole " << nazwa_pola << " jest wymagane!" << endl;
        }
        else
        {
            if(    nazwa_pola == "email" ) // tylko jeśli wprowadzamy email
            {
                regex wzorzec("^[a-zA-Z0-9]*@[a-zA-Z0-9]*(\\.[a-zA-Z]{2,4})$");
                bool walidacja = regex_match(pole, wzorzec);

                if(walidacja == FALSE ) 
                {
                    cout << "Wpisany adres email nie jest poprawny!" << endl;
                }
                else 
                { 
                    sprawdzenie = TRUE;
                }
            }
            else
            {
                sprawdzenie = TRUE;    
            }
        
        
        }
    }
        //Funkcja ktora usuwa poczatkowe spacje oraz zamienia 1 literę na wielką
        // wszystkie pola po za adresem email

    if(    nazwa_pola != "email" ) 
    {
        if((int)pole[0] != 32 ) 
        {
            pole[0] = toupper(pole[0]); 
        }
        else
        {        
            int n=pole.size();
            string czyste_pole;
            for(int i=0, k = 0; i<n; i++)
            {
                if((int)pole[i] != 32 ) //usuwanie spacji z tekstu
                {            
                    czyste_pole+=pole[i];
                }

            }        
            pole = czyste_pole;
            pole[0] = toupper(pole[0]); 
        }
    }
    
    return pole;
}

istream& operator>>(istream& wejscie, dane_osobowe& osoba)
{

    //wejscie >> osoba.imie >> osoba.nazwisko >> osoba.ulica >> osoba.nr_domu_mieszkania >> osoba.miejscowosc >> osoba.kod_pocztowy >> osoba.telefon >>osoba.email;
    
    cout << osoba.imie;
    bool sprawdzenie = FALSE;
    while(sprawdzenie == FALSE) 
    {
        cout << "Wpisz imie:";
        wejscie >> osoba.imie;

        cout << osoba.imie;
    
        if(osoba.imie == "" && osoba.imie == "brak" )
        {
            sprawdzenie = FALSE;
            cout << "Pole jest wymagane!" << endl;
        }
        else
        {
        
            sprawdzenie = TRUE;
        
        }
    }

    return wejscie;
}

ostream& operator<< (ostream &wyjscie, dane_osobowe const& osoba)
{
    MYSQL_ROW  row; // pojedynczy wiersz 
    
    mysql_query(conn,"SELECT * FROM osoby"); // tworzymy zapytanie
    result = mysql_store_result(conn); // pobieramy wynik poprzedniego zapytania

        if(result){ // Jesli res zawiera jakieś wpisy
        
        unsigned long num_fields = mysql_num_fields(result); // liczba pol w wierszu - kolumn 

        wyjscie <<"+---+--------------------+-------------------------+-------------------------+--------+-------------------------+----------+------------------------------+--------------------+"<< endl;
        wyjscie << "|";
        wyjscie.width(3);
        wyjscie << "Id";
        wyjscie << "|";
        wyjscie.width(20);
        wyjscie << "Imie";
        wyjscie << "|";
        wyjscie.width(25);
        wyjscie << "Nazwisko";
        wyjscie << "|";
        wyjscie.width(25);
        wyjscie << "Ulica";
        wyjscie << "|";
        wyjscie.width(8);
        wyjscie << "Nr";
        wyjscie << "|";
        wyjscie.width(25);
        wyjscie << "Miejscowosc";
        wyjscie << "|";
        wyjscie.width(10);
        wyjscie << "Kod";
        wyjscie << "|";
        wyjscie.width(30);
        wyjscie << "Adres email";
        wyjscie << "|";
        wyjscie.width(20);
        wyjscie << "Telefon";
        wyjscie << "|";        
        wyjscie << endl << "+---+--------------------+-------------------------+-------------------------+--------+-------------------------+----------+------------------------------+--------------------+"<< endl;
        
        while (row = mysql_fetch_row(result)){
            
            //cout << row;

            for(int i = 0; i < num_fields; i++){
                
                cout << "|";            

                switch(i)
                {
                case 0:
                    wyjscie.width(3);
                    wyjscie << row[0];
                    break;
                case 1:
                    wyjscie.width(20);
                    
                    wyjscie << row[1];
                    break;
                case 2:
                    wyjscie.width(25);
                    wyjscie << row[2];
                    break;
                case 3:
                    wyjscie.width(25);
                    wyjscie << row[3];
                    break;
                case 4:
                    wyjscie.width(8);
                    wyjscie << row[4];
                    break;
                case 5:
                    wyjscie.width(25);
                    wyjscie << row[5];
                    break;
                case 6:
                    wyjscie.width(10);
                    wyjscie << row[6];
                    break;
                case 7:
                    wyjscie.width(30);
                    wyjscie << row[7];
                    break;
                case 8:
                    wyjscie.width(20);
                    wyjscie << row[8];
                    break;
                default:
                    wyjscie.width(22);
                    wyjscie << row[9];
                    break;
                }
                //result->row[i];
                //cout << row->fetch_assoc();
                //cout << row[i];
            }
            wyjscie <<"|";    
            
            wyjscie << endl <<"+---+--------------------+-------------------------+-------------------------+--------+-------------------------+----------+------------------------------+--------------------+"<< endl;
        }

        mysql_free_result(result); // zwalnia pamieć zajeta przez res
    }
    else
    {
        cout << "Brak osob w bazie danych!";
    }
   

    return wyjscie;


}

void polaczenie_MYSQL()
{
    conn = mysql_init (NULL);
    if (!mysql_real_connect(conn, sql_host, sql_username, sql_password, sql_base, sql_port, opt_socket, sql_flags))
    {
        cout <<"Blad:" << mysql_error(conn);
    }

}

void zamykanie_MYSQL()
{
    mysql_close(conn);
}








main.cpp

// program-semstralny.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "dane_osobowe.h"
#include "pracownicy.h"
#include "klienci.h"
#include "akcja.h"

bool Connect(MYSQL *conn)
{
 //łączenie i logowanie.... 
}

int polaczenie_mysql()
{
    bool sprawdzenie;
    conn = mysql_init (NULL);
    if (!mysql_real_connect(conn, sql_host, sql_username, sql_password, sql_base, sql_port, opt_socket, sql_flags))
    {
        //cout <<"Blad polaczenia z baza MySQL:" << mysql_error(conn);
        sprawdzenie = false;
    }
    else
    {
        sprawdzenie = true;
    }

    return sprawdzenie;
}






int _tmain(int argc, _TCHAR* argv[])
{
    

    if(polaczenie_mysql() == 1) 
    {
        dane_osobowe osoba;
        //osoba.dane_osobowe_wpisz();
        
        for(;;)
        {
            char wybor,pod_wybor;
            system("cls");
            cout << "###############################" << endl;
            cout << "#        MENU PROGRAMU        #" << endl;
            cout << "###############################" << endl<<endl;
            cout << "1. Zarzadzanie osobami" << endl;
            cout << "2. Zarzadzanie pracownikami" << endl;
            cout << "3. Zarzadzanie klientami" << endl;
            cout << "4. Zarzadzanie projektami" << endl;
            cout << "5. Logi programu" << endl;
            cout << "6. Zakonczenie programu" << endl<< endl;

            cout << "Wybierz: ";
            cin >> wybor;

            switch(wybor)
            {
                case '1':
                for(;;)
                {
                    bool powrot_do_menu_glownego = false;
                    system("cls");
                    cout << "######################################" << endl;
                    cout << "#        MENU PROGRAMU->OSOBY        #" << endl;
                    cout << "######################################" << endl<<endl;
                    cout << "1. Wyswietl osoby" << endl;
                    cout << "2. Dodaj osobe" << endl;
                    cout << "3. Edytuj osobe" << endl;
                    cout << "4. Usun osobe" << endl;
                    cout << "5. Powrot do poprzedniego menu" << endl << endl;

                    cout << "Wybierz: ";
                    cin >> pod_wybor;
                    
                    switch(pod_wybor)
                    {
                        case '1':
                            system("cls");
                            cout << "Lista osob w bazie danych:" << endl;
                            osoba.dane_osobowe_wyswietl();
                            cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
                            getchar();getchar();
        
                        break;

                        case '2':
                            system("cls");
                            cout << "Dodawanie nowej osoby do bazy danych:" << endl;
                            osoba.dane_osobowe_wpisz();
                            cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
                            getchar();getchar();
                        break;
                
                        case '3':
                            system("cls");
                            osoba.dane_osobowe_wyswietl();
                            cout << "Edytowanie osoby z bazy danych:" << endl;
                            osoba.dane_osobowe_edytuj();
                            cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
                            getchar();
                        break;
                
                        case '4':
                            system("cls");
                            cout << "Usuwanie osob z bazy danych:" << endl;
                            cout << endl << "Powrot do menu po nacisnieciu enter" << endl;
                            getchar();getchar();
                        break;
                
                        case '5':
                            powrot_do_menu_glownego = true;
                            break;

                        default:
                        cout << "Nie ma takiej opcji w menu! Nacisni enter i wybierz jeszcze raz!" << endl;
                        getchar();getchar();

                    }
                    if(powrot_do_menu_glownego)
                    {
                        break;
                    }
                }
                break;
                

                case '2':
                    cout << "MENU pracownicy" << endl;

                case '6':
                    cout << "Czy na pewno chcesz zakonczyc dzialanie programy ?" << endl;
                    cout << "1 - TAK, 2 - NIE"<< endl;
                    cout << "Wybierz: ";

                    int odpowiedz;
                    cin >>odpowiedz;

                    if(odpowiedz == 1)
                    {
                        exit(0);
                    }
                    
                break;


                default:
                cout << "Nie ma takiej opcji w menu! Nacisni enter i wybierz jeszcze raz!" << endl;
                getchar();getchar();


            }
        }



        //dane_osobowe osoba;
        //osoba.dane_osobowe_wyswietl();
        //osoba.dane_osobowe_wpisz();
        //osoba.dane_osobowe_wyswietl();
        //dane_osobowe osoba_kopia;
        //osoba.dane_osobowe_edytuj(&osoba_kopia);
        //mysql_close(conn);    
    }
    else 
    {
        cout << "Program nie moze zostac uruchomiony!" << endl;
        cout <<"Blad polaczenia z baza MySQL:" << mysql_error(conn) << endl;
        mysql_close(conn);
    }
    

    
    
    
    
    system("pause");
    return 0;
}


 
0

Podziel to na sensowne funkcje, bo wielki kloc w funkcji głównej jest... no cóż, daleki od ideału. Reszta funkcji to samo, niech mają < 20 linijek kodu.

0

A spróbował byś mi odpowiedzieć na te pytania które zdałem, trochę jest tego niestety może jakoś to porozdzielam na funkcje.

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