Pobieramy i wyświetlamy dane z bazy MySQL w C++
W poprzednim artykule, pokazałem jak należy połączyć się z serwerem bazodanowym bezpośrednio z poziomu kodu C++. Naszym celem jest jednak zaimplementowanie tego mechanizmu do zbudowanego wcześniej systemu rezerwacji biletów w kinie, aby to zrobić musimy jeszcze zapoznać się z tym jak pobrać i wyświetlić dane przechowywane w tabelach bazy MySQL.
Zaczniemy od rozbudowy ostatnio napisanego programu:
#include <iostream> #include <mysql.h> int main(int argc, const char * argv[]) { MYSQL mysql; mysql_init(&mysql); // incjalizacja if(mysql_real_connect(&mysql, "127.0.0.1", "root", "", "mysql", 0, NULL, 0)) printf("Połączenie z bazą danych MySQL nawiązano poprawnie!\n"); else printf("Błąd połączenia z bazą MySQL: %d, %s\n", mysql_errno(&mysql), mysql_error(&mysql)); mysql_close(&mysql); // zamknij połączenie return 0; }
Przede wszystkim będziemy potrzebowali zmiennej typu MYSQL_RES
do przechowywania wskaźnika identyfikującego zapytanie (id zapytania) oraz zmiennej typu MYSQL_ROW
do przechowywania pobranego wiersza z bazy.
MYSQL_RES *idZapytania; MYSQL_ROW wiersz;
Zanim przejdziemy dalej, musimy jeszcze określić nazwę bazy danych z której chcemy skorzystać (w moim przypadku będzie to domyślna baza tworzona podczas instalacji MySQL):
mysql_select_db(&mysql, "mysql");
Ogólna składnia:
mysql_select_db(MYSQL &mysql, "nazwaBazyDanych");
Przyszła pora na gwóźdź programu czyli wykonanie odpowiedniej kwerendy SQL. Robimy to przy pomocy funkcji mysql_query()
:
mysql_query(&mysql, "SELECT * FROM tabela");
Ogólna składnia:
mysql_query(MYSQL &mysql, "kwerenda" );
Będziemy jeszcze potrzebowali idZapytania
, pobierzemy go za pomocą funkcji mysql_store_result()
:
MYSQL_RES *idZapytania = mysql_store_result(&mysql);
Mamy już wszystkie potrzebne dane, musimy to jeszcze jakoś wyświetlić. Konkretny wiersz możemy pobrać za pomocą funkcji mysql_fetch_row()
, której jedynym argumentem jest właśnie uzyskane wcześniej idZapytania
:
MYSQL_ROW wiersz = mysql_fetch_row(idZapytania)
Aby dostać się do danych z konkretnej kolumny, zmienną wiersz traktujemy po prostu jak tablicę i w nawiasach kwadratowych podajemy numer kolumny (liczony od 0):
cout << wiersz[0];
Liczbę wszystkich kolumn możemy uzyskać za pomocą funkcji mysql_num_fields()
, której argumentem jest uzyskane wcześniej idZapytania
:
mysql_num_fields(idZapytania);
Teraz możemy wszystko „ładnie” opakować w pętlę while i wyświetlić:
while((wiersz = mysql_fetch_row(idZapytania)) != NULL) { for(int i = 0;i < mysql_num_fields(idZapytania); i++) cout << wiersz[i] << " "; cout << endl; }
Cały program:
#include <iostream> #include <mysql.h> using namespace std; int main(int argc, const char * argv[]) { MYSQL mysql; mysql_init(&mysql); // incjalizacja if(mysql_real_connect(&mysql, "127.0.0.1", "root", "", "mysql", 0, NULL, 0)) printf("Połączenie z bazą danych MySQL nawiązano poprawnie!\n"); else printf("Błąd połączenia z bazą MySQL: %d, %s\n", mysql_errno(&mysql), mysql_error(&mysql)); MYSQL_RES *idZapytania; MYSQL_ROW wiersz; mysql_select_db(&mysql, "mysql"); mysql_query(&mysql, "SELECT * FROM help_category LIMIT 5" ); idZapytania = mysql_store_result(&mysql); while((wiersz = mysql_fetch_row(idZapytania)) != NULL) { for(int i = 0;i < mysql_num_fields(idZapytania); i++) cout << wiersz[i] << " "; cout << endl; } mysql_close(&mysql); // zamknij połączenie return 0; }
Przykładowy rezultat wykonania powyższego kodu:
Połączenie z bazą danych MySQL nawiązano poprawnie!
1 Geographic 0
2 Polygon properties 35
3 WKT 35
4 Numeric Functions 39
5 Plugins 36
A wiesz może jak zapisać wynik zapytania w zmiennej (np. nick w string, a wynik w int)?
Spoko już umiem. Dla osób, którym też to nie wychodziło:
string nick; nick = wiersz[i];
Dzięki za pomoc, świetny poradnik, tylko chciałem zwrócić uwagę na to, że ten kod nie każdemu będzie działać, bo u ciebie jest MYSQL mysql; a mnie działa MYSQL *mysql; poza tym przy moim sposobie nigdzie nie można używać &mysql tylko mysql;