免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1890 | 回复: 0
打印 上一主题 下一主题

[应用] sqlite非回调查询简单分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-27 11:12 |只看该作者 |倒序浏览
这几天在做一个简单的嵌入式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
               ----------------------------
            0  username   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[0]) 应为username     
            printf("%s",result[1]) 应为小小
            printf("%s",result[1]) 为歪歪

假如我们要获取表中第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*colum+j]);
            }
获知表单中的所有内容,注意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[i*colum+j]);
68                                         if(strcmp(name,result[i*colum]) !=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 of  for 1
                    }//end of else 1

       由于自己也是刚刚接触sqilte,所以就写下了自己的这些分析过程,其中肯定有自己理解错误,或者不到位的地方,希望大家指正,一起进步~~~~~~~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP