sqlite非回调查询简单分析
这几天在做一个简单的嵌入式web页面,用的CGI,boa服务器,在注册用户非回调查询数据库sqlite3_get_table这个函数使用上遇到了难题。还好昨晚仔细磨了一下,感觉有了点理解。函数原型:
int sqlite3_get_table(sqlite3*, const char *sql, char ***result, int *row, int *colum, char **errmsg);
参数分析:
sqlite3 * 为已打开的数据库句柄;
sql 要执行的SQL语句
result 用来存放查询结果记录
row 该函数返回的记录数,即有多少条数据
colum 函数返回的字段数
errmsg 出错信息
那么到底如何使用这个函数取出数据呢,这些数据怎样存放的。
加入我创建了一个表:userinfo
0 1 2
----------------------------
0username password tel
----------------------------
1 小小 123456 xxx
----------------------------
2 歪歪 456789 xxx
-----------------------------
以此表为例
加入上面的SQL语句为select name from userinfo 那么此时row=3,colum=1,
(假如是select * from userinfo 那么row=3,colom=3)
存放在result里的数据会是:
“username”
“小小”
“歪歪”
即result-->“username”
“小小”
“歪歪”
此时printf("%s",result) 应为username
printf("%s",result) 应为小小
printf("%s",result) 为歪歪
假如我们要获取表中第1行第2列的数据,可以试着推算这个位置:第1行第2列对应的是第5格,那么应该是1*3+2,
依次类推如果是第2行第2列,那么就是第8格,即2*3+2. 由此可得通用表达式应为 i*colum+j
因此,可以用for(i=1;i<row;i++)
{
for(j=0;j<colum;j++)
printf("%s\n",result);
}
获知表单中的所有内容,注意i是从1开始的,因为0行是存放字段名称的,我们要取的是对应字段的值。
下面是我写的一段验证注册代码
char **result;
50 int row = 0,colum = 0;
51 int i=0,j=0;
52 ret = sqlite3_get_table(db,sql,&result,&row,&colum,&err_msg);
53 if(ret != SQLITE_OK)
54 {
55 // printf("select falid\n");
56 sqlite3_close(db);
57 }
58 else
59 {
60 // printf("there is %d data row\n",row);
61 // printf("there is %d data colum\n",colum);
62
63 for(i=1;i<row;i++)
64 {
65 for(j=0;j<colum;j++)
66 {
67 //printf("%s\n",result);
68 if(strcmp(name,result) !=0 )
69 {
70 sprintf(sql,"insert into userinfo(username,password,tel) values('%s','%s','%s');",name,password,tel);
71 ret = sqlite3_exec(db,sql,0,0,&err_msg);
72 if(ret != SQLITE_OK)
if(ret != SQLITE_OK)
73 {
74 sqlite3_close(db);
75 }
76 else
77 {
78 cgiHeaderContentType("text/html;>");
79 fprintf(cgiOut, "<HTML><HEAD>\n");
80 fprintf(cgiOut, "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"\n");
81 fprintf(cgiOut, "<TITLE>注册验证</TITLE></HEAD>\n");
82 fprintf(cgiOut, "<BODY>");
83 fprintf(cgiOut, "<P>用户:%s注册成功--- 电话号码:%s<P>",name,tel);
84 fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"2;url=../main.html\">");
85 }
86 }
87 else
88 {
89 cgiHeaderContentType("text/html;>");
90 fprintf(cgiOut, "<HTML><HEAD>\n");
91 fprintf(cgiOut, "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"\n");
92 fprintf(cgiOut, "<TITLE></TITLE></HEAD>\n");
93 fprintf(cgiOut, "<BODY>");
94 fprintf(cgiOut, "<P>用户:%s 已经存在,请重新注册<P>",name);
95 fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"2;url=../regist.html\">");
return 0;
98 }
99 }//end of for 2
100
101 }//end offor 1
}//end of else 1
由于自己也是刚刚接触sqilte,所以就写下了自己的这些分析过程,其中肯定有自己理解错误,或者不到位的地方,希望大家指正,一起进步~~~~~~~~~~~~~
页:
[1]