以前拿php写与数据库相关的东西,这次用c写,还是感觉很神奇的。
老实说,真不知道原来c还可以这么弄,只要把需要的头文件包括进来,瞬间天地就开阔了。
当然,语言的限制,用C写还是比用php麻烦很多啦,
需要先mysql_query(&mysql_conn,sql)一下
然后用mysql_store_result(&mysql_conn)获取res资源指针,相对php多了一步,可是就是这一步真是让我开了眼界。
这种思路真的很exciting。不过不得不承认,有点小麻烦。
不过最麻烦的还是sql的拼接。在php里sql考虑的更多的是注意单双引号的问题,而且我想像js,php这些语言之所以引入单双引号,或许就是为了方便sql、html等的嵌入编写。
c可是够麻烦的,不能用+或者.拼接。每次都要strcat,一个sql好多好多strcat - -。
还有一个比较麻烦的就是输入流中的回车问题。实在有点不太懂啊,经常就是上一个字符串的输入完成后按的回车被后一个待输入的str给接收了,然后就是各种问题啊。恰恰这次又不停的循环清屏,每次都不知道结果是啥就一闪而过。后来上网查了下,用setbuf(stdin,NULL)清空输入流,这个大招一用,效果太好了。不过,还是很困惑到底在什么情况下需要使用这个。时间比较紧,没有很详细的思考啊,于是就使劲的setbuf NULL;
还学到了字符串和数字之间的转换函数。当然,这些在php里是不会出现的,不过在严格的c里,的确是把我吓到了,好久没经历过需要手动转换的了。
两类函数
字符串到数字,int atoi(str), float atof(str),a就是ascii码吧,i,f就是int,float,还是挺好记得;
数字到字符串,itoa(int,str,10)之类的,最后一个10表示基数10 来转,上下两个函数不对称,嗯,容易搞混啊。
还有学到的就是按位取反~符号,这些平时基本不会遇到的。开始我问炯哥哥,他告诉我说是通过与二进制的’11111111‘来异或实现,我反应大半天稍微有点懂;然后他说’11111111‘不知道对应ascii多少,就用’00000001‘这个二进制对应的字符,通过8次循环移位,每次移位后与字符异或,由于与1以后为相反,与0异或为本身,所以就能实现按位取非了。啊,当时我就晕了 - -。差距啊,虽说这么是麻烦,可是从中透露的东西,可见一斑啊。计组得好好学啊。
大概就是这样,感觉还是学到好多东西。有好久没写代码了,手太残啊,一直打不好字。
下午的时候有点困,边写歌边写代码,那些熟悉的歌和着敲键盘的节奏,我快要疯了,恨不得把音量开到最大!!
好久没有这么痛快!
贴上代码。
main.c
#ifndef __LCC__ #define __LCC__ #endif #include "shoppingcart.h" int main(int argc, char **argv) { MYSQL mysql_conn ; if(mysql_init(&mysql_conn) == NULL) { printf("Initialization fails. \n") ; return -1 ; } if(mysql_real_connect(&mysql_conn,"localhost","root","","shoppingCartApp",MYSQL_PORT,NULL,0) == NULL) { printf("Connect databases faild.\n") ; return -1 ; } //开始输出首页 while(!system("CLS"))//该函数返回false { printInCenter("购物车") ; char mainMenu[100] = "\n1.管理员登陆\n2.用户登陆或注册\n3.退出\n" ; printLeftJustify(mainMenu) ; char id[100] ; char password[20] ; int choice ; scanf("%d",&choice) ; switch(choice) { case 1: adminMoudle(mysql_conn,id,password) ; break ; case 2: userMoudle(mysql_conn,id,password) ; break ; case 3: return 0 ; default: return 0 ; } } return 0; }
shoppingcart.h
#ifndef SHOPPINGCART_H_INCLUDED #define SHOPPINGCART_H_INCLUDED #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <windows.h> #include <time.h> #define ADMIN 20 #define USER 30 #define true 1 #define false 0 //用户模块 void userMoudle(MYSQL mysql_conn,char * id,char * password) ; void userManageMenu(MYSQL mysql_conn,char * id) ; void addShoppingCart(MYSQL mysql_conn,char * id) ; void manageShoppingCart(MYSQL mysql_conn,char * id) ; void printForm(MYSQL mysql_conn,char * id) ; void modifyEmail(MYSQL mysql_conn,char * id) ; //管理员模块 void adminMoudle(MYSQL mysql_conn,char * id,char * password) ; void Manage(MYSQL mysql_conn,char * id) ; void itemManage(MYSQL mysql_conn) ; void saleStatistics(MYSQL mysql_conn) ; int itemList(MYSQL mysql_conn) ; //打印函数 int printInCenter(char * str) ; int printLeftJustify(char* str) ; int printHR() ; //其他 int login(MYSQL mysql_conn,int loginType,char * id,char * password) ; void getDate(char * xxDate) ; void encrypt(char * password) ; void adminMoudle(MYSQL mysql_conn,char * id,char * password) { system("CLS") ; printInCenter("管理员登陆") ; int loginResult = login(mysql_conn,ADMIN,id,password) ; if(loginResult == false) { printf("用户名或密码输入错误\n") ; int choice ; char options[200] = "1.重新输入\n2.退出\n" ; printLeftJustify(options) ; scanf("%d",&choice) ; if(choice == 1) { int times = 2 ; while(times >0&&(login(mysql_conn,ADMIN,id,password) == false)) { printf("输入错误,还有%d次机会\n",times-1) ; times-- ; } if(times == 0) { printf("达到错误次数\n") ; return ; } } else { return ; } } //登陆成功 Manage(mysql_conn,id) ; } void userMoudle(MYSQL mysql_conn,char * id,char * password) { int choice ; while(!system("CLS")) { printInCenter("用户登陆、注册") ; printLeftJustify("\n1.登陆\n2.注册\n3.退出\n") ; scanf("%d",&choice) ; if(choice == 1) { int loginResult = login(mysql_conn,USER,id,password) ; if(loginResult == false) { printf("用户名或密码输入错误\n") ; int choice ; char options[200] = "1.重新输入\n2.退出\n" ; printLeftJustify(options) ; scanf("%d",&choice) ; if(choice == 1) { int times = 2 ; while(times >0&&(login(mysql_conn,ADMIN,id,password) == false)) { printf("输入错误,还有%d次机会\n",times-1) ; times-- ; } if(times == 0) { printf("达到错误次数\n") ; return ; } } else { return ; } } //登陆成功 userManageMenu(mysql_conn,id) ; } else if(choice == 2) { char rePass[20] ; printf("请输入账户名(登陆邮箱):\n") ; scanf("%s",id) ; while(printf("请输入密码:\n")) { scanf("%s",password) ; printf("请再次输入密码:\n") ; scanf("%s",rePass) ; if(strcmp(rePass,password) == 0) { break ; } else { printf("两次密码不一致,请重新输入\n") ; } } encrypt(password) ; //加密 char name[20] ; printf("请输入姓名:\n") ; scanf("%s",name) ; char sql_2[200] = "insert into user values('" ; strcat(sql_2,id) ; strcat(sql_2,"','") ; strcat(sql_2,password) ; strcat(sql_2,"','") ; strcat(sql_2,name) ; strcat(sql_2,"')") ; if(mysql_query(&mysql_conn,sql_2) == 0) { printf("注册成功\n") ; } else { printf("注册失败\n") ; } } else if(choice == 3) { return ; } else { printf("无效的选项\n") ; } } } int login(MYSQL mysql_conn,int loginType,char * id,char * password) { if(loginType == ADMIN) { printf("请输入账户名(登陆邮箱):\n") ; scanf("%s",id) ; printf("请输入密码:\n") ; scanf("%s",password) ; char sql_1[200] = "select * from admin where id = '" ; strcat(sql_1,id) ; strcat(sql_1,"' and password='") ; strcat(sql_1,password) ; strcat(sql_1,"'") ; MYSQL_RES * res ; if(mysql_query(&mysql_conn,sql_1) != 0) { printf(mysql_error(&mysql_conn)) ; return -1 ; } res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; if(row_num == 0) return false ; else return true ; } else { printf("请输入账户名(登陆邮箱):\n") ; scanf("%s",id) ; printf("请输入密码:\n") ; scanf("%s",password) ; encrypt(password) ; char sql_1[200] = "select * from user where id = '" ; strcat(sql_1,id) ; strcat(sql_1,"' and password='") ; strcat(sql_1,password) ; strcat(sql_1,"'") ; MYSQL_RES * res ; if(mysql_query(&mysql_conn,sql_1) != 0) { printf(mysql_error(&mysql_conn)) ; return -1 ; } res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; if(row_num == 0) return false ; else return true ; } } void Manage(MYSQL mysql_conn,char * id) { char sql_1[200] = "select name from user where id='" ; strcat(sql_1,id) ; strcat(sql_1,"'") ; MYSQL_RES * res ; if(mysql_query(&mysql_conn,sql_1) != 0) { printf(mysql_error(&mysql_conn)) ; return ; } res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; if(row_num == 0) { printf("无效的用户名\n") ; return ; } MYSQL_ROW name_row = mysql_fetch_row(res) ; char name[20] ; strcpy(name,name_row[0]) ; while(!system("CLS") ) { printInCenter("管理选项"); printf("欢迎您,%s\n",name) ; printLeftJustify("您可以\n1.管理商品\n2.销售统计\n3.退出管理\n") ; int choice ; scanf("%d",&choice) ; switch(choice) { case 1 : itemManage(mysql_conn) ; break ; case 2 : saleStatistics(mysql_conn) ; break ; case 3: return ; default : printf("无效的选项\n") ; } } } int itemList(MYSQL mysql_conn) { char sql[200] = "SELECT * FROM item ORDER BY number asc" ; if(mysql_query(&mysql_conn,sql) != 0) { printf(mysql_error(&mysql_conn)) ; return false; } MYSQL_RES * res ; res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; if(row_num == 0) { printf("暂无商品\n") ; return true; } MYSQL_ROW row ; printHR() ; printf("商品编号\t商品名称\t类别\t描述\t\t价格\t库存量 \n") ; printHR() ; int i ; for( i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-8s\t%-8s\t%-4s\t%-12.12s\t%-4s\t%-6s\n",row[0],row[1],row[2],row[3],row[4],row[5]) ; } printHR() ; return true ; } void itemManage(MYSQL mysql_conn) { system("CLS") ; while(printInCenter("商品管理")&&itemList(mysql_conn) == true) { printLeftJustify("1.添加商品信息\n2.修改商品价格和库存\n3.删除商品\n4.退出商品管理\n") ; int choice ; scanf("%d",&choice) ; if(choice == 1) { printf("\n请依次输入商品的名称,类别,描述,价格,以及库存量(以回车分隔)\n") ; char name[20],category[20],description[400],price[10],stock[10]; getchar() ;//捕捉来自choice输入后输入流中的回车 gets(name) ; gets(category) ; gets(description) ; gets(price) ; gets(stock) ; char sql_1[500] = "insert into item(name,category,description,price,stock)values('" ; strcat(sql_1,name) ; strcat(sql_1,"','") ; strcat(sql_1,category) ; strcat(sql_1,"','") ; strcat(sql_1,description) ; strcat(sql_1,"',") ; strcat(sql_1,price) ; strcat(sql_1,",") ; strcat(sql_1,stock) ; strcat(sql_1,")") ; if(mysql_query(&mysql_conn,sql_1) != 0) { printf(sql_1) ; printf(mysql_error(&mysql_conn)) ; return ; } printf("\n商品添加成功\n") ; } else if(choice == 2) { getchar() ; printf("\n请输入要修改的商品编号\n") ; char itemId[10] ; gets(itemId) ; char price[10] ; char stock[10] ; char sql_3[100] = "update item set " ; printf("\n请输入该商品新的价格(回车表示不变):\n") ; gets(price) ; if(strcmp(price,"") != 0) { strcat(sql_3,"price=") ; strcat(sql_3,price) ; strcat(sql_3,",") ; } printf("\n请输入该商品目前库存量:\n") ; gets(stock) ; strcat(sql_3,"stock=") ; strcat(sql_3,stock) ; strcat(sql_3," where number=") ; strcat(sql_3,itemId) ; if(mysql_query(&mysql_conn,sql_3) != 0) { printf(sql_3) ; printf(mysql_error(&mysql_conn)) ; return ; } int affected_rows = mysql_affected_rows(&mysql_conn) ; if(affected_rows == 0) { printf("\n无效的商品编号,修改失败\n") ; } else { printf("\n修改信息成功\n") ; } } else if(choice == 3) { getchar() ; printf("\n请输入要删除的商品编号\n") ; char itemId[10] ; gets(itemId) ; char sql_2[100] = "delete from item where number = " ; strcat(sql_2,itemId) ; if(mysql_query(&mysql_conn,sql_2) != 0) { printf(mysql_error(&mysql_conn)) ; return ; } int affected_rows = mysql_affected_rows(&mysql_conn) ; if(affected_rows == 0) { printf("\n无效的商品编号,删除失败\n") ; } else { printf("\n删除成功\n") ; } } else if(choice == 4) { return ; } else { printf("无效的选项\n") ; } } } void saleStatistics(MYSQL mysql_conn) { while(!system("CLS")) { printInCenter("销售统计") ; printLeftJustify("\n1.统计每种商品在一个时间段内的销售情况\n2.统计每类商品在一个时间段内的销售情况\n3.查看某件商品的详细销售情况\n4.退出销售统计\0" ) ; setbuf(stdin,NULL) ; char choice ; setbuf(stdin,NULL) ; scanf("%c",&choice) ; MYSQL_RES * res ; int row_num ; MYSQL_ROW row ; switch(choice) { case '1' : { char startDate[9] ,endDate[9] ; printf("请输入起始日期(格式示例如:20130808)\n") ; scanf("%s",startDate) ; printf("请输入结束日期(格式示例如:20130909)\n") ; scanf("%s",endDate) ; setbuf(stdin,NULL) ; system("CLS") ; char sql_name[300] = "select number,name,ordertime,sum(orderquantity),sum(orderquantity*orderprice) from item,orderform where number = itemnumber and ordertime between '" ; strcat(sql_name,startDate) ; strcat(sql_name,"' and '") ; strcat(sql_name,endDate) ; strcat(sql_name,"' group by number") ; if(mysql_query(&mysql_conn,sql_name) != 0) { printf(sql_name) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } res = mysql_store_result(&mysql_conn) ; row_num = mysql_num_rows(res) ; char title[40] = "每种商品在" ; strcat(title,startDate) ; strcat(title,"到") ; strcat(title,endDate) ; strcat(title,"时间段内的销售情况") ; printInCenter(title) ; printHR() ; printf("商品编号\t商品名称\t订单日期\t总销量\t总金额\n") ; printHR() ; if(row_num == 0) { printf("暂无订单\n") ; } else { int i ; for(i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-8s\t%-8s\t%-8s\t%6s\t%10.2f\n",row[0],row[1],row[2],row[3],atof(row[4])) ; } } printHR() ; printf("按任意键返回\n") ; setbuf(stdin,NULL) ; getchar() ; } break ; case '2' : { char startDate[9] ,endDate[9] ; printf("请输入起始日期(格式示例如:20130808)\n") ; scanf("%s",startDate) ; printf("请输入结束日期(格式示例如:20130909)\n") ; scanf("%s",endDate) ; setbuf(stdin,NULL) ; system("CLS") ; char sql_name[300] = "select category,sum(orderquantity),sum(orderquantity*orderprice) from item,orderform where number = itemnumber and ordertime between '" ; strcat(sql_name,startDate) ; strcat(sql_name,"' and '") ; strcat(sql_name,endDate) ; strcat(sql_name,"' group by category") ; if(mysql_query(&mysql_conn,sql_name) != 0) { printf(sql_name) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } res = mysql_store_result(&mysql_conn) ; row_num = mysql_num_rows(res) ; char title[40] = "每类商品在" ; strcat(title,startDate) ; strcat(title,"到") ; strcat(title,endDate) ; strcat(title,"时间段内的销售情况") ; printInCenter(title) ; printHR() ; printf("商品类型\t\t总销量\t\t总金额\n") ; printHR() ; if(row_num == 0) { printf("暂无订单\n") ; } else { int i ; for(i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-8s\t\t%6s\t\t%10.2f\n",row[0],row[1],atof(row[2])) ; } } printHR() ; printf("按任意键返回\n") ; setbuf(stdin,NULL) ; getchar() ; } break ; case '3' : { itemList(mysql_conn) ; printf("请输入商品编号\n") ; setbuf(stdin,NULL) ; char number[10] ; scanf("%s",number) ; system("CLS") ; printInCenter("商品详细销售情况") ; printHR() ; printf("订单编号\t订单人\t\t\t订单日期\t订单数量\t总额\n") ; char sql[200] = "select ordernumber,userid,ordertime,orderquantity,orderquantity*orderprice from item,orderform where itemnumber = number and number = " ; strcat(sql,number) ; if(mysql_query(&mysql_conn,sql) != 0) { printf(sql) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } res = mysql_store_result(&mysql_conn) ; row_num = mysql_num_rows(res) ; if(row_num == 0) { printf("没有相关订单\n") ; } else { int i ; for(i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-8s\t%-18.18s\t%-8s\t%8s%10.2f\n",row[0],row[1],row[2],row[3],atof(row[4])) ; } } printHR() ; printf("按任意键返回\n") ; getchar() ; } break ; case '4' : return ; default: printf("没有这个选项\n") ; } getchar() ; } } void userManageMenu(MYSQL mysql_conn,char * id) { char sql_1[200] = "select name from user where id='" ; strcat(sql_1,id) ; strcat(sql_1,"'") ; MYSQL_RES * res ; if(mysql_query(&mysql_conn,sql_1) != 0) { printf(mysql_error(&mysql_conn)) ; return ; } res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; if(row_num == 0) { printf("无效的用户名\n") ; return ; } MYSQL_ROW name_row = mysql_fetch_row(res) ; char name[20] ; strcpy(name,name_row[0]) ; char title[40] ; strcpy(title,name) ; strcat(title," 的用户管理中心") ; while( !system("CLS")) { printInCenter(title) ; printf("\n欢迎您,%s",name) ; printLeftJustify("您可以:\n1.查询商品、加入到购物车\n2.管理购物车(查看,修改,删除,下单)\n3.查看已完成订单\n4.添加或删除辅助邮箱\n5.修改密码\n6.退出管理中心\n") ; int choice ; scanf("%d",&choice) ; if(choice == 1) { addShoppingCart(mysql_conn,id) ; } else if(choice == 2) { manageShoppingCart(mysql_conn,id) ; } else if(choice == 3) { printForm(mysql_conn,id) ; } else if(choice == 4) { modifyEmail(mysql_conn,id) ; } else if(choice == 5) { setbuf(stdin,NULL) ; printf("请输入原密码\n") ; char password[20] ; scanf("%s",password) ; char sql_ensure[200] = "select count(*) from user where id = '" ; strcat(sql_ensure,id) ; strcat(sql_ensure,"' and password = '") ; encrypt(password) ; strcat(sql_ensure,password) ; strcat(sql_ensure,"'") ; if(mysql_query(&mysql_conn,sql_ensure) != 0) { printf(sql_ensure) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } MYSQL_RES *res ; MYSQL_ROW row ; res = mysql_store_result(&mysql_conn) ; row = mysql_fetch_row(res) ; if(row[0] == 0) { printf("密码输入错误\n按任意键返回") ; setbuf(stdin,NULL) ; getchar() ; } else { while(printf("请输入新密码\n")) { scanf("%s",password) ; printf("请再次输入\n") ; char rePass[20] ; scanf("%s",rePass) ; if(strcmp(password,rePass) == 0) { break ; } else { printf("两次密码不一致,请重新输入\n") ; } } encrypt(password) ; char sql_modify[200] = "update user set password = '" ; strcat(sql_modify,password) ; strcat(sql_modify,"' where id = '") ; strcat(sql_modify,id) ; strcat(sql_modify,"'") ; if(mysql_query(&mysql_conn,sql_modify) != 0) { printf(sql_modify) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } printf("修改成功\n按任意键返回") ; setbuf(stdin,NULL) ; getchar() ; } } else if(choice == 6) { return ; } else { printf("没有这个选项啊\n") ; Sleep(2000) ; } } } void addShoppingCart(MYSQL mysql_conn,char * id) { char keyWord[20] ; printf("请输入一个关键词:") ; scanf("%s",keyWord) ; printf("\n搜索结果:\n") ; printf("商品编号\t商品名称\t类别\t描述\t\t价格\t库存量\n") ; //根据名称 char sql_2[200] = "select * from item where name like '%" ; strcat(sql_2,keyWord) ; strcat(sql_2,"%'") ; if(mysql_query(&mysql_conn,sql_2) != 0) { printf(mysql_error(&mysql_conn)) ; return ; } MYSQL_RES * res = mysql_store_result(&mysql_conn) ; printInCenter("按名称搜索") ; printHR() ; int row_num = mysql_num_rows(res) ; MYSQL_ROW row ; if(row_num == 0) { printInCenter("暂无结果") ; } else { int i ; for(i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-8s\t%-8s\t%-4s\t%-12.12s\t%-4s\t%-6s\n",row[0],row[1],row[2],row[3],row[4],row[5]) ; } } printHR() ; printInCenter("按描述搜索") ; printHR() ; char sql_3[200] = "select * from item where description like '%" ; strcat(sql_3,keyWord) ; strcat(sql_3,"%'") ; if(mysql_query(&mysql_conn,sql_3) != 0) { printf(mysql_error(&mysql_conn)) ; return ; } res = mysql_store_result(&mysql_conn) ; int row_num_des = mysql_num_rows(res) ; if(row_num_des == 0) { printInCenter("暂无结果") ; } else { int i ; for( i = 0 ; i < row_num_des ; i++) { row = mysql_fetch_row(res) ; printf("%-8s\t%-8s\t%-4s\t%-12.12s\t%-4s\t%-6s\n",row[0],row[1],row[2],row[3],row[4],row[5]) ; } } printHR() ; if(row_num == 0 && row_num_des == 0) { printf("没有相关商品,按按任意键返回\n"); setbuf(stdin,NULL) ; getchar() ; } else { char itemId[20] ; printf("\n有想要的东西,就把商品编号输入进来吧(都不满意请输入回车)\n") ; setbuf(stdin,NULL) ;//屏蔽回车 gets(itemId) ; if(strcmp(itemId,"") != 0) { char sql_4[200] = "select * from item where number = " ; strcat(sql_4,itemId) ; if(mysql_query(&mysql_conn,sql_4) != 0) { printf(sql_4) ; printf(mysql_error(&mysql_conn)) ; return ; } res = mysql_store_result(&mysql_conn) ; int row_num_cart = mysql_num_rows(res) ; if(row_num_cart == 0) { printf("找不到商品啊\n按任意键返回") ; getchar() ; } else { printInCenter("\n您想加入购物车的商品信息\n") ; printHR() ; MYSQL_ROW itemRow ; itemRow = mysql_fetch_row(res) ; printf("商品名称:%s\n",itemRow[1]) ; printf("商品类别:%s\n",itemRow[2]) ; printf("商品描述: %s\n",itemRow[3]) ; printf("商品价格:%s\n",itemRow[4]) ; printf("商品库存:%s\n",itemRow[5]) ; printHR() ; printf("请输入想要购买的数量(不超过库存量):") ; int quantity ; int stock = atoi(itemRow[5]) ; //把字符串转换为整数 while(scanf("%d",&quantity)) { if(quantity<= 0 || quantity > stock) { printf("输入的数量不对哦,请重新输入\n") ; } else { break ; } } setbuf(stdin,NULL) ; char quantity_str[20] ; itoa(quantity,quantity_str,10) ; //将整形转换为字符串 char sql_5[200] = "insert into shoppingcart(userid,itemnumber,purchasequantity)values('" ; strcat(sql_5,id) ; strcat(sql_5,"','") ; strcat(sql_5,itemId) ; strcat(sql_5,"',") ; strcat(sql_5,quantity_str) ; strcat(sql_5,")") ; if(mysql_query(&mysql_conn,sql_5) != 0) { printf(sql_5) ; printf(mysql_error(&mysql_conn)) ; return ; } printf("\n加入购物车成功,可以在订单管理中下单\n按任意键返回") ; getchar() ; } } } } void manageShoppingCart(MYSQL mysql_conn,char * id) { setbuf(stdin,NULL) ; while(!system("CLS")) { printInCenter("购物车管理") ; printHR() ; char sql[200] = "select id,name,price,purchasequantity from shoppingcart ,item where shoppingcart.itemnumber = item.number and userid = '" ; strcat(sql,id) ; strcat(sql,"' order by id asc") ; if(mysql_query(&mysql_conn,sql) != 0) { printf(sql) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } MYSQL_RES * res ; res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; if(row_num == 0) { printInCenter("购物车内还没有东西\n") ; } else { printf("编号\t商品名称\t商品价格\t购买数量\n") ; int i ; MYSQL_ROW row ; for(i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-4s\t%-8s\t%-8s\t%-8s\n",row[0],row[1],row[2],row[3]) ; } } printHR() ; if(row_num == 0) { printf("暂无商品,添加了商品再来哦\n按任意键返回\n") ; getchar() ; return ; } printLeftJustify("\n1.下单购买\n2.修改商品数量\n3.从购物车中删除商品\n4.退出购物车管理\n") ; char choice ; choice = getchar() ; setbuf(stdin,NULL) ; switch(choice) { case '1': { printf("请输入要购买的商品编号:\n") ; char formId[10] ; gets(formId) ; setbuf(stdin,NULL) ; char sql_1[200] = "select * from shoppingcart,item where itemnumber = number and id = " ; strcat(sql_1,formId) ; if(mysql_query(&mysql_conn,sql_1) != 0) { printf(sql_1) ; printf(mysql_error(&mysql_conn)) ; return ; } res = mysql_store_result(&mysql_conn) ; row_num = mysql_num_rows(res) ; MYSQL_ROW itemRow ; itemRow = mysql_fetch_row(res) ; if(row_num == 0) { printf("没有这个编号哦\n按任意键返回") ; getchar() ; break ; } if((atoi(itemRow[9]) - atoi(itemRow[3])) < 0 ) { printf("商品的库存不够了,不能下单\n按任意键返回\n") ; getchar() ; break ; } printInCenter("\n要下单的商品信息\n") ; printHR() ; printf("商品名称:%s\n",itemRow[5]) ; printf("商品类别:%s\n",itemRow[6]) ; printf("商品描述: %s\n",itemRow[7]) ; printf("商品价格:%s\n",itemRow[8]) ; printf("购买数量:%s\n",itemRow[3]) ; float singlePrice = atof(itemRow[8]) ; int quantity = atoi(itemRow[3]) ; float price = singlePrice * quantity ; printHR() ; printf("需要的总金额为:%.2f\n",price) ; printHR() ; printf("确认下单?(y/n)") ; char option ; option = getchar() ; if(option == 'y' || option == 'Y') { setbuf(stdin,NULL) ; char xxDate[9] ; getDate(xxDate) ; //向订单表中插入数据 char sql_form[200] = "insert into orderform(userid,itemnumber,ordertime,orderquantity,orderprice)values('" ; strcat(sql_form,id) ; strcat(sql_form,"',") ; char itemNumber[20] ; strcpy(itemNumber,itemRow[2]) ; strcat(sql_form,itemNumber) ; strcat(sql_form,",'") ; strcat(sql_form,xxDate) ; strcat(sql_form,"',") ; strcat(sql_form,itemRow[3]) ; strcat(sql_form,",") ; strcat(sql_form,itemRow[8]) ; strcat(sql_form,")") ; if(mysql_query(&mysql_conn,sql_form) != 0) { printf(sql_form) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } //更新item表中库存 char sql_stock[200] = "update item set stock = stock - " ; strcat(sql_stock,itemRow[3]) ; strcat(sql_stock," where number = ") ; strcat(sql_stock,itemNumber) ; if(mysql_query(&mysql_conn,sql_stock) != 0) { printf(sql_stock) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } //删除购物车数据 char sql_cart[200] = "delete from shoppingcart where id = " ; strcat(sql_cart,formId) ; if(mysql_query(&mysql_conn,sql_cart) != 0) { printf(sql_cart) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } printf("购买成功\n按任意键返回") ; getchar() ; } else { printf("没有下单购买\n按任意键返回\n") ; getchar() ; break ; } } break ; case '2': { printf("请输入要修改商品的编号:\n") ; char formId[10] ; gets(formId) ; setbuf(stdin,NULL) ; //获取库存量 char sql_getS[100] = "SELECT stock,purchasequantity FROM item,shoppingcart where itemnumber = number and id = " ; strcat(sql_getS,formId) ; if(mysql_query(&mysql_conn,sql_getS) != 0) { printf(sql_getS) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } MYSQL_RES * res ; res = mysql_store_result(&mysql_conn) ; //判断编号是否正确 if(mysql_num_rows(res) == 0) { printf("没有这个编号\n按任意键返回\n") ; getchar() ; } else { MYSQL_ROW row = mysql_fetch_row(res) ; int curentStock = atoi(row[0]) ; printf("该商品现有库存为:%5d件,购买数量为%5s件\n",curentStock,row[1]) ; printf("请输入新的购买数量\n") ; char purchaseQuantity[10] ; while(gets(purchaseQuantity)) { setbuf(stdin,NULL) ; //验证数量否有效 int purchaseQuantity_int = atoi(purchaseQuantity) ; if(purchaseQuantity_int < 0 || purchaseQuantity_int > curentStock) { printf("数量不对哦,请重新输入:\n") ; } else if(purchaseQuantity_int == 0) { char sql_delete[200] = "delete from shoppingcart where id = " ; strcat(sql_delete,formId) ; if(mysql_query(&mysql_conn,sql_delete) != 0) { printf(sql_delete) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } printf("已将该商品从购物车中删除\n按任意键返回") ; getchar() ; break ; } else { char sql_modify[200] = "update shoppingcart set purchasequantity = " ; strcat(sql_modify,purchaseQuantity) ; strcat(sql_modify," where id = ") ; strcat(sql_modify,formId) ; if(mysql_query(&mysql_conn,sql_modify) != 0) { printf(sql_modify) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } printf("修改成功\n按任意键返回") ; getchar() ; break ; } } } } break ; case '3': { printf("请输入要删除商品的编号:\n") ; char formId[10] ; gets(formId) ; setbuf(stdin,NULL) ; char sql_delete[200] = "delete from shoppingcart where id = " ; strcat(sql_delete,formId) ; if(mysql_query(&mysql_conn,sql_delete) != 0) { printf(sql_delete) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } if(mysql_affected_rows(&mysql_conn) != 0) { printf("已将该商品从购物车中删除\n按任意键返回") ; getchar() ; } else { printf("编号不对啊,按任意键返回\n") ; getchar() ; } } break ; case '4': return ; default: printf("没有这个选项\n") ; } } } void printForm(MYSQL mysql_conn,char * id) { system("CLS") ; setbuf(stdin,NULL) ; printInCenter("已完成的订单") ; printHR() ; printf("订单号\t购买商品\t下单时间\t购买数量\t商品单价\t合计\n") ; char sql[200] = "select ordernumber,name,ordertime,orderquantity,orderprice,orderprice*orderquantity from orderform ,item where number = itemnumber and userid = '" ; strcat(sql,id) ; strcat(sql,"'") ; if(mysql_query(&mysql_conn,sql) != 0) { printf(sql) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } MYSQL_RES * res ; res = mysql_store_result(&mysql_conn) ; if(mysql_num_rows(res) == 0) { printInCenter("没有订单") ; } else { int row_num = mysql_num_rows(res) ; MYSQL_ROW row ; int i ; for( i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("%-6s\t%-8.8s\t%-8s\t%8s\t%8s\t%8.2f\n",row[0],row[1],row[2],row[3],row[4],atof(row[5])) ; } } printHR() ; printf("按任意键返回\n") ; getchar() ; } void modifyEmail(MYSQL mysql_conn,char * id) { while(!system("CLS")) { setbuf(stdin,NULL) ; char sql_x[200] = "select email from email where userid = '" ; strcat(sql_x,id) ; strcat(sql_x,"'") ; printInCenter("邮箱管理") ; printHR() ; if(mysql_query(&mysql_conn,sql_x) != 0) { printf(sql_x) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } MYSQL_RES * res = mysql_store_result(&mysql_conn) ; int row_num = mysql_num_rows(res) ; MYSQL_ROW row ; char ** emails ; if(row_num == 0) { printInCenter("没有辅助邮箱\n") ; } else { int i ; emails = (char*)malloc(sizeof(char*)) ;//存储数据,删除时只需要输入编号即可 for(i = 0 ; i < row_num ; i++) { emails[i] = (char*)malloc(200*sizeof(char)) ; } for(i = 0 ; i < row_num ; i++) { row = mysql_fetch_row(res) ; printf("\t%d.\t",i+1) ; printf("\t%s\n",row[0]) ; strcpy(emails[i],row[0]) ; } } printHR() ; printLeftJustify("1.添加辅助邮箱\n2.删除辅助邮箱\n3.退出邮箱管理\n") ; char choice ; setbuf(stdin,NULL) ; choice = getchar() ; switch(choice) { case '1' : { printf("请输入新邮箱\n") ; char newEmail[200] ; setbuf(stdin,NULL) ; gets(newEmail) ; char sql_add[200] = "insert into email values('" ; strcat(sql_add,id) ; strcat(sql_add,"','") ; strcat(sql_add,newEmail) ; strcat(sql_add,"')") ; if(mysql_query(&mysql_conn,sql_add) != 0) { printf("添加失败.该邮箱已经存在\n") ; } else { printf("添加成功\n") ; } printf("按任意键返回") ; setbuf(stdin,NULL) ; getchar() ; } break ; case '2' : { if(row_num != 0) { printf("请输入要删除邮箱的编号\n") ; int num ; scanf("%d",&num) ; if(num<1 || num > row_num+1) { printf("编号不存在啊\n按任意键返回") ; setbuf(stdin,NULL) ; getchar() ; } else { printf("确定要删除%s吗?(y/n)",emails[num-1]) ; char options ; setbuf(stdin,NULL) ; options = getchar() ; if(options == 'y' || options == 'Y') { char sql_delete[200] =" delete from email where email = '" ; strcat(sql_delete,emails[num-1]) ; strcat(sql_delete,"'") ; if(mysql_query(&mysql_conn,sql_delete) != 0) { printf(sql_delete) ; printf(mysql_error(&mysql_conn)) ; getchar() ; return ; } printf("删除成功\n按任意键返回") ; } else { printf("邮箱未删除\n按任意键返回\n") ; } setbuf(stdin,NULL) ; getchar() ; } } else { printf("没有辅助邮箱\n按任意键返回") ; setbuf(stdin,NULL) ; getchar() ; } } break ; case '3' : { //释放内存 int i ; for(i = 0 ; i < row_num ; i++) { free(emails[i]) ; } free(emails) ; } return ; default : printf("无效的选项,按任意键返回\n") ; getchar() ; } } } int printInCenter(char * str) { int len = strlen(str) ; int whiteNum = (80-len)/16 ; int i ; for(i = 0 ; i < whiteNum ; i++) { printf("\t") ; } printf("%s\n",str) ; return true ; } int printLeftJustify(char* str) { int i = 0 ; while(str[i] != '\0') { printf("\t\t\t") ; while(str[i] != '\n' && str[i] != '\0') { putchar(str[i]) ; i++ ; } putchar('\n') ; putchar('\n') ; i++ ; } return true ; } int printHR() { int i ; for(i = 0 ; i < 40 ; i++) { putchar('-') ; putchar(' ') ; } return true ; } void getDate(char * xxDate) { time_t t ; struct tm * p ; time(&t) ;//初始化 p = gmtime(&t) ; int year = p->tm_year+1900 ; int mon = p->tm_mon+1 ; int day = p->tm_mday ; int i = 0 ; for(i = 0 ; i < 9 ; i++) { xxDate[i] = '\0' ; } char tmp[10] ; itoa(year,tmp,10) ; strcpy(xxDate,tmp) ; if(mon <= 9) { strcat(xxDate,"0") ; } itoa(mon,tmp,10) ; strcat(xxDate,tmp) ; if(day<= 9) { strcat(xxDate,"0") ; } itoa(day,tmp,10) ; strcat(xxDate,tmp) ; } void encrypt(char * password) { int len = strlen(password) ; int i ; for(i = 0 ; i < len ; i++) { password[i] = ~password[i] ;//按位取非 ~ } } #endif // SHOPPINGCART_H_INCLUDED