高仿qq聊天:用c语言操控mysql

来源:互联网 发布:mysql 查询最大连接数 编辑:程序博客网 时间:2024/06/04 18:37

该程序服务器端使用mysql数据库,c语言操控。qt其实也有操控mysql的api,但当时写程序还没学到那,只学过原生态api,所以就使用c了。

mysql在vs2013下的配置:一般mysql安装后都有c语言操控库,在mysql安装目录下。选择ALT + F7进入属性VC++目录->包含目录,把MYSQL/Connector.C下include路径拷贝到包含目录内。拷贝Connector.C++下lib/opt路径到库目录。后进行静态库链接:#pragma comment(lib, "libmysql.lib")

注意:mysql版本位数要和vs设置的位数一致,mysql是32位,vs必须是win32,mysql64位,vs需要配置x64,否则会导致链接错误。

使用方法:定义MYSQL mysql->mysql_init(&mysql)->mysql_real_query(&mysql, ip地址,用户名,密码,可填0,可填0,可填0,可填0)即可连接上数据库。

注意:声明MYSQL时不能声明为指针例如:MYSQL *mysql->mysql_init(mysql),这会使程序崩溃。malloc mysql应该可以,没试过。

操控数据库使用mysql_query或mysql_real_query,后者比前者多一个参数size。前者依靠\0作为字符串截止符,后者依靠传入参数size作为截止符,因此如果要存储二进制数据必须使用mysql_real_query因为二进制数据可能含有\0字符,所以必须指明大小。

该程序使用mysql存储聊天数据,因此应该使用mysql_real_escape_string,该函数能处理掉mysql系统关键字,例如如果聊天记录有双引号单引号程序插入数据到数据库可能失败甚至崩溃(sql注入)。

mysql获取数据,先使用mysql_store_result获取全部数据(也可以用其他函数获取部分数据),然后while (result_row = mysql_fetch_row(result))循环获取数据,result_row[i]即为所要查询的数据。注意:result_row[i]所获取的数据全部为char*类型,即使想要查询的数据类型为int类型,查询结果也是char*类型。

也可以使用mysql预处理语句使用流程如下

MYSQL_STMT *stmt = mysql_stmt_init(&mysql);if (!stmt){fprintf(stderr, " mysql_stmt_init()wrong\n");return 0;}int i;string query = "insert into register values(?)";if ( i = mysql_stmt_prepare(stmt, query.data(), query.size())){fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(&mysql));err_reason = "注册请求失败";return 0;}
先初始化,后执行parpare语句,?号表示需要填充的数据。例如想执行insert into table valuse("hello")使用预处理语句:
MYSQL_BIND params[10];char buf[20] = "hello"memset(params, 0, sizeof(params));params[0].buffer_type = MYSQL_TYPE_STRING;params[0].buffer = (void*)nam;params[0].buffer_length = strlen(nam);mysql_stmt_bind_param(stmt, params);
如果是绑定char*类型,buffer_len必须赋值,如果是绑定int类型值buffer_type使用MYSQL_TYPE_TINY,下面是mysql bind设置buffer_type的类型
类型值类型描述MYSQL_TYPE_TINYTINYINT字段MYSQL_TYPE_SHORTSMALLINT字段MYSQL_TYPE_LONGINTEGER或INT字段MYSQL_TYPE_INT24MEDIUMINT字段MYSQL_TYPE_LONGLONGBIGINT字段MYSQL_TYPE_DECIMALDECIMAL或NUMERIC字段MYSQL_TYPE_NEWDECIMAL精度数学DECIMAL或NUMERICMYSQL_TYPE_FLOATFLOAT字段MYSQL_TYPE_DOUBLEDOUBLE或REAL字段MYSQL_TYPE_BITBIT字段MYSQL_TYPE_TIMESTAMPTIMESTAMP字段MYSQL_TYPE_DATEDATE字段MYSQL_TYPE_TIMETIME字段MYSQL_TYPE_DATETIMEDATETIME字段MYSQL_TYPE_YEARYEAR字段MYSQL_TYPE_STRINGCHAR字段MYSQL_TYPE_VAR_STRINGVARCHAR字段MYSQL_TYPE_BLOBBLOB或TEXT字段(使用max_length来确定最大长度)MYSQL_TYPE_SETSET字段MYSQL_TYPE_ENUMENUM字段MYSQL_TYPE_GEOMETRYSpatial字段MYSQL_TYPE_NULLNULL-type字段MYSQL_TYPE_CHAR不再重视,用MYSQL_TYPE_TINY取代
注意:mysql bind后内部应该会释放被绑定buffer内存,所以c++不能用string.data()来绑定buffer,string内部作用域结束会释放内存,bind也会释放内存,同一内存释放两次会导致程序崩溃。




0 0