Skocz do zawartości

  •  
  • Mini kompendium
  • MimeTeX
  • Regulamin

Zdjęcie

obsługa MYsql w c++?


  • Zamknięty Temat jest zamknięty
2 odpowiedzi w tym temacie

#1 niki87

niki87

    zła i wredna :)

  • $Jr Admin
  • Redaktor
  • 5953 postów
1512
Starszy Wykładowca II
  • Płeć:Kobieta

Napisano 24.07.2008 - 16:59

Parę dni temu mój brat zadał mi takie pytanie..
czy jest możliwość (jeżeli tak to w jaki sposób jakie polecenia itp) napisania programu w c++ który będzie:
pobierać i wyświetlać dane z bazy MySQL znajdującej się na serwerze
będzie miał opcje pobrania bazy na dysk
będzie pobierał pliki .doc i .txt z serwera i je przetwarzał
będzie miał opcje wyszukiwania osoby z bazy np po nazwisku, zawodzie, wynagrodzeniu itp

a mi nasunęło się dodatkowe pytanie... jak zabezpieczyć program tak, żeby był potrzebny login i hasło i żeby administrator miał możliwość dodawania/edycji użytkowników a pozostali nie?

za wszelką pomoc dziękuje, bo to pytanie brata po klasie humanistycznej mnie poprostu rozwaliło

jeżeli możecie/znacie to mozecie dać jaieś ciekawe linki do tej tematyki :(

PS wszystkie ciekawsze fragmenty kodu również mile widziane, nie prosze o gotowca, bo raczej wolałabym to przy okazji zrozumieć (bo mimo, ze nie studiuje informatyki, to moze się kiedyś przyda )
  • 0

MimeTex
Regulamin
Klikając Posted Image mówisz DZIĘKUJĘ


Afroman

    Kombinator

  • Użytkownik
3
  • Płeć:Kobieta

Napisano 25.09.2011 - 17:55

#2 MarkII

MarkII

    Operator całkujący

  • VIP
  • 487 postów
22
Mały Pomocnik I
  • Płeć:Mężczyzna

Napisano 25.07.2008 - 13:35

Witam,
istnieje możliwość dostępu do MySQL z poziomu C/C++ wykorzystując biblioteki np. libmysql, albo też inne mysql++, czy mniej popularne SOCI. Aby użyć libmysql, musisz poszukać odpowiedniego pakietu (np. ja w dev-cpp, mam ten pakiet wyszukiwany automatycznie z poziomu IDE). Następnie przy tworzonym projekcie należy tylko podłączyć -libmysql do linii poleceń linkera i można działać.

Oto przykładowy program, który właśnie napisałem. Mam nadzieję, że nie ma zbyt dużo błędów ;D Sądzę, że komentarze będą wystarczające, ale jakby co to pytaj:

#include <mysql.h>

#include <iostream>



MYSQL *conn; // wskaźnik na obiekt/uchwyt połączenia

MYSQL_RES* res; // dane odebrane 

MYSQL_ROW  row; // pojedynczy wiersz 



int main(int argc, char* argv[]){

conn = mysql_init (NULL); // allokuje, inicializuje i zwraca nowy obiekt(uchwyt) połączenia



if (

   !mysql_real_connect ( // nawiązuje połaczenie z bazą danych, w razie problemów zwraca błędy (false)

   conn, // wskażnik na obiekt

   "localhost", // nazwa hosta do ktorego chcemy się podłączyć (localhost == 127.0.0.1)

   "root", // nazwa uzytkownika

   "password", // haslo do bazy

   "baza", // nazwa bazy do ktorej pragniemy nawiazac polaczenie

   0, // port (0 oznacza uzycie domyslnego)

   NULL, // socket (brak)

   0) // flagi (brak)

) {

	 std :: cout << "Nie ma takiej bazy, lub podane dane są niepoprawne";

}

else{

	   std :: cout << "Połączenie z bazą powiodło się\n";



	   mysql_query(conn,"SELECT * FROM phpbb_user_group"); // tworzymy zapytanie

	   res = mysql_store_result(conn); // pobieramy wynik poprzedniego zapytania

	   

	   // wypisywanie wyniku

	   if (res) { // Jesli res zawiera jakieś wpisy

			unsigned long num_fields = mysql_num_fields(res); // liczba pol w wierszu 

			while ( (row = mysql_fetch_row(res)) ) { /* zwraca tablicę numeryczną, która odpowiada pobranemu wierszowi i 

przesuwa do przodu wewnętrzny wskaźnik danych; "przechodzenie po wierszach"*/

				 unsigned long *lengths; 

				 lengths = mysql_fetch_lengths(res); // pobiera długości pól wiersza wynikowego

			

				 // wyswietlanie

				 printf("|");

				 for(unsigned long i = 0; i < num_fields; i++) {

					printf(" %.*s |", (int) lengths[i], row[i] ? row[i] : "NULL"); // 

				 }

				 printf("\n");

				 // --wyswietlanie

			

			}//while

			mysql_free_result(res); // zwalnia pamieć zajeta przez res

	   }//if		   

		   

mysql_close (conn); // zamyka połączenie z bazą, zwalnia pamiec po uchwycie

}



system("pause");

return 0;

}
Jeśli chodzi o dostępne funkcje, w dość przyjaznej formie można je znaleźć tutaj:
http://pl2.php.net/m...l/ref.mysql.php

Oczywiście możliwość odczytywania danych z bazy, daje już wystarczające narzędzia do próby napisania własnej aplikacji zapisującej bazę do pliku. phpMyAdmin dostarcza tego typu rozwiązania, więc może warto zaglądnąć w jego źródło ;) (nie jest to co prawda C++ ale PHP, mimo to zasada działania będzie podobna). Różnego rodzaju wyszukiwania itp. to jedynie konieczność zmiany określonego w programie zapytania.

