работа с mysql в с

Модератор: Модераторы разделов

Аватара пользователя
killdos
Сообщения: 187
Статус: Cклеротик
ОС: FreeBSD, NetBSD, винда

работа с mysql в с

Сообщение killdos »

всем привет.

функция mysql_query(), согласно документации на mysql.ru, возвращает ноль в случае успешного выполнения запроса и не ноль в случае ошибки. если мы делаем запрос вида select field from table where id='7', то mysql_query() вернёт ноль даже если записи с таким id в таблице нет, ведь запрос был передан серверу и обработан, только никаких данных сервер не вернул. в этом случае mysql_store_result(), вызванная после mysql_query, падает в корку. как проверить наличие результата запроса перед вызовом mysql_store_result()?
"UNIX is simple and coherent..." (c) Dennis Ritchie, "GNU's Not UNIX" (c) Richard Stallman
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: работа с mysql в с

Сообщение sash-kan »

killdos писал(а):
03.08.2011 12:22
в этом случае mysql_store_result(), вызванная после mysql_query, падает в корку
это, насколько я понимаю, чистой воды баг·
попробуйте в соответствии с мануалом:
QUOTE писал(а):If you want to know whether the statement should return a result set, you can use mysql_field_count() to check for this.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
killdos
Сообщения: 187
Статус: Cклеротик
ОС: FreeBSD, NetBSD, винда

Re: работа с mysql в с

Сообщение killdos »

да, я это пробовал

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"

MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
char* table[]={"one", "two", "three"};
. . .

char* getfield(int id) {
    char* query;
    int i;
    sprintf(query,"select field from %s where id='%d'", table[2], id);
    if(mysql_query(&mysql,query) > 0) exit(1);
    if(mysql_field_count(&mysql) == 0) exit(2);
    printf("Сейчас будет mysql_store_result"); /* это сообщение выводится во время работы программы */
    result=mysql_store_result(&mysql);              /* в этом месте Segmentation fault */
    printf("mysql_store_result отработала");     /* это сообщение уже не выводится */
    row=mysql_fetch_row(result);
    return row[0];
}

. . .

компилирую так: cc -o sql -I/usr/local/include/mysql -Wl,-R/usr/local/lib/mysql -L/usr/local/lib/mysql -lm -lmysqlclient sql.c
ОС NetBSD 5.1 x86_64

на FreeBSD 8.2 x86 результат такой же.
"UNIX is simple and coherent..." (c) Dennis Ritchie, "GNU's Not UNIX" (c) Richard Stallman
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: работа с mysql в с

Сообщение sash-kan »

упс, вопрос был про c, а я отвечал про php…
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: работа с mysql в с

Сообщение deadhead »

killdos писал(а):
03.08.2011 18:27
да, я это пробовал

mysql_init()?
[x] close
Спасибо сказали:
Аватара пользователя
killdos
Сообщения: 187
Статус: Cклеротик
ОС: FreeBSD, NetBSD, винда

Re: работа с mysql в с

Сообщение killdos »

deadhead писал(а):
03.08.2011 21:41
mysql_init()?

это есть, разумеется.

Код: Выделить всё

int main()
{
        char* fp;
        mysql_init(&mysql);
        mysql_real_connect(&mysql,dbhost,dbuser,dbpass,"",dbport,NULL,0);
        mysql_select_db(&mysql,dbname);

        fp=getfield(15);

. . .
}


поле field типа varchar(70)
"UNIX is simple and coherent..." (c) Dennis Ritchie, "GNU's Not UNIX" (c) Richard Stallman
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: работа с mysql в с

Сообщение IMB »

Добавьте в команду компиляции Wall и если есть предупреждения постарайтесь исправить код.
Спасибо сказали:
Аватара пользователя
killdos
Сообщения: 187
Статус: Cклеротик
ОС: FreeBSD, NetBSD, винда

Re: работа с mysql в с

Сообщение killdos »

комментировал по очереди разные строки пока не заработало, потом раскоментировал в обратном порядке. теперь этот кусок кода в таком же состоянии, но работает и не падает. колдунство какое-то.
"UNIX is simple and coherent..." (c) Dennis Ritchie, "GNU's Not UNIX" (c) Richard Stallman
Спасибо сказали: