Mysql et C (débutant)[Résolu]

Bonjour,
je cherche à me connecter à une base de données Mysql par un petit programme en C. Dans un éditeur de texte, j’ai tapé le code suivant:[code]
#include <stdio.h>
#include <mysql/mysql.h>
#include <stdlib.h>

int main(void)
{
MYSQL *mysql;
MYSQL_RES *res;
MYSQL_ROW row;

int i,j;
int n_rows=0;

mysql_init(mysql);

printf("%s %s\n",(!mysql_real_connect(mysql,“localhost”,“root”,"----",“mysql”,0,NULL,0)?"Error connection at database: ":“Connected…\n”),mysql_error(mysql));

printf(“Sélection de la base …\n”);

if (mysql_select_db(mysql,“mysql”))
{
printf(“Accès à la base impossible !\n”);
return(1);
}
printf(“Base sélectionnée.\n”);

res = mysql_list_tables(mysql, NULL);

if (res)
{
for(i = 0; i < res->row_count; i++)
{
row = mysql_fetch_row(res);
for(j = 0; j < mysql_num_fields(res); j++)
{
printf("%s\n", row[j]);

    }
}
mysql_free_result(res);

}

printf("\nDeconnexion en cours …\n");
mysql_close(mysql);
printf(“Déconnecté.\n”);
return(0);

}[/code]

Après compilation voilà ce que j’obtiens :

[code]root@serveur:/home/serveur# cc essai4.c -lmysqlclient -o interface
root@serveur:/home/serveur# ./interface
Connected…

Sélection de la base …
Base sélectionnée.
columns_priv
db
func
help_category
help_keyword
help_relation
help_topic
host
proc
procs_priv
tables_priv
time_zone
time_zone_leap_second
time_zone_name
time_zone_transition
time_zone_transition_type
user

Deconnexion en cours …
Erreur de segmentation (core dumped)
[/code]

Je ne sais pas pourquoi j’ai cette erreur de segmentation !!!
Merci pour vos réponses !

Tu as mis un espace à la fin de ton fichier, après l’acolade ?

Des fois cela peut poser problème…

Tu n’as pas fait d’allocation mémoire pour ta base:

Au lieu de

MYSQL *mysql;
met

MYSQL mysql;
et remplace par la suite MYSQL par &MYSQL

Ca, c’est plus du C, mais du C++, il me semble.
En C, ça serait plutôt:

:slightly_smiling: je ne connais pas bien le C++. En C ça marche bien chez moi ce que j’ai suggéré.

MYSQL mysql;

crée un objet de type MYSQL et de la taille donnée. Mais ta solution est plus élégante.

J’ai trouver d’où vient mon problème. En effet, la ligne suivante n’est pas bonne:

mysql_init(mysql);
il faut la remplacer par mysql=mysql_init(NULL);
maintenant je n’est plus de problème de segmentation.

[code]root@serveur:/home/serveur# ./interface localhost root ---- postfix domain
Connected…

Sélection de la base …
Base sélectionnée.

La base contient les tables suivantes:
alias
domain
mailbox

La table selectionnée contient les lignes suivantes:
La ligne n° 0: test 1
La ligne n° 1: alban 1

Nombre de champs de la table: 2

Le champ domain est de type 253
Le champ actif est de type 1

Deconnexion en cours …
Déconnecté.
root@serveur:/home/serveur#
root@serveur:/home/serveur#
[/code]

Merci pour vos réponses ! :smiley:

Pour info, mysql_close fait bien le free(mysql), j’ai vérifié, mais il faut toujours vérifier la libération d’un objet du tas.

PS, tu peux directement faire ton initialisation lors de la déclaration:

[quote=“mattotop”]Ca, c’est plus du C, mais du C++, il me semble.
En C, ça serait plutôt:

non.

MYSQL c’est une structure. C’est comme faire:

typdef struct a_s {
  int b;
} a_t;

/* ça reste parfaitement valide, on alloue en "statique"! */
a_s boo;
boo.b = 2;

/* On peut aussi faire une alloc dynamique */
a_t *boo = malloc(sizeof(a_t));
boo->b = 2;
free(boo);

ben oui, c’est ce que j’ai dit, non ? Ou est la difference ?

Nan, mais ce que je veux dire, c’est que ça n’a rien a voir avec le C++ !!

Bah les réfèrences, il me semblait que c’était une invention C++, mais si tu le dis.