主要代码:
网页代码
<html><Meta http-equiv="Content-Type" content="text/html; charset=gbk"/> <head><title>用户登陆验证</title></head> <body> <form name="form1" action="/cgi-bin/pass.cgi" method="POST"> <table align="center"> <tr><td align="center" colspan="2"></td></tr> <tr> <td align="right">用户名</td> <td><input type="text" name="Username"></td> </tr> <tr> <td align="right">密 码</td> <td><input type="password" name="Password"></td> </tr> <tr> <td><input type="submit" value="登 录"></td> <td><input type="reset" value="取 消"></td> </tr> </table> </form> </body> </html>
CGI代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlite3.h" char* getcgidata(FILE* fp,char* requestmethod); //把从服务器上获取的数据存储在数组input中 int main() { char *input; char *req_method; char namein[12]; char pass[12]; char passtemp[12]; int i = 0; int j = 0; printf("Content-type: text/html\n\n"); req_method = getenv("REQUEST_METHOD"); input = getcgidata(stdin,req_method); // 我们获取的input字符串可能像如下的形式 // Username="admin"&Password="aaaaa" 以&为分割点分割为用户名和密码两部分,再分别提取输入的用户名和密码名 // 其中"Username="和"&Password="都是固定的 // 而"admin"和"aaaaa"都是变化的,也是我们要获取的 // 前面9个字符是Usernamein= // 在"Usernamein="和"&"之间的是我们要取出来的用户名 for ( i = 9; i < (int)strlen(input); i++ ) { if ( input[i] == '&' ) { namein[j] = '\0'; break; } namein[j++] = input[i]; } // 前面9个字符 + "&Password="10个字符 + Usernamein的字符数 // 是我们不要的,故省略掉,不拷贝 for ( i = 19 + strlen(namein),j = 0; i < (int)strlen(input); i++ ) { pass[j++] = input[i]; } pass[j] = '\0'; sqlite3_stmt* stmt; sqlite3 *db=NULL; char *zErrMsg = 0; int rc; rc = sqlite3_open("/usr/local/boa/cgi-bin/login.db",&db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 //创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中 //char *sql = " CREATE TABLE user(ID INTEGER PRIMARY KEY,Name text,Passwd text);" ; //sqlite3_exec( db,sql,&zErrMsg ); //查询数据int ret=0; int t=0; sql = "SELECT Passwd FROM user WHERE Name=?"; ret = sqlite3_prepare(db,strlen(sql),&stmt,NULL); sqlite3_bind_text(stmt,1,namein,strlen(namein),sqlITE_STATIC); while( sqlite3_step(stmt) == sqlITE_ROW){ strcpy(passtemp,sqlite3_column_text(stmt,0)); if(strcmp(passtemp,pass)==0) { printf("<html>\n") ; printf("<head><title>welcome</title></head>\n") ; printf("<body>\n") ; printf("<h1>welcome home!!</h1>\n") ; printf("</body>\n") ; printf("</html>\n") ; t=1; } } if(t==0) { printf("<html>\n") ; printf("<head><title>welcome</title></head>\n") ; printf("<body>\n") ; printf("<h1>sorry,you need the key!</h1>\n") ; printf("</body>\n") ; printf("</html>\n") ;} sqlite3_finalize(stmt); sqlite3_close(db); //关闭数据库 return 0; } char* getcgidata(FILE* fp,char* requestmethod) { char* input; int len; int size = 1024; int i = 0; if (!strcmp(requestmethod,"GET")) { input = getenv("QUERY_STRING"); return input; } else if (!strcmp(requestmethod,"POST")) { len = atoi(getenv("CONTENT_LENGTH")); input = (char*)malloc(sizeof(char)*(size + 1)); //malloc函数,向系统分配指定长度的内存空间,若成功,则返回分配的内存指针,使用完毕之后用free函数释放分配的内存 <span style="white-space:pre"> </span> //分配内存给input,用于存放获取的信息. if (len == 0) { input[0] = '\0'; return input; } while(1) { input[i] = (char)fgetc(fp); //fgetc向指定的数据流中读取一个字符 if (i == size) //读取size个字符之后,返回读取的值 { input[i+1] = '\0'; return input; } --len; if (feof(fp) || (!(len))) //feof(fp)判断指针指否已经到达文件尾部 { i++; input[i] = '\0'; return input; } i++; } } return NULL; }
红题字一定放最后,网上说,不然会出现错误,我的没有出。
这样就可以把程序移植到BOA服务器的相关CGI脚本目录下,通过表单的action属性,设置触发路径。