在写聊天室的时候,会经常用到关于数据库的操作,一不小心就会出错,给大家盘点一些易踩坑点
操作数据库段错误
查询出的数据异常
怎么判断查询数据为不存在
数据未加入表
起初对数据库的操作不熟悉,写了一个创建链接数据库的函数(accpet_mysql) 这个函数
MYSQL accept_mysql()
{
MYSQL mysql ;
//初始化句柄
if(NULL == mysql_init(&mysql))
my_err("mysql_init",__LINE__);
//初始化数据库
if(mysql_library_init(0,NULL,NULL) != 0)
my_err("mysql library init ",__LINE__);
//连接数据库
if(NULL == mysql_real_connect(&mysql,"127.0.0.1","root","123456","chat",0,NULL,0))
my_err("mysql real connect ",__LINE__);
//设置中文字符集
if(mysql_set_character_set(&mysql,"utf8") < 0)
my_err("mysql_set_character_set",__LINE__);
printf("数据库链接成功!\n");
return mysql;
}
int main(void)
{
MYSQL mysql = accept_mysql();
mysql_query(&mysql,"select * from user_data");
}
在主函数操作数据库的时候会产生段错误,这个错误缠了我一天,最后还是让学长解决了(欲哭无泪,真的很难找)其实仔细想想也还好了,盘好逻辑,问题也就出来了
先来说一说内存分配问题
在linux中,一个进程在内存中的数据分为三个部分
文本段 --------------------------数据段 -------------------------------- 堆栈段
文本段存放可执行代码和只读数据 = >该段通常为只读
数据段主要存放全局变量,静态变量
栈存放临时变量,函数参数
堆存放malloc的内容
很明显这是一个函数,所以内存分配在栈,函数执行完毕,所有的内存被释放,自然也就找不会链接了
解决方法一:可以在函数malloc一个mysql,malloc的内容需要手动释放(切记一定用完一定要释放,内存泄露可不是什么好事),但是你会发现实际上这样操作是不能释放掉mysql的内存的,所以用第二种解决方案哈哈哈
MYSQL accept_mysql()
{
MYSQL *mysql ;
mysql = (MYSQL *) malloc(sizeof(MYSQL));
if(NULL == mysql_init(mysql))
my_err("mysql_init",__LINE__);
if(mysql_library_init(0,NULL,NULL) != 0)
my_err("mysql library init ",__LINE__);
if(NULL == mysql_real_connect(mysql,"127.0.0.1","root","123456","chat",0,NULL,0))
my_err("mysql real connect ",__LINE__);
if(mysql_set_character_set(mysql,"utf8") < 0)
my_err("mysql_set_character_set",__LINE__);
printf("数据库链接成功!\n");
return *mysql;
}
int main(void)
{
MYSQL mysql = accept_mysql();
mysql_query(&mysql,"select * from user_data");
}
解决方法二: 将mysql定义成全局变量,还是沿用第一部分的代码,只不过是将mysql定义成全局变量就可以了
操作数据库时,如果我们只查询一个字段(比如 : select account from user_data)
mysql_query(&mysql,"select account from user_data"); MYSQL_RES * result = mysql_store_result(&mysql);
MYSQL_ROW row = mysql_fetch_row(result); printf("%s\n",row);
这样查询出的结果是一段乱码,不是正常数据,一定要加上0 ( row[0] ) 或者去解引用
单凭一个mysql_query判断是不够的,即使数据不存在,在mysql里操作他的提示只是空
所以还需要加入下面两个函数,如果row的结果为空,才能够判定出该数据不存在
MYSQL_RES * result = mysql_store_result(&mysql); MYSQL_ROW row = mysql_fetch_row(result);
如果插入的数据没有加入到表中,那就很有可能是自己的操作不当了,在后面打印出mysql语句就可以很好的检查了
对于数据库的操作还是比较简单的,就这几个语句只要合理用就ok了
第一次看到部署服务器简直一脸懵,完全不知道是在干什么
总结下来,就是把自己的项目加到了远程服务器上,
第一步 : 因为聊天室用到了数据库,所以先将自己的数据库进行备份,这样远程服务器就可以获取了,一是不需要自己一个个创建,二是可以同步到自己的数据
下面说明备份指定数据库的方法:
chat是自己要备份的数据库,
…/chatroom.sql代表保存到上一级目录的chatroom.sql文件中
chatroom.sql中现在保存的就是自己聊天室的表结构和数据了
第二步:登陆远程服务器
ssh [email protected]
Linux_6235就是自己的用户名了
登陆后先放在这里,等会再进行操作
第三步 : 将本地的文件(发送备份的库和自己的聊天室服务器)发送到远程服务器
换到一个新的终端执行命令,记住不要忘记命令最后的 :~
现在在打开远程服务器的终端执行ls命令就可以看到自己的chatroom.sql文件了
第四步: 恢复备份文件
在打开远程服务器的终端执行
mysql -u Linux_6235 -P 3206 -p chat_room_6235
这下在远程服务器登陆到自己的数据库就可以看到本机的表结构和数据了
chat_room_6235是自己要同步到的表名
第五步: 发送聊天室服务器
还是scp命令,同第三步