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;