Se connecter / S'enregistrer
Votre question

Projet en C avec du CGI et base Mysql

Tags :
  • MySQL
  • Programmation
Dernière réponse : dans Programmation
1 Avril 2005 12:18:08

Bonjour j'ai un projet a rendre pour la fin de l'année en C utilisant une base MySQL et du CGI pour faire un interface web, j'essaye d'établir une connexion a ma base de données, la compilation se passe bien, mais le prog ne marche pas. J'ai du mal a trouver de l'aide sur le C couplé avec MySQL, ne serait-ce que pour trouver une sorte de mode opératoire pour par la suite faire des requetes...
Si des fois vous auriez des référence à me filer ca serait sympathique.
Merci d'avance...

Autres pages sur : projet cgi base mysql

1 Avril 2005 19:04:46

salut cowboybebop95,

qu'appeles tu : "le prog ne marche pas"
si ca compile c'est que tu as deja toutes les lib necessaires.
c'est deja un debut
ensuit

que fais-tu ?

exemple :

Citation :

MYSQL *xmysql_real_connect(MYSQL *mysql)
{
MYSQL *connection;

if (!(connection = mysql_real_connect(mysql, HOSTNAME, USERNAME, PASS,
DB, 0, NULL, 0)))
{
printf("%s\n", mysql_error(mysql));
exit(1);
}
return (connection);
}

MYSQL_RES *xmysql_query(MYSQL *connection, char *query)
{
MYSQL_RES *result;

if (mysql_query(connection, query))
{
printf(mysql_error(connection));
exit(1);
}
free(query);
result = mysql_store_result(connection);
return (result);
}

void fonction(MYSQL *mysql)
{
MYSQL *connection;
MYSQL_RES *result;
MYSQL_ROW result_row;
char *query;

connection = xmysql_real_connect(mysql);
query = "SELEC * FROM `truc`";
result = xmysql_query(connection, query);
while ((result_row = mysql_fetch_row(result)) != NULL)
printf("%s\n", result_row[0]);
mysql_free_result(result);
mysql_close(connection);
}

int main(int ac, char **av)
{
MYSQL mysql;

mysql_init(&mysql);
fonction(&mysql);
}


remplace le SELEC par SELECT :D 
met les lib etc.. fait en sorte que ca compile
et dit moi ce que ca donne

ciao
1 Avril 2005 21:48:59

Bien en fait moi j'avais juste tester une simple connexion avec un printf pour voir si ca marche mais je n'ai jms le message du printf qui s'affiche le programme se referme de suite apres. Au debut j'avais des problemes de socket et ca venais du fait que j'avais pas bien faitl es liens vers les librairies mais le probleme est resolu. Sinon voila mon script initial :

#include <stdio.h>
#include <stdlib.h>
#include <libmySQL.h>

int main()
{
MYSQL *mySQL;
MYSQL_RES *myRES;
MYSQL_ROW myROW;

mySQL = mysql_init(mySQL);
printf("<p>bonjour, test d'affichage</p>");
mysql_real_connect(mySQL,"localhost","login","paaswd","cuisine",0,NULL,0);
printf("<p>Connexion reussite établie</p>");
}

est le compte login:p asswd existe bien sur ma base mysql et pour les librairies je les ai pris sur le sites de mysql sinon aussi merci bcp pour l'exemple type ca va bcp m'aider :-D :-D :-D
Contenus similaires
1 Avril 2005 22:15:40

Pour voir le résultat dans ton navigateur, tu dois envoyer les en-têtes de réponse HTTP avant tout contenu (cf. protocole HTTP) sinon, pour pouvoir aussi tester en ligne de commande il te faut le fameux "\n" en fin de chaine.

;-)
1 Avril 2005 22:23:25

Bien le \n ne change pas grand chose ce n'est qu'un retour chariot, meme si j'enleve les balise <p> </p> pour faire un simple test en mode console cela me donne le meme resultat : aucun affichage de test donc je pense que je dois avois un probleme dans la construction de mes pointeurs ou qlq chose comme ca... sinon j'ia deja fait des simples scripts en CGI et cela marche parfaitement. :-D :-D
1 Avril 2005 22:29:27

