Postat initial pe http://www.skullbox.info/board/accesarea-u...in-c-t4493.html
Notiuni introductive privind accesarea unei baze de date MYSQL din C
Acest tutorial presupune ca folositi sistemul de operare Linux (desi exemplele ar trebui sa se compileze si pe Windows).
Mai presupun si ca server-ul MYSQL este instalat si, de asemenea, ca libraria client (utilizata pentru
a scrie programe client care sa acceseze serverul) este instalata
Tutorialul se adreseaza incepatorilor.
A. Pornirea si oprirea server-ului MYSQL
Inainte de a accesa o baza de date MYSQL trebuie, evident, sa pornim serverul mysql.
Deschideti o console si executati:
%> sudo /etc/init.d/mysql start
Password: xxxxx
* Starting MySQL database server mysqld [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.
Inlocuiti "xxxxx" cu parola de root
Oprirea server-ului MYSQL:
sudo /etc/init.d/mysql stop
* Stopping MySQL database server mysqld [ OK ]
Verificarea daca server-ul MYSQL este pornit:
%> sudo mysqladmin -p ping
Password:
Enter password:
mysqld is alive
B. Api-ul client pentru MYSQL (in limbajul C)
Functii importante:
const char *mysql_get_client_info(void)
Returneaza un string care reprezinta versiunea librariei client
MYSQL *mysql_init(MYSQL *mysql)
Initializeaza un obiect MYSQL ce va fi folosit ulterior pentru conexiunea la server.
Daca parametrul "mysql" este NULL, atunci se aloca un nou obiect MYSQL inainte de initializare si se intoarce un pointer la el
Daca parametrul "mysql" nu este NULL, atunci obiectul pasat se reinitializeaza si se intoarce un pointer la acelasi obiect
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
Aceasta este functia utilizata in programul client pentru conectarea la serverul MYSQL
mysql - pointer la un obiect MYSQL, obtinut in urma unui apel al functiei mysql_init()
host - un sir care contine adresa server-ului (hostname sau IP). Daca host contine sirul "localhost" sau este NULL, se presupune ca programul client si server-ul se afla pe aceeasi masina
user - un sir de caractere care contine username-ul folosit pentru conectarea la server. Daca este NULL sau contine "", se presupune ca user-ul
este cel curent
passwd - parola folosita de "user" pentru conectarea la server
db - numele bazei de date care va fi folosita in mod implicit
port - daca nu este 0, specifica portul pe care clientul va incerca sa il foloseasca pentru a se conecta la server
unix_socket - daca nu este NULL, specifica socket-ul (unix domain) sau pipe-ul folosit pentru comunicarea intre server si client
client_flag - folosit pentru a seta diverse flag-uri, de exemplu daca pachetele transferate intre client si server vor fi comprimate (folosind Zlib), sau daca se foloseste SSL
Functia intoarce un pointer catre un obiect MYSQL care va fi folosit ca un "handle" pentru comunicatia viitoare intre client si server.
Daca functia esueaza se intoarce NULL
int mysql_query(MYSQL *mysql, const char *stmt_str)
Functia este folosita de catre client pentru interogarea bazei de date
mysql - un obiect MYSQL valid obtinut in urma unui apel mysql_real_connect care a reusit
stmt_str - un string care reprezinta interogarea SQL ce va fi transmisa server-ului pentru a fi executata pe o baza de date. Se pot specifica mai multe "statement-uri" SQL separate prin caracterul ';'
Daca interogarea a reusit se intoarce 0, altfel se intoarce o valoare diferita de 0
MYSQL_RES *mysql_store_result(MYSQL *mysql)
Dupa apelul mysql_query() sau mysql_real_query() trebuie apelata functia mysql_store_result(). Aceasta intoarce un pointer la un obiect MYSQL_RES, care va fi folosit pentru extragerea rezultatului interogarii
Se intoarce NULL daca functia esueaza
unsigned int mysql_num_fields(MYSQL_RES *result)
Returneaza numarul de coloane returnat in urma unui apel mysql_store_result()
result - este un pointer catre un obiect MYSQL_RES, intors de exemplu de catre functia mysql_store_result()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Extrage urmatoarea linie din set-ul resultat in urma executiei unei interogari SQL
result - un pointer la un obiect MYSQL_RES obtinut de exemplu in urma executiei unui apel mysql_store_result()
Functie intoarce o structura de tip MYSQL_ROW folosita pentru a accesa urmatoare linie a setului. Se intoarce NULL daca am ajuns la sfarsitul setului
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
Functia este utilizata pentru a obtine informatii despre o coloana apartinant unui set rezultat in urma executiei unei interogari SQL
result - un pointer la un obiect MYSQL_RES obtinut de exemplu in urma executiei unui apel mysql_store_result()
Functie intoarce o structura de tip MYSQL_FIELD folosita pentru a accesa informatii despre o coloana din set. Functia intoarce NULL cand s-au parcurs deja toate coloanele setului
void mysql_free_result(MYSQL_RES *result)
Dezaloca resursele asociate unui obiect MYSQL_RES
result - un pointer la un obiect MYSQL_RES obtinut de exemplu in urma executiei unui apel mysql_store_result()
void mysql_close(MYSQL *mysql)
Inchide conexiunea catre server
mysql - un obiect de tip MYSQL folosit pentru comunicatia intre client si server (obtinut, de exemplu, in urma unui apel mysql_real_connect())
Bun, aceste sunt functiile principale ale API-ului. Sa vedem cum sunt folosite in programe practice.
C) Exemple de programe client
Asigurati-va ca sever-ul MYSQL este pornit inainte sa executati programele demonstrative ce vor urma
Programele client trebuie sa include urmatoarele header-e: "my_global.h" si "mysql.h"
C.1) Aflarea versiunii clientului
/* versiune_client.c */
#include <stdio.h>
#include <stdlib.h>
#include <my_global.h>
#include <mysql.h>
int main()
{
?