Nel mio pc ho un server LAMP su cui tengo una copia del sito e faccio esperimenti prima di portare on line le modifiche.
Mi domandavo: e se volessi manipolare il mio database mysql con un programma C? E' una cosa difficile da fare?
Ebbene, non è difficile . Sono incappato su questa ottima guida, di cui indico il link per esteso:
http://www.linuxdidattica.org
/docs/prg_C/cgiprg24.html
Da lì ho tratto questo ottimo codice, che è stato semplicissimo modificare per le mie esigenze:
#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
char* query = "SELECT * FROM nome_tabella;";
int i = 0, j = 0, n_rows = 0;
// 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;
}
printf ("Connessione avvenuta.n");
// 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 ("%sn", row[i++]); // visualizza il dato del campo
}
printf ("n");
}
mysql_free_result (result);
error:
mysql_close (&mysql); // chiusura del database
exit (EXIT_SUCCESS);
}
gcc -lmysqlclient -o mysqlapp prova_mysql.c
Quindi eseguite facendo, da shell:
./mysqlapp
A me funziona perfettamente, mostrandomi su shell tutto il contenuto della tabella indicata nella query :)