Avatar billede nomak Nybegynder
29. april 2003 - 09:52 Der er 12 kommentarer og
1 løsning

mysql_execute() - C API

Hey Experter.. Har lidt problemer med mysql_execute i mit C program, så håber på at der er nogle MySQL hajer her :)

sådan ser min funktion ud..


int do_sql(char buffer[4000])
{
    MYSQL* mysql_handle = mysql_init(NULL);

    if(mysql_handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    if(!mysql_real_connect(mysql_handle, "localhost", "root", "det_er_jo_lige_det:P", "ja", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    mysql_execute(buffer);

    if (mysql_error(mysql_handle)) {
        printf("%s\n", mysql_error(mysql_handle));
    }

    return 1;
}


men det giver en fejl..
-bash-2.05b$ cc -o server -lm -lz server.c /usr/local/lib/mysql/libmysqlclient.a
/tmp/cczN7rHy.o: In function `do_sql':
/tmp/cczN7rHy.o(.text+0xfac): undefined reference to `mysql_execute'
-bash-2.05b$
Avatar billede erikjacobsen Ekspert
29. april 2003 - 09:56 #1
Avatar billede nomak Nybegynder
29. april 2003 - 10:07 #2
mysql_query understøtter ikke UPDATE, INSERT og DELETE..
Avatar billede erikjacobsen Ekspert
29. april 2003 - 10:13 #3
ikke?
Avatar billede nomak Nybegynder
29. april 2003 - 10:24 #4
nope.. det giver en Segmentation fault (core dumped)
Avatar billede nomak Nybegynder
29. april 2003 - 10:28 #5
se evt. http://www.mysql.com/doc/en/mysql_execute.html

men kan ikke finde hoved og hale i det..
Avatar billede erikjacobsen Ekspert
29. april 2003 - 11:02 #6
Bruger du "prepared statements" ? Det er vist hvad mysql_execute kan.
int mysql_execute(MYSQL_STMT *stmt.  <- betyder jo, at den ikke tager
en streng (char-buffer) som argument.

At mysql_query giver segmentation fault må skyldes noget andet.
Avatar billede nomak Nybegynder
29. april 2003 - 11:35 #7
MYSQL_ROW fetch_sql(char buffer[4000])
{
    MYSQL* mysql_handle = mysql_init(NULL);
    MYSQL_RES *result;
    MYSQL_ROW row;

    int num_fields;
    int i;
    char* output;
   
    if(mysql_handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    if(!mysql_real_connect(mysql_handle, "localhost", "root", "jaaa", "hmmm", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    mysql_query(mysql_handle, buffer);

    if (mysql_error(mysql_handle)) {
        printf("%s\n", mysql_error(mysql_handle));
    }

    result = mysql_store_result(mysql_handle);
    num_fields = mysql_num_fields(result);

    row = mysql_fetch_row(result);

    return row;
}

sådan ser min funktion ud..
Avatar billede erikjacobsen Ekspert
29. april 2003 - 12:54 #8
Umiddelbart ser det korrekt ud. Hvilken linie går den ned på?
Avatar billede nomak Nybegynder
29. april 2003 - 14:01 #9
har prøvet udelukkelsesmetoden.. den ser ud til at fejle i første linie af funktionen..

MYSQL* mysql_handle = mysql_init(NULL);
Avatar billede erikjacobsen Ekspert
29. april 2003 - 14:10 #10
Så dette giver din fejl:

int do_sql(char buffer[4000])
{
    MYSQL* mysql_handle = mysql_init(NULL);

    if(mysql_handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }
}

?? Det er da mystisk.
Avatar billede nomak Nybegynder
29. april 2003 - 14:10 #11
har lavet et lille test program..

#include <stdio.h>
#include <string.h>
#include "/usr/local/include/mysql/mysql.h"

MYSQL_ROW fetch_sql(char buffer[4000])
{
    MYSQL* mysql_handle = mysql_init(NULL);
    MYSQL_RES *result;
    MYSQL_ROW row;

    int num_fields;
    int i;
    char* output;
   
    if(mysql_handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    if(!mysql_real_connect(mysql_handle, "localhost", "root", "jojo", "ok", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    mysql_query(mysql_handle, buffer);

    if (mysql_error(mysql_handle)) {
        printf("%s\n", mysql_error(mysql_handle));
    }

    result = mysql_store_result(mysql_handle);
    num_fields = mysql_num_fields(result);

    row = mysql_fetch_row(result);

    return row;
}

int main(void) {
    MYSQL_ROW test;
    char sql[500];
    sprintf(sql, "UPDATE chat_users SET pass='hej' WHERE nick='NoMak'");

    test = fetch_sql(sql);
    return 1;
}

det virker fint med en SELECT
Avatar billede erikjacobsen Ekspert
29. april 2003 - 14:11 #12
Ok, men der står jo i manualen at du íkke skal prøve på  mysql_store_result
hvis det ikke er en SELECT.
Avatar billede nomak Nybegynder
29. april 2003 - 14:14 #13
Never mind.. funktionen skulle bare skrives lidt om til at virke med UPDATE da det ikke giver noget resultat..

således:

int do_sql(char buffer[4000])
{
    MYSQL* mysql_handle = mysql_init(NULL);

    if(mysql_handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    if(!mysql_real_connect(mysql_handle, "localhost", "root", "asdasd", "asdasd", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(mysql_handle));
        exit(1);
    }

    mysql_query(mysql_handle, buffer);

    if (mysql_error(mysql_handle)) {
        printf("%s\n", mysql_error(mysql_handle));
    }

    return 1;
}

:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester