Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Подключение к MySQL из С


Автор: Chuck 25.1.2005, 20:38
Привет, не могу скомпилить прогу, которая коннектится к MySQL серваку!
Код


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <mysql.h>
MYSQL mysql;
MYSQL_RES res;
MYSQL_ROW row;



int main(int argc, char *argv[])
{
if (!(mysql_connect(&mysql, "localhost", "root", "")))
 {
 perror("MySQL connection error!\n");
 exit(1);
 }
mysql_select_db(&mysql, "test");
mysql_query(&mysql, "SHOW TABLES");
while (res = mysql_fetch_array(&mysql))
 {
 printf("%s\n", res);
 }
mysql_free_result(&mysql);
mysql_close(&mysql);
 return 0;
}

компилю так
Код

[root@chuck crawler]# gcc -Wall ./crawler.c -o crawler  -I/usr/include/mysql -L/usr/lib/mysql  -lmysqlclient -lm -lz
In file included from /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.2/include/stdio.h:74,
                from crawler.c:5:
/usr/include/libio.h:1: parse error before '.' token
/usr/include/libio.h:21: stray '`' in program
/usr/include/libio.h:24: stray '`' in program
/usr/include/libio.h:46: stray '`' in program
/usr/include/libio.h:47: stray '`' in program
/usr/include/libio.h:61: stray '`' in program
/usr/include/libio.h:62: stray '`' in program
/usr/include/libio.h:62: stray '`' in program
/usr/include/libio.h:70: stray '`' in program
/usr/include/libio.h:71: stray '`' in program
/usr/include/libio.h:71: stray '`' in program
In file included from /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.2/include/stdio.h:74,
                from crawler.c:5:
/usr/include/libio.h:76:10: #include expects "FILENAME" or <FILENAME>
/usr/include/libio.h:81: stray '`' in program
/usr/include/libio.h:81: syntax error at '#' token
/usr/include/libio.h:81: syntax error at '#' token
/usr/include/libio.h:81: syntax error at '#' token
/usr/include/libio.h:88: stray '`' in program
/usr/include/libio.h:88: stray '`' in program
/usr/include/libio.h:123:10: unterminated comment
/usr/include/libio.h:417: parse error before '...' token
/usr/include/libio.h:419: syntax error at '#' token
/usr/include/libio.h:422: parse error before '...' token
/usr/include/libio.h:451: parse error before '...' token
/usr/include/libio.h:453: syntax error at '#' token
/usr/include/libio.h:456: parse error before '...' token
/usr/include/libio.h:515:256: missing terminating ' character
/usr/include/libio.h:476: confused by earlier errors, bailing out


Что за фигня не понимаю, ошибки идут с каких-то левых файлов, которые я не подгружаю!
В чем может быть причина?
И скиньте кто-нить пример работчего клиента!

Заранее спасибо!

Автор: Chuck 26.1.2005, 21:32
Всем огромное спасибо, я разобрался!
Были ошибки в самой программе!

Автор: Chuck 3.2.2005, 14:30
Раз dargaard ссылается на этот топик, выкладываю рабочий вариант
Компилить надо так
Код

gcc -Wall ./mysql.c -o mysql  -I/usr/include/mysql -L/usr/lib/mysql  -lmysqlclient -lm -lz

Код

int i = 0;
if (mysql_connect(&mysql, "localhost", "root", "") == NULL)
 {
 printf("Cannot connect\n");
 }
 
 if (mysql_select_db(&mysql, "afishachuck") == 0)
 {
 printf("Cannot select DB\n");
 }
 
 if (mysql_query(&mysql, "SELECT * FROM parts") == 0)
 {
 printf("Cannot execute query\n");
 }
 
res = mysql_store_result(&mysql);
 i = mysql_num_rows(&res);
printf("Rows: %d\n", i);
mysql_free_result(&res);
 mysql_close(&mysql);

Автор: A... 4.2.2005, 13:07
Скопировал, с компилил, но на зтои строчке
Код

res = mysql_store_result(&mysql);


выдается ошибка

Цитата
mysqlconnect.c:33: error: incompatible types in assignment


и как зто исправить..?

Спасибо

Автор: Chuck 4.2.2005, 19:37
А ты где нить делаешь такое?
Код
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW *row;


Вот полный исходник smile
Код
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW *row;

int main(int argc, char *argv[])
{
int i = 0;
if (!(mysql_connect(&mysql, "localhost", "root", "")))
 {
 printf("Error connection!\n");
 exit(1);
 }
mysql_select_db(&mysql, "school71");
mysql_query(&mysql, "SELECT * FROM galery");
res = mysql_store_result(&mysql);
 i = mysql_num_rows(res);
printf("Returned %d rows\n", i);
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}


Естественно надо поменять юзера, базу, таблицу smile

Автор: A... 4.2.2005, 21:06
Конечно я пишу зто...

но все равно дает еррор...

Автор: Chuck 5.2.2005, 12:37
А у тебя установлен пакет mysql-devel***?
И вообще что ты делаешь, все полное описание + ошибку сюда давай

Автор: Ace Wentura 22.3.2005, 11:52
Поправьте меня, если я не прав, но мне кажется, что в коде от Chuck должно быть не
Код

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW *row;

а
Код

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;

Автор: Chuck 22.3.2005, 14:14
Мда, ты прав, так в документации!
Однако это не ошибка, и все работает замечательно!

Автор: Kurt 23.3.2005, 03:11
Подтверждаю - код Chuck'а работает и без этого исправления. (потому как row в теле main не участвует)
A..., покажи ошибку.

Автор: Chuck 23.3.2005, 09:17
Ace Wentura
Какая разница обращаешься ты к строке или ссылке на эту строку???
И там, и там будет правильно, НО к ссылке обращаться удобнее и быстрее! smile

Автор: Kurt 10.4.2005, 18:42
Пытаюсь скомпилить HelloWorld-приложение на Си+MySQL под Fedora Core 3.
Раньше уже компилил (на других машинах с другими дистрибутивами), но такого не замечал.
Вобщем, компилю:
Цитата
gcc -Wall ./mysql0.c -o mysql0 -I/usr/include/mysql/ -L/usr/lib/mysql/ -lmysqlclient -lm -lz


а в ответ:
Цитата
/usr/include/mysql/mysql.h:127: error: `MEM_ROOT' does not name a type
/usr/include/mysql/mysql.h:168: error: `MEM_ROOT' does not name a type
/usr/include/mysql/mysql.h:184: error: `MEM_ROOT' does not name a type

Короче, ошибки везде, где используется MEM_ROOT, хотя он там выше описан.
Что это может быть? Неужели ошибка в исходниках? Как-то сомнительно..

З.Ы.
mysql-devel-3.23.58-13
mysql-3.23.58-13
mysql-server-3.23.58-13


Автор: Chuck 10.4.2005, 21:20
А mysql-client стоит?
И, код в студию!

Автор: Kurt 10.4.2005, 22:41
Цитата
А mysql-client стоит?

Да.
Разве я не указал выше?
Цитата(Kurt)
mysql-3.23.58-13


Цитата
И, код в студию!

В принципе, такая ошибка наблюдается на ЛЮБОМ коде с использованием mysql.h. Но, если нужна конкретика, то вот:

Код
#include <stdio.h>
#include <my_global.h>
#include <mysql.h>

static char *opt_host_name = NULL;
static char *opt_user_name = NULL;
static char *opt_password = NULL;
static unsigned int opt_port_num = 0;
static char *opt_socket_name = NULL;
static char *opt_db_name = NULL;
static unsigned int opt_flags = 0;
static MYSQL *conn;
MYSQL_RES *res_set;
MYSQL_ROW row;
unsigned int i;

int main(int argc, char *argv[])
{
    conn = mysql_init(NULL);
    if (conn == NULL)
    {
        printf("mysql_init() error!\n");
        getchar();
        exit(1);
    };
    if(mysql_real_connect(conn, opt_host_name, opt_user_name, opt_password, opt_db_name, opt_port_num, opt_socket_name, opt_flags) == NULL)
    {
        printf("mysql_real_connect():\nError %u (%s)\n", mysql_errno(conn), mysql_error(conn));
        mysql_close(conn);
        getchar();
        exit(1);
    };
    if (mysql_query(conn, "show tables from test") != 0)
        printf("mysql_query():\nError %u (%s)\n", mysql_errno(conn), mysql_error(conn));
    else
    {
        res_set = mysql_store_result(conn);
        if(res_set == NULL)
            printf("mysql_store_result():\nError %u (%s)\n", mysql_errno(conn), mysql_error(conn));
        else
        {

            while((row = mysql_fetch_row(res_set)) != NULL)
            {
                for(i = 0; i < mysql_num_fields(res_set); i++)
                {
                    if(i>0)
                        fputc('\t', stdout);
                    printf("%s", row[i] != NULL ? row[i] : "NULL");    
                }
                fputc('\n', stdout);
            }
            if(mysql_errno(conn) != 0)
                printf("mysql_fetch_row():\nError %u (%s)\n", mysql_errno(conn), mysql_error(conn));
            else
                printf("---------\nReturned stings: %lu \n", (unsigned long) mysql_num_rows(res_set));
            mysql_free_result(res_set);
        }
    }
    mysql_close(conn);
    getchar();
    
    exit(0);
}

Автор: Kurt 15.4.2005, 19:41
Неужели никто не втречался? smile
У всех все компилится?

Автор: Chuck 15.4.2005, 20:32
Хм. У меня ругается на #include <my_global.h>
Нет такого файла!
А так все на ура проходит!
Ройся! Может у тя компилятор старый, может альфа версия!

Автор: Kurt 16.4.2005, 18:56
Компилятор у меня шел с дистрибутивом Fedora Core 3. Не думаю, что там очень уж старая версия.
Сейчас я, к сожалению, не могу глянуть точную версию gcc. Как будет возможность - скажу.

Цитата
Хм. У меня ругается на #include <my_global.h>
Нет такого файла!

Вроде, my_global.h - это стандартный хедер. Там объявлены общие константы, типы и т.п. для MySQL-приложений.. smile

Chuck
А какой компилятор ты используешь? Какая версия?

Автор: Chuck 16.4.2005, 22:44
gcc version 3.2 (Mandrake Linux 9.0 3.2-1mdk) - это мой компиллер
Хм, нашел этот файл, подгрузил! Вылетело 100 строк предупреждений и ошибок!

Kurt, чет я не догоняю! А зачем тебе этот my_globals.h??

Автор: Kurt 18.4.2005, 22:37
Хм. Да, ты прав. Без my_global.h все работает.
Просто я до этого компилил только под Windows. Все было ОК. Вместе с этим хедером, согласно книге.. smile

Автор: Chuck 19.4.2005, 20:42
Чет я не понял, тебе надо этот my_global.h?
Если он тока книге?? Выкини книгу или найди диск к этой книге smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)