C语言动态网页技术实战笔记
2020-03-13 13:54:51
## 一、创建数据库并添加测试数据
> 讲师:邹义良
```sql
create database site;
use site;
CREATE TABLE `article` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL DEFAULT '',
`content` longtext,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `article` (`id`, `title`, `content`, `created_at`)
VALUES
(1, '今后三天广东各地气温逐渐回升', '中国天气网讯 预计今天(20日)开始,广东各地天气以多云为主,气温逐渐回升,但早晚天气依然较凉,外出注意防寒保暖。\n\n昨天,广东各地天气以多云间晴为主,午后多地气温攀升至20℃以上。\n\n今后三天,广东各地气温将逐渐回升,暖意回归。预计今天,广东全省大部多云。早晨最低气温:粤北5℃~9℃,珠江三角洲、粤东9℃~12℃,粤西13℃~16℃。白天最高气温:粤北、珠三角中北部、粤东19℃~22℃,珠三角南部、粤西21℃~23℃。', '2020-02-20 16:34:44'),
(2, '广东首批5吨 “北薯南种” 马铃薯抢收援鄂', '2月19日上午,湛江市遂溪县。原计划2月底收获的“粤黑合作稻稻薯项目”马铃薯,在即将满百日之时提前抢收,为的是保障驰援奋战在湖北疫情地区一线的医护人员果蔬供应。这场抢收首批5吨,一天后将驰援武汉!', '2020-02-20 16:35:10'),
(3, '各式各样网课接踵上线,如何选?北京市教委给出建议', '北京教育系统延期开学,各式各样的网课接踵上线,其中既有市、区教育部门和学校提供的在线服务,也有社会培训机构推出的在线学习资源。如何合理选课?市教委通过官方微信给出“指导”。', '2020-02-08 19:52:46');
```
## 二、主程序代码
vi news.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
void db(){
char *server = "127.0.0.1"; // 不要用localhost,用127.0.0.1
char *user = "root";
char *password = "123456";
char *database = "site";
MYSQL *conn = mysql_init(NULL);
// https://dev.mysql.com/doc/refman/8.0/en/mysql-real-connect.html
// MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0)){
printf("%s\n", mysql_error(conn));
exit(1);
}
// 解决中文乱码
mysql_query(conn, "set names utf8mb4");
if (mysql_query(conn, "SELECT * FROM article")){
printf("%s\n", mysql_error(conn));
exit(1);
}
// 使用查询的结果集
MYSQL_RES *result = mysql_use_result(conn);
// 循环输出所有SQL查询得到的信息
MYSQL_ROW row;
while (row = mysql_fetch_row(result)){
printf("<li><a href='#'>[%s] %s</a></li>", row[0], row[1]);
printf("\n");
}
// 释放资源
mysql_free_result(result);
mysql_close(conn);
}
void html(){
printf("Content-Type: text/html\n\n");
char *header = "<!doctype html>" \
"<html>" \
"<head>" \
"<meta name='viewport' content='width=device-width, initial-scale=1'>" \
"<meta charset='UTF-8'>" \
"<title>新闻中心</title>" \
"</head>" \
"<body>";
printf("%s\n", header);
printf("<style>" \
".title{font-weight:bold;font-size:18px;margin-top:5px;margin-bottom:5px;line-height:40px;color:#fff;background-color:#96b97d;text-align:center;}" \
"a{text-decoration: none;color:#666;}" \
"ul,li{list-style: none;}" \
"</style>");
printf("<div class='title'>国内新闻</div>");
db();
printf( "</body></html>");
}
int main(){
html();
return 0;
}
```
## 三、编译
```shell
$ sudo apt install -y libmysqlclient-dev # 不安装找不到<mysql.h>头文件
$ gcc news.c -o news.cgi -I /usr/include/mysql -L /usr/lib/mysql -lmysqlclient
```