Użytkownik bazy ma dostęp do niej całej. Taki użytkownik jest najczęściej administratorem serwisu, który "nakłada" witrynę na tę bazę w taki sposób, że każdy użytkownik witryny może wybierać jedynie spośród odpowiednio spreparowanych zapytań SQL. Niejednokrotnie Administrator serwisu sam korzysta z takiego systemu spreparowanych zapytań aby nie narobić niepotrzebnych szkód ;) babrając się bezpośrednio w bazie. To interfejs na podstawie weryfikacji loginu i hasła, określa możliwości użytkownika i możliwe do wykonania przez niego zapytania.
Jeśli chcesz podobną weryfikację zrobić z poziomu aplikacji, to oczywiście będzie trzeba jakoś sprawdzać poprawność wprowadzanych przez użytkownika danych (aby rozsądzić, czy jest to administrator, moderator itp.). Oczywiście przechowywanie hasła w niezabezpieczonej formie mija się z celem, ponieważ jego odczytanie przez osoby trzecie jest niezwykle łatwe. Rozwiązaniem jest tu kryptografia oparta o hash'owanie. Hash'owanie to kodowanie jednokierunkowe. Łańcuch znaków poddany działaniu algorytmu hash'ującego, daje w wyniku łańcuch znaków, który nie może być w żaden sposób odkodowany. Załóżmy że istnieje przekształcenie f(x) będące funkcją hash'ującą, gdzie x to łańcuch znaków. Jednokierunkowość oznacza w tym przypadku że dla f(x) = y, nie isnieje żadne znane g(y) dające w wyniku x. Obecnie najpopularniejszym algorytmem hash'ującym jest MD5 (polecam pogooglować ;)). Sprawdzanie polega na zasadzie:
1) użytkownik podaje hasło
2) hash = hashowanie_md5(haslo)
3) jeśli hash jest równy temu zapisanemu w bazie to znaczy, że hasło jest poprawne
*) Nie jest to oczywiście metoda bez żadnego ryzyka. Teoretycznie istnieje możliwość wygenerowania dużych zbiorów haseł i obliczenia dla nich hash'y, a tym samym szybkie odnalezienie szukanego hash'a pośród posegregowanych hash'y i odkrycie hasła. Ale to trochę trwa a kryptografia nie śpi.

Dla 5 znaków alfabetycznych odkrycie hasła tą metodą trwa kilka sekund stąd polecam korzystanie z w miarę wyszukanych haseł ;D

ps. A co takiego studiujesz? jeśli można wiedzieć 8)
  • 0
David Hilbert (1862-1943) wybitny niemiecki matematyk zapytany o jednego z byłych uczniów odpowiedział: "Ach, ten, został poetą. Na matematyka miał zbyt mało wyobraźni".

#3 niki87

niki87

    zła i wredna :)

  • $Jr Admin
  • Redaktor
  • 5953 postów
1512
Starszy Wykładowca II
  • Płeć:Kobieta

Napisano 25.07.2008 - 14:10

dzięki :( narazie spróbuje się "wgryść" w ten programik.. oczywiście w razie pytań będę je zadawała tutaj :)
no ja studiuje matematyke :D mój brat od października zaczyna informatyke i dlatego zaczął się interesować programowaniem, a ponieważ ja mam wieksze doświadczenie to sie mnie o to spytał, a ja nie wiedziałam to spytałam tutaj :)
  • 0

MimeTex
Regulamin
Klikając Posted Image mówisz DZIĘKUJĘ