le fameux \n change carement grand chose.
ton printf bufferise ta chaine de caractere mais ne l'affiche pas

si tu veu l'afficher
soit tu met un \n
soit tu fait un fflush(0);
1 Avril 2005 22:33:57

mais du texte brut dans du print sans mettre de \n permet quand me de l'afficher non ?
1 Avril 2005 22:41:02

j'ai reduit le script au minimum mais tjs le meme resultat :

#include <stdio.h>
#include <stdlib.h>
#include <libmySQL.h>

int main()
{
MYSQL *mySQL;

mySQL = mysql_init(mySQL);
printf("bonjour, test d'affichage\n");
mysql_real_connect(mySQL,"localhost","login","paaswd","cuisine",0,NULL,0);
printf("Connexion reussite établie\n");
}
1 Avril 2005 22:55:03

Il faut tester le retour de mysql_real_connect qui renvoie NULL lorsque la connexion n'est pas établie.

Si ton exécutable n'affiche rien c'est qu'il se plante avant. Sinon l'ultime test reste :

  1. #include <stdio.h>
  2.  
  3. void main(){
  4. printf("Hello World\n");
  5. }


:-)
1 Avril 2005 22:58:32

En fait, il faut que tu alloues la structure MYSQL.
mysql_init ne fait pas l'allocation pour toi :

MYSQL maConnexion;
mysql_init(&maConnexion);

(J'avais bon ca se plante avant ...
:-D )
2 Avril 2005 00:11:15

Mais j'ai deja ces deux lignes la, ca ne suffit pas ?

MYSQL *mySQL;

mySQL = mysql_init(mySQL);

Le type est obligatoirement un pointeur donc je ne comprends pas pourquoi as tu mis un "&", je passe l'adresse du pointeur ca voudrait dire ?
2 Avril 2005 01:17:28

en fait la tu a alloouer un pointeur sur MYSQL

ok c'est cool

mais ton mySQL c'est pas alouer en tant que MYSQL

c'est pour ca que tu declare un
MYSQL mySQL; -> ca permet de l'allouer

et tu balance son addresse a mysql_init
mysql_init(&mySQL);


edit : ou alors j'ai pas test mais je viens de voir que tu peut peu etre faire
mySQL = mysql_init(NULL);

en l'ayant declarer en tant que pointeur
2 Avril 2005 02:01:59

Je crois que tu as trouver la solution il fallait que je mette NULL et non pas ma variable dans le mysql_init ben voila au moin maintenant j'ai ma connexion, avec la partie de script que tu m'as passé pour faire mes requete ca devrait etre bon maintenant je crois que je suis pret a me lancer dans le grand bain de la programmation en C (que du bonheur lol)
2 Avril 2005 09:37:15

Je veux pas faire un cours de C mais à mon humble avis il est essentiel en C de bien saisir la notion de pointeur et d'adresse :

"Un pointeur est une zone mémoire qui contient l'adresse d'une autre zone mémoire."
Donc la fonction mysql_init attend comme paramètre 'le contenu' de la variable mySQL donc : l'adresse de la zone mémoire.
Tu peux donc faire une allocation dynamique de la zone en utilisant un pointeur:
MYSQL *mySQL;
mySQL = malloc(sizeof(MYSQL));
mysql_init(mySQL);

Ou passer directement un adresse :
MYSQL mySQL;
mysql_init(&mySQL);

Codex a trouvé une troisième solution qui dépend elle du mode de fonctionnement de mysql_init (a savoir quand on lui passe NULL elle alloue dynamiquement la zone et retourne l'adresse) :

MYSQL *mySQL;
mySQL = mysql_init(NULL);


Remarque : perso pour ne pas confondre un pointeur avec autre chose, je préfixe son nom avec 'p' :
MYSQL * pMaBase;
MYSQL MaBase;

Ouff, je suis en forme ce matin ...
3 Avril 2005 01:09:45

C'est pas la question de faire un cours sur le C, le probleme était juste de savoir quelle était la bonne structure a avoir concernant la declaration et l'initialisation pour les struct. et autres Mysql.
En tt cas merci et en cas de soucis j'hésiterai pas a re-poster a nouveau.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS