千家信息网

mysql api---从一个小例子开始mysql编程入门(1)

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,C APIs包含在mysqlclient库文件当中,与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询locate mysql.h 命令可以查看mysql.h 位于/user/includ
千家信息网最后更新 2025年02月02日mysql api---从一个小例子开始mysql编程入门(1)

C APIs包含在mysqlclient库文件当中,与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询
locate mysql.h 命令可以查看mysql.h 位于/user/include/mysql/mysql.h
一个小例子来看一下mysql api 大概用法,用于打印hello world:
int main()
{
int ret = NULL;

MYSQL       mysql;MYSQL       *connect;//MYSQL_RES     *res;//MYSQL_ROW row;//char      *query;//int       t, r;/*if (mysql_library_init(0, NULL, NULL)) {    fprintf(stderr, "could not initialize MySQL library\n");    exit(1);}*/mysql_init(&mysql);//初始化mysql/*    MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,    const char *passwd, const char *db, unsigned int port, const char *unix_socket,    unsigned long client_flag)*//*    unsigned int mysql_errno(MYSQL *mysql);    const char *mysql_error(MYSQL *mysql);*/connect = mysql_real_connect(&mysql, "localhost", "root", "mysql", "pos", 0, NULL, 0 );if (connect == NULL){    ret = mysql_errno(connect);    printf("func mysql_real_connect() err\n");    return ret;}else{    printf(" ok......\n");}printf("connect:%d &mysql:%d \n",connect, &mysql );mysql_close(connect);//mysql_library_end();

}

从上面可以看出有几个比较重要的函数
(1)MYSQL mysql_init(MYSQL mysql)

描述

分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。

返回值

初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。

错误

在内存不足的情况下,返回NULL。
(2) mysql_real_connect()
MYSQL mysql_real_connect(MYSQL mysql, const char host, const char user, const char passwd, const char db, unsigned int port, const char *unix_socket, unsigned long client_flag)

描述

mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。

参数的指定方式如下:

· 第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。通过mysql_options()调用,可更改多种连接选项。

· "host"的值必须是主机名或IP地址。如果"host"是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。

· "user"参数包含用户的MySQL登录ID。如果"user"是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。在Windows ODBC下,必须明确指定当前用户名。

· "passwd"参数包含用户的密码。如果"passwd"是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。

注释:调用mysql_real_connect()之前,不要尝试加密密码,密码加密将由客户端API自动处理。

· "db"是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。

· 如果"port"不是0,其值将用作TCP/IP连接的端口号。注意,"host"参数决定了连接的类型。

· 如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,"host"参数决定了连接的类型。

· client_flag的值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:
1.CLIENT_MULTI_STATEMENTS
通知服务器,客户端可能在单个字符串内发送多条语句(由';'隔开)。如果未设置该标志,将禁止多语句执行。
2.CLIENT_COMPRESS
使用压缩协议。
3.CLIENT_SSL
使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的

MySQL开发环境熟悉
mysq的开发头文件目录为 /usr/include/mysql 可以用locate mysql.h或者find命令查看(find / -name "mysql.h" -type f -print)

mysq的开发 动态库同上可以查找到libmysqlclient.so 在/usr/lib64/mysql下
编译命令:
gcc -o dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient (-I 指定头文件路径 -L指定库路径)

典型错误1
/
/usr/lib64/mysql/libmysqlclient.a(dso_dlfcn.o): In function dlfcn_globallookup':
dso_dlfcn.c:(.text+0x31): undefined reference to
dlopen'
dso_dlfcn.c:(.text+0x44): undefined reference to dlsym'
dso_dlfcn.c:(.text+0x4f): undefined reference to
dlclose'
//libmysqlclient.a dlfcn_globallookup undefined reference to `dlopen'
/

分析:由dlopen ,dllsym可知缺少dl库 只需 编译时加上 -ldl
典型错误2
/
dm01_hello.c:49: 警告:初始化将指针赋给整数,未作类型转换
/usr/lib64/mysql/libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.gxx_personality_v0[DW.ref.gxx_personality_v0]+0x0): undefined reference to __gxx_personality_v0'
/usr/lib64/mysql/libmysqlclient.a(password.c.o): In function
scramble_323':
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to
floor'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to
floor'
/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: undefined reference to floor'
/usr/lib64/mysql/libmysqlclient.a(password.c.o):/pb2/build/sb_0-12734909-1406113305.48/rpm/BUILD/mysqlcom-pro-5.6.20/mysqlcom-pro-5.6.20/sql/password.c:184: more undefined references to
floor' follow
/usr/lib64/mysql/libmysqlclient.a(my_getsystime.c.o): In function `my_getsystime':
/

分析: 由undefined reference to floor'' 可知缺少数学库,链接上数学库 -lm -lrt即可!
典型错误3
dm01_hello.c:70: 警告:初始化将指针赋给整数,未作类型转换
//导致没有链接 libstdc++.so
/usr/lib64/mysql/libmysqlclient.a(net_serv.cc.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to
__gxx_personality_v0'

分析:由undefined reference to `__gxx_personality_v0'可知没有链接 libstdc++.so,只需-lstdc++即可
于是:
MySQL开发环境GCC写法
gcc -o dm01_hello dm01_hello.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++
以上一般针对64位系统出现的问题,对于32位系统无需这样,只需
gcc -o dm01_hello dm01_hello.c -lmysqlclient 即可!

因为32位环境下已经做了相应的工作!

上面写的是不是很麻烦呢!有没有简单一点的写法呢?有,引入makefile

MySQL开发环境makefile写法

.PHONY:clean all #声明为伪目标
CC=gcc
CFLAGS=-Wall -g
LFLAGS=-L/usr/lib64/mysql -lmysqlclient -ldl -lpthread -lm -lrt -lstdc++

BIN=dm01_hello dm02_query

all:$(BIN)

%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@

dm01_hello:dm01_hello.o
$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@

dm02_query:dm02_query.o
$(CC) $(CFLAGS) $^ $(LFLAGS) -o $@

clean:
rm -f *.o $(BIN)
大概说一下几个细节:
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
其中%.o 和%.c会自动展开
$@目标 $< 第一个依赖 $^所有依赖
如上:
dm01_hello.o dm02_query.o : dm01_hello.c dm02_query.c
gcc -Wall -g -c dm01_hello.c -o dm01_hello.o
gcc -Wall -g -c dm02_query.c -o dm02_query.o
大概就是这个意思

下面将接着说,请看下一节!mysql api---从一个小例子开始mysql编程入门(2)
用户 对象 参数 数据 数据库 密码 环境 开发 类型 系统 错误 分配 主机 典型 写法 函数 只需 命令 地址 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哪些科研院所有网络安全研究生 数据库 网站 模板 济南管理软件开发公司哪家好 通信网络安全保护提升法 上海晓封网络技术有限公司 嵌入式软件开发和上位机区别 简单网络安全卡手抄报图片 xshell怎么改服务器时间 网络安全好学还是java好学 网络技术联盟战 网络安全防护设备物理防护方案 网络安全威胁有几种 图书借阅系统数据库流程图 浙江网络技术服务模式 学软件开发要什么学力 湖北软件开发中职学校 鼎天云宏网络技术定位是真的吗 科脉迷你pos数据库连接 国家网络安全改革路 在网络安全模型中安全的基石 船票系统数据库都有哪些字段 网络技术工程师工作内容 软件开发公司宣称语 在更改数据库密码前一定要 网络安全与网络道德ppt 铜牛软件开发 花都租房网络安全 常见网络安全技术分析 初级数据库管理员知识 如何设置iis服务器安全
0