标准c语言实现cgi通讯录

时间: 2023-07-13 07:07:21 浏览: 54
CGI通讯录是一个常见的Web应用程序,它允许用户添加、编辑、删除和查看联系人信息。在标准C语言中实现CGI通讯录需要以下步骤: 1. 编写HTML页面:首先需要编写一个HTML页面,包含表单和按钮等元素,用于用户输入和提交联系人信息。 2. 编写CGI程序:使用标准C语言编写一个CGI程序,该程序接收来自HTML页面的请求,并处理用户提交的联系人信息。 3. 连接数据库:使用标准C语言提供的数据库API,连接到数据库并执行查询、插入、更新和删除操作。 4. 处理请求:根据用户提交的请求类型(例如添加、编辑、删除或查看联系人),执行相应的操作,并返回结果页面。 下面是一个简单的示例,演示如何使用标准C语言实现CGI通讯录: HTML页面: ``` <!DOCTYPE html> <html> <head> <title>CGI通讯录示例</title> </head> <body> <h1>CGI通讯录示例</h1> <form method="post" action="/cgi-bin/addressbook.cgi"> <input type="hidden" name="action" value="add"> <label for="name">姓名:</label> <input type="text" id="name" name="name"><br> <label for="phone">电话:</label> <input type="text" id="phone" name="phone"><br> <button type="submit">添加</button> </form> <hr> <table> <tr> <th>姓名</th> <th>电话</th> <th>操作</th> </tr> {% for contact in contacts %} <tr> <td>{{ contact.name }}</td> <td>{{ contact.phone }}</td> <td> <form method="post" action="/cgi-bin/addressbook.cgi"> <input type="hidden" name="action" value="edit"> <input type="hidden" name="id" value="{{ contact.id }}"> <button type="submit">编辑</button> </form> <form method="post" action="/cgi-bin/addressbook.cgi"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="{{ contact.id }}"> <button type="submit">删除</button> </form> </td> </tr> {% endfor %} </table> </body> </html> ``` CGI程序: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sqlite3.h> #define DATABASE "addressbook.db" typedef struct { int id; char name[100]; char phone[100]; } Contact; void print_header() { printf("Content-Type: text/html\n\n"); } void print_error(const char* message) { print_header(); printf("<p>Error: %s</p>", message); } void print_success(const char* message) { print_header(); printf("<p>%s</p>", message); } void print_contacts(Contact* contacts, int count) { print_header(); printf("<html><head><title>CGI通讯录示例</title></head><body>"); printf("<h1>CGI通讯录示例</h1>"); printf("<form method=\"post\" action=\"/cgi-bin/addressbook.cgi\">"); printf("<input type=\"hidden\" name=\"action\" value=\"add\">"); printf("<label for=\"name\">姓名:</label>"); printf("<input type=\"text\" id=\"name\" name=\"name\"><br>"); printf("<label for=\"phone\">电话:</label>"); printf("<input type=\"text\" id=\"phone\" name=\"phone\"><br>"); printf("<button type=\"submit\">添加</button>"); printf("</form>"); printf("<hr>"); printf("<table>"); printf("<tr><th>姓名</th><th>电话</th><th>操作</th></tr>"); for (int i = 0; i < count; i++) { printf("<tr>"); printf("<td>%s</td>", contacts[i].name); printf("<td>%s</td>", contacts[i].phone); printf("<td>"); printf("<form method=\"post\" action=\"/cgi-bin/addressbook.cgi\">"); printf("<input type=\"hidden\" name=\"action\" value=\"edit\">"); printf("<input type=\"hidden\" name=\"id\" value=\"%d\">", contacts[i].id); printf("<button type=\"submit\">编辑</button>"); printf("</form>"); printf("<form method=\"post\" action=\"/cgi-bin/addressbook.cgi\">"); printf("<input type=\"hidden\" name=\"action\" value=\"delete\">"); printf("<input type=\"hidden\" name=\"id\" value=\"%d\">", contacts[i].id); printf("<button type=\"submit\">删除</button>"); printf("</form>"); printf("</td>"); printf("</tr>"); } printf("</table>"); printf("</body></html>"); } void add_contact(sqlite3* db, const char* name, const char* phone) { char* error; char sql[100]; sprintf(sql, "INSERT INTO contacts (name, phone) VALUES ('%s', '%s')", name, phone); if (sqlite3_exec(db, sql, NULL, NULL, &error) != SQLITE_OK) { print_error(error); } else { print_success("联系人添加成功!"); } } void edit_contact(sqlite3* db, int id, const char* name, const char* phone) { char* error; char sql[100]; sprintf(sql, "UPDATE contacts SET name='%s', phone='%s' WHERE id=%d", name, phone, id); if (sqlite3_exec(db, sql, NULL, NULL, &error) != SQLITE_OK) { print_error(error); } else { print_success("联系人更新成功!"); } } void delete_contact(sqlite3* db, int id) { char* error; char sql[100]; sprintf(sql, "DELETE FROM contacts WHERE id=%d", id); if (sqlite3_exec(db, sql, NULL, NULL, &error) != SQLITE_OK) { print_error(error); } else { print_success("联系人删除成功!"); } } int get_contacts(sqlite3* db, Contact** contacts) { sqlite3_stmt* stmt; const char* tail; int count = 0; if (sqlite3_prepare_v2(db, "SELECT id, name, phone FROM contacts", -1, &stmt, &tail) == SQLITE_OK) { count = sqlite3_column_count(stmt); *contacts = malloc(sizeof(Contact) * count); for (int i = 0; i < count; i++) { (*contacts)[i].id = sqlite3_column_int(stmt, 0); strcpy((*contacts)[i].name, sqlite3_column_text(stmt, 1)); strcpy((*contacts)[i].phone, sqlite3_column_text(stmt, 2)); } sqlite3_finalize(stmt); } return count; } int main() { sqlite3* db; if (sqlite3_open(DATABASE, &db) != SQLITE_OK) { print_error("无法连接到数据库!"); return 1; } char* query; char* method = getenv("REQUEST_METHOD"); if (!strcmp(method, "POST")) { int content_length = atoi(getenv("CONTENT_LENGTH")); query = malloc(content_length + 1); fgets(query, content_length + 1, stdin); } else { query = getenv("QUERY_STRING"); } char* action = strtok(query, "&="); if (!strcmp(action, "action")) { char* value = strtok(NULL, "&="); if (!strcmp(value, "add")) { char* name = strtok(NULL, "&="); char* phone = strtok(NULL, "&="); add_contact(db, name, phone); } else if (!strcmp(value, "edit")) { char* id_str = strtok(NULL, "&="); char* name = strtok(NULL, "&="); char* phone = strtok(NULL, "&="); int id = atoi(id_str); edit_contact(db, id, name, phone); } else if (!strcmp(value, "delete")) { char* id_str = strtok(NULL, "&="); int id = atoi(id_str); delete_contact(db, id); } } Contact* contacts; int count = get_contacts(db, &contacts); print_contacts(contacts, count); sqlite3_close(db); return 0; } ``` 说明: 1. 该程序使用SQLite数据库,需要在编译时链接SQLite库,例如: ``` gcc -o addressbook.cgi addressbook.c -lsqlite3 ``` 2. 该程序使用了模板引擎,使用了类似于Django中的模板语法,可以在程序中自定义模板,这里只是简单地演示一下。 3. 该程序中的SQL语句没有进行参数化处理,存在SQL注入的风险,实际应用中应该使用参数化查询。 4. 该程序中的错误处理比较简单,只是将错误信息输出到页面上,实际应用中应该考虑更完善的错误处理方式。

相关推荐

最新推荐

recommend-type

C语言写CGI程序详细教程

用C语言编写的CGI程序具 有执行速度快、安全性高等特点。 内容介绍的比较详细
recommend-type

C语言基于哈希表实现通讯录

主要为大家详细介绍了C语言基于哈希表实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

基于C语言实现个人通讯录管理系统

之前利用C语言完成了一个关于个人通讯录管理系统的课题,主要是关于联系人的添加、查找、删除、修改、输出以及文件的写入与读出,还有一个甜点功能—模拟通话,它的实现原理也很容易理解,文章末尾会介绍到。...
recommend-type

使用C语言实现CRC校验的方法

本篇文章是对使用C语言实现CRC校验的方法进行了详细的分析介绍,需要的朋友参考下
recommend-type

C语言 C程序 通讯录 通讯录

通讯录 通讯录通讯的通讯录的 通讯录的C语言 C程C语言 C程序序C语言 C程序
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。