[successivo] [precedente] [inizio] [fine] [indice generale] [parte]
MySQL è un server SQL molto usato dagli ISP per la sua velocità di esecuzione e la semplicità di gestione. Il file per lo sviluppo di applicazioni vengono generalmente distribuiti con il pacchetto mysql-devel
. In esso vi sono le librerie a runtime libmysqlclient.so
e i file di include nella directory /usr/include/mysql
.
La libreria è completa; con essa è semplice aprire una connessione ad un database, operare con le query e distribuire le righe in array di caratteri.
Per la corretta installazione del pacchetto di sviluppo fare sempre riferimento alla distribuzione Linux che avete installato. Anche la posizione dei file, come delle librerie potrebbe variare. |
Questo file contiene la definizione dei tipi e dei prototipi delle funzioni della libreria libmysql. Non tutte le funzioni sono indispensabili, a volte sono ridondanti o superate da altre inserite di recente. MySQL è un database in costante aggiornamento per questo alcune funzioni potrebbero non scomparire ma diventare obsolete.
Tipi di dati
Alcune funzioni
Ogni progetto dovrà necessariamente caricare il file mysql.h
mentre il linker dovrà richiamare la libreria libmysqlclient.so
Gli esempi della dispensa possono essere tutti compilati con il comando seguente:
$
gcc -o esempio esempio.c -L/usr/lib/mysql -lmysqlclient
[Invio]
Gli esempi qui proposti si limitano a spiegare la procedura per effettuare una connessione corretta ad un server MySQL e prelevare i dati dalle tabelle in un database.
Gli esempi nei listati 15.1 e 15.2 mostrano due procedure diverse per effettuare una corretta connessione ad un server MySQL.
Il secondo metodo è da preferire al primo oramai obsoleto.
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> const char* host = "localhost"; // host di connessione const char* database = "mydb"; // database di connessione const char* db_user = "myuser"; // nome utente per la connessione const char* db_pass = "mypass"; // password non cifrata int main () { MYSQL mysql; // restituisce NULL se non avviene con successo if (! mysql_connect (&mysql, host, db_user, db_pass)) { printf ("Errore nella connessione.\n"); exit (EXIT_FAILURE); } // restituisce zero se avviene con successo if (mysql_select_db (&mysql, database)) { printf ("Errore nella selezione del database.\n"); exit (EXIT_FAILURE); } printf ("Connessione avvenuta.\n"); // chiude le risorse mysql_close (&mysql); exit (EXIT_SUCCESS); } |
I campi host, database, db_user e db_pass contengono le informazioni rispettivamente del nome dell'host, del nome del database e, se presenti, la username e la password per accedervi. Il tipo è rappresentato da un puntatore a caratteri o eventualemente da un array sempre di caratteri.
La funzione mysql_connect accetta in ordine queste ultime quattro variabili e restituisce il puntatore alla variabile mysql associata alla struttura MYSQL o NULL se in presenza di errore.
In tutti gli esempi è indispensabile cambiare i valori delle variabili precedenti ed inserire campi accettabili per il database MySQL con cui si sta lavorando. |
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> const char* host = "localhost"; // host di connessione const char* database = "mydb"; // database di connessione const char* db_user = "myuser"; // nome utente per la connessione const char* db_pass = "mypass"; // password non cifrata int main () { MYSQL mysql; // restituisce NULL se non avviene con successo if (! mysql_init (&mysql)) { printf ("Errore nella allocazione di memoria.\n"); exit (EXIT_FAILURE); } if (! mysql_real_connect (&mysql, host, db_user, db_pass, "", 0, NULL, 0)) { printf ("Errore nella connessione.\n"); exit (EXIT_FAILURE); } // restituisce zero se avviene con successo if (mysql_select_db (&mysql, database)) { printf ("Errore nella selezione del database.\n"); exit (EXIT_FAILURE); } printf ("Connessione avvenuta.\n"); // chiude le risorse mysql_close (&mysql); exit (EXIT_SUCCESS); } |
La funzione mysql_select_db accetta come primo argomento il puntatore alla variabile associata alla struttura MYSQL, il secondo argomento è il puntatore alla variabile che contiene il nome del database dove accedere. La funzione ritorna il valore 0 in caso di successo.
La funzione mysql_close chiude la connessione e libera le risorse allocate in precedenza.
Per quanto concerne il listato 15.2 potremmo affermare che l'apertura del database può essere effettuata direttamente con mysql_real_connect oppure in un secondo momento con mysql_select_db. È una questione di semplicità e di stile.
Il programma in listato 15.4 esegue una semplice query; più complesso è invece l'esempio in listato 15.5 dove la query ritorna delle righe che, una volta memorizzate, vengono visualizzate.
Nel primo programma viene creata una tabella con nome logins con tre campi per memorizzare informazioni, del tutto generiche, relative ai dati personali di un utente.
La tabella, una volta creata andrebbe popolata con dei valori. In questo caso consiglio di utilizzare il programma mysql o modificare per esercizio il listato 15.4; in ogni caso la stringa della query dovrà essere la seguente:
INSERT INTO logins ('<var>nome</var>', '<var>cognome</var>', '<var>email</var>'); |
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> const char* host = "localhost"; // host di connessione const char* database = "mydb"; // database di connessione const char* db_user = "myuser"; // nome utente per la connessione const char* db_pass = "mypass"; // password non cifrata int main() { MYSQL mysql; char* query = "CREATE TABLE logins (firstname CHAR (30), lastname CHAR (30), email CHAR (20));"; // restituisce NULL se non avviene con successo if (! mysql_init (&mysql)) { printf ("Errore nella allocazione di memoria.\n"); exit (EXIT_FAILURE); } if (! mysql_real_connect (&mysql, host, db_user, db_pass, "", 0, NULL, 0)) { printf ("Errore nella connessione.\n"); goto error; } // restituisce zero se avviene con successo if (mysql_select_db (&mysql, database)) { printf ("Errore nella selezione del database.\n"); goto error; } // esegue la query if (mysql_query (&mysql, query)) { printf("Errore nella query.\n"); } error: mysql_close (&mysql); // chiusura del database exit (EXIT_SUCCESS); } |
La funzione mysql_query ritorna un valore diverso da 0 se avviene un errore durante l'esecuzione della query.
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> const char* host = "localhost"; // host di connessione const char* database = "mydb"; // database di connessione const char* db_user = "myuser"; // nome utente per la connessione const char* db_pass = "mypass"; // password non cifrata int main() { MYSQL mysql; MYSQL_ROW row; // la riga MYSQL_RES* result; MYSQL_FIELD* field; // il campo ritornato int i = 0, j = 0, n_rows = 0; char* query = "SELECT * FROM logins;"; // restituisce NULL se non avviene con successo if (! mysql_init (&mysql)) { printf ("Errore nella allocazione di memoria.\n"); exit (EXIT_FAILURE); } if (! mysql_real_connect (&mysql, host, db_user, db_pass, "", 0, NULL, 0)) { printf ("Errore nella connessione.\n"); goto error; } // restituisce zero se avviene con successo if (mysql_select_db (&mysql, database)) { printf ("Errore nella selezione del database.\n"); goto error; } // esegue la query if (mysql_query (&mysql, query)) { printf("Errore nella query.\n"); goto error; } result = mysql_store_result (&mysql); n_rows = mysql_num_rows (result); for (j = 0; j < n_rows; j++) { i = 0; mysql_field_seek (result, 0); // sposta a inizio riga row = mysql_fetch_row (result); // preleva i dati della riga while ((field = mysql_fetch_field (result))) { printf ("%s: ", field->name); // visualizza il campo printf ("%s\n", row[i++]); // visualizza il dato del campo } printf ("\n"); } mysql_free_result (result); error: mysql_close (&mysql); // chiusura del database exit (EXIT_SUCCESS); } |
Il programma in listato 15.5 memorizza i dati della query nella variabile result. Quest'ultima, che è un puntatore ad una struttura MYSQL_RES, è necessaria per prelevare ciclicamente i dati dei campi (nome, cognome e email) ed il loro contenuto.
Ad ogni ciclo è necessario riposizionare il cursore dei campi ad inizio riga con mysql_field_seek.
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome mysql.html