всем привет.
функция mysql_query(), согласно документации на mysql.ru, возвращает ноль в случае успешного выполнения запроса и не ноль в случае ошибки. если мы делаем запрос вида select field from table where id='7', то mysql_query() вернёт ноль даже если записи с таким id в таблице нет, ведь запрос был передан серверу и обработан, только никаких данных сервер не вернул. в этом случае mysql_store_result(), вызванная после mysql_query, падает в корку. как проверить наличие результата запроса перед вызовом mysql_store_result()?
работа с mysql в с
Модератор: Модераторы разделов
-
killdos
- Сообщения: 187
- Статус: Cклеротик
- ОС: FreeBSD, NetBSD, винда
работа с mysql в с
"UNIX is simple and coherent..." (c) Dennis Ritchie, "GNU's Not UNIX" (c) Richard Stallman
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: работа с mysql в с
это, насколько я понимаю, чистой воды баг·
попробуйте в соответствии с мануалом:
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 в с
да, я это пробовал
компилирую так: 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 результат такой же.
Код: Выделить всё
#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 в с
упс, вопрос был про c, а я отвечал про php…
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
deadhead
- Сообщения: 1913
- Статус: zzz..z
Re: работа с mysql в с
[x] close
-
killdos
- Сообщения: 187
- Статус: Cклеротик
- ОС: FreeBSD, NetBSD, винда
Re: работа с mysql в с
это есть, разумеется.
Код: Выделить всё
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 в с
Добавьте в команду компиляции Wall и если есть предупреждения постарайтесь исправить код.
-
killdos
- Сообщения: 187
- Статус: Cклеротик
- ОС: FreeBSD, NetBSD, винда
Re: работа с mysql в с
комментировал по очереди разные строки пока не заработало, потом раскоментировал в обратном порядке. теперь этот кусок кода в таком же состоянии, но работает и не падает. колдунство какое-то.
"UNIX is simple and coherent..." (c) Dennis Ritchie, "GNU's Not UNIX" (c) Richard Stallman