# :-: 数据库基本常识
### 1、什么是MySQL
* `DBMS`: ( Database Management System)数据库管理系统
* `RDBMS`: (Relational Database Management System)
* 中文: 关系型数据库管理系统
* 关系: 可暂时简单的理解为一张二维表格
* `MySQL`: 最流行的**关系型数据库管理系统**
*****
### 2、为什么 MySQL 如此流行
* 免费开源, 使用简单: 使用成本低
* 性能优异, 社区活跃: 遇到问题可快速找到解决方案
* 巨头维护, 安全放心: Oracle公司产品
* 与 PHP / Apache 是一对基友, 不离不弃, 生死相依
*****
### 3、RDBMS 基本术语
* 数据库: 一组相关联的数据表的集合, 类似于目录
* 数据表: 一张用来存储数据的二维表格, 类似于文件
>[info] 数据库与数据表之间的关系, 类似于目录与文件之间的关系
![](http://kanyun.8car.net/php/db1.png)
* 行: 也叫记录, 是一组相关数据的集合, 例如某个用户的相关信息
* 列: 也叫字段, 某个具体数据,例如用户姓名: admin
* 主键: 唯一识别某一行记录的字段名称, 一张表只能有一个主键,例如id
* 外键: 关于关联二张数据表的,即当前表的外键,应该是另一张表的主键
* 索引: 类似字典的索引, 在特定字段上创建,用来快速查询数据
![](http://kanyun.8car.net/php/db2.png)
*****
### 4、数据库管理工具
* MySQL工具很多,主要有客户端和网页版
* phpMyAdmin 网页版
* Navicat for MySql 客户端
*****
### 5、MySQL数据类型
![](http://kanyun.8car.net/php/db3.png)
*****
### 6、常用数据库操作语句
* 最常用的就是: `CURD` 增删改查
* `SQL`语句编写规范
* 关键字全部大写: `SELECT / INSERT / DELETE / UPDATE ...`
* 表名与字段名使用反引号定界符: 表名`user`, 字段名`email`
* 具体值,有类型与长度等属性
![](http://kanyun.8car.net/php/db4.png)
*****
### 7、创建数据表
```
# 创建分类表
CREATE TABLE `category` (
`cate_id` int(3) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(30) NOT NULL COMMENT '栏目名称',
`alias` varchar(30) NOT NULL COMMENT '栏目别名',
PRIMARY KEY (`cate_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 创建影视表
CREATE TABLE `movies` (
`mov_id` int(2) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) NOT NULL COMMENT '影视剧名',
`image` varchar(100) NOT NULL,
`detail` text NOT NULL,
`cate_id` int(3) unsigned NOT NULL COMMENT '所属栏目',
PRIMARY KEY (`mov_id`),
KEY `cate_id` (`cate_id`),
CONSTRAINT `movies_ibfk_1` FOREIGN KEY (`cate_id`) REFERENCES `category` (`cate_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 创建系统表
CREATE TABLE `system` (
`sys_id` int(1) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(50) NOT NULL COMMENT '页面标题',
`desc` varchar(200) NOT NULL COMMENT '页面描述',
`key` varchar(50) NOT NULL COMMENT '关键字',
`copy` varchar(50) NOT NULL COMMENT '版权',
PRIMARY KEY (`sys_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
*****
### 7、新增记录
>[info] 新增操作有二套语法规范
* SQL规范: `INSERT INTO`数据表`(`字段1`,`字段2`...) VALUES ('值1','值2'...)`
* 优点: 通用规范, 移植性好, 可同时插入多条记录
* 缺点: 字段与值的顺序必须一一对应, 容易出现拼写错误
* MySQL扩展: `INSERT INTO`数据表`SET`字段1`='值1',`字段2`='值2'...`
* 优点: 语法简洁优雅, 执行效率是传统语法的3倍以上
* 缺点: 只适用于`MySQL`数据库, 移植性差,并且不支持同时插入多条记录
>[danger] Tips: 语句中的 `INTO` 可以省略, 主键可忽略赋值,如果赋值必须是为`NULL`
```
# 添加分类表
INSERT INTO `category` (`cate_id`, `name`, `alias`) VALUES (1, 'gc', '国产好剧');
INSERT INTO `category` (`name`, `alias`) VALUES ('om','欧美猛片');
INSERT INTO `category` SET `name`='rh', `alias`='欧美猛片';
# 添加影视表
INSERT INTO `movies` (`mov_id`, `name`, `image`, `detail`, `cate_id`) VALUES
(1, '倚天屠龙记', '1.jpg', '元朝末年,群雄纷起,武林动荡。江湖传闻,得到屠龙刀倚天剑者,可以成为武林至尊,号令天下,莫敢不从。一时间风云四起,引发了武林中对屠龙刀倚天剑的争夺,几段姻缘和孽缘也由此产生。武当派张翠山与天鹰教殷素素因屠龙刀相遇相恋,最后亦因屠龙刀被正派人士所逼迫,双双自尽。他们的儿子张无忌长大成人后,机缘巧合下练成了绝世武功“九阳神功”和“乾坤大挪移”,成为了明教教主。 张无忌与元朝郡主赵敏、峨嵋派周芷若、表妹殷离和婢女小昭都有着千丝万缕的爱意。然而,看似柔弱的周芷若,却是个十足的“腹黑女”,她为了获取倚天剑屠龙刀的秘密,不惜杀害殷离,陷害赵敏。张无忌虽看清了周芷若真实面目,但仍割舍不下她。其后,张无忌化解了武林种种恩怨,辞去教主之位,与赵敏寄迹蒙古。', 1),
(2, '都挺好', '2.jpg', ' 苏母的的突然离世打破了这个家庭外表的平静,意想不到的隐患层层显露,对毫无主见却又自私、小气的苏父的安置和后续生活问题,引发了远在国外的大哥与本城的二哥、小妹三家规律生活的不再。一直被苏母压制的苏父翻身突变,他的冷漠自私将苏家的旧伤痕撕成了一道道血淋淋的亲情鸿沟;大哥苏明哲一心愚孝,却不断伤害他在美国的小家庭的福祉,婚姻和事业几度面临危机;二哥苏明成是习惯啃老的宠儿,缺乏骑士精神,母亲的死让他突然面临心理断奶,茫然仓皇,导致事业崩溃,破产离婚;而本剧的主角小妹苏明玉,有着可疑身世,从小不受父母待见,怨恨母亲的不公,上大学没用过家里一分钱,毕业后家里却没有她的三尺床,靠着自强、拼搏,成为一家大型集团长江以南地区的销售主管。她一直表态要和苏家一刀两断,拼命地逃离,却始终逃不掉亲情的羁绊,在苏家的一次次危机中出手相助。苏明玉冷眼看着父母不幸的婚姻生活,一次又一次为自己和母亲的相似惊恐不已,没有勇气去面对婚姻,在“暖男”石天冬的追求下,展开了一段看似不般配,却恰恰互补的爱情,最终放开身世之痛。', 1),
(3, '如果可以这样爱', '3.jpg', '一对已婚男女突然徇情自杀,以为可以结束这一切,却不料悲剧才刚刚开始——他们的爱人,耿墨池和白考儿,同时在葬礼上邂逅。面对同样的背叛他们同时选择报复但又同时爱上彼此,注定饱受打击和折磨。然而他们想真心拥有彼此时,老天已不给他们机会,耿墨池身患不治之症注定要离去,而这时候白考儿亡夫的哥哥祁树礼出现了,纠结在两个男人之间,最终一个走向婚礼,一个走向葬礼。', 1),
(4, '复仇者联盟4', '4.jpg', '《复仇者联盟4:终局之战》将是漫威宇宙“无限传奇”(The Infinity Saga)的终结篇,是漫威电影宇宙十年的一个重要节点,结束部分英雄电影的故事,但也将展开新的剧情,呈现新的更为广阔宏大的宇宙观,未来也将出现新的超级英雄,继续漫威超级英雄激动人心的故事。漫威影业荣誉出品《复仇者联盟4:终局之战》,故事发生在灭霸消灭宇宙一半的生灵并重创复仇者联盟之后,剩余的英雄被迫背水一战,为22部漫威电影写下传奇终章。', 2),
(5, '波西米亚狂想曲', '5.jpg', '弗雷迪·默丘里成名前在机场做行李搬运工。有一天,默丘里毛遂自荐加入杰·泰勒与布莱恩·梅的乐团,恰巧当天原本的主唱辞职,默丘里用自己横跨四个八度的超广音域说服两人,从此开启皇后乐团的摇滚传奇!', 2),
(6, '阿丽塔:战斗天使', '6.jpg', '在26世纪的世界中,上等人住在浮在半空中一个名叫撒冷的空间站里,而平民百姓则在废土一般的地表钢铁城中生活。钢铁城里人类与机械改造人共存,弱肉强食是钢铁城中唯一的生存法则。钢铁城中著名的改造人医生依德(克里斯托弗·瓦尔兹饰)在一个垃圾场发现了一个半机械少女的残躯,他将其改造成为有着机械身体的少女,依德为重生的少女取名阿丽塔(罗莎·萨拉扎尔饰)。阿丽塔失去了过往的记忆,犹如新生儿一般对世界充满好奇。她遇到了街头少年雨果(基恩·约翰逊饰),两人互生好感。天真烂漫的阿丽塔偶然间发现自己有着惊人的战斗力,而她在面对厮杀的过程中,慢慢恢复了记忆,也开始想起自己的使命', 2),
(7, '情书', '7.jpg', '日本神户某个飘雪的冬日,渡边博子(中山美穗)在前未婚夫藤井树的三周年祭日上又一次悲痛到不能自已。正因为无法抑制住对已逝恋人的思念,渡边博子在其中学同学录里发现“藤井树” 在小樽市读书时的地址时,依循着寄发了一封本以为是发往天国的情书。\r\n 不想不久渡边博子竟然收到署名为“藤井树(中山美穗)”的回信,经过进一步了解,她知晓此藤井树是一个同她年纪相仿的女孩,且还是男友藤井树(柏原崇)少年时代的同班同学。为了多了解一些昔日恋人在中学时代的情况,渡边博子开始与女性藤井树书信往来。而藤井树在不断的回忆中,渐渐发现少年时代与她同名同姓的那个藤井树曾对自己藏了一腔柔情', 3),
(8, '天空之城', '8.jpg', '韩书珍将两个女儿的教育问题和对丈夫的贤内助工作都做得井井有条,在天空之城之中也是备受瞩目的女王,但其实书珍一直隐藏着不为人所知的秘密。李秀林是个充满了关怀和情感丰沛的童话作家,在书珍的引导之下成为了天空之城女王们的公共之敌,但多亏聪明的儿子帮忙,一度成为了新一任女王,甚至在那之后还看出了书珍的秘密。读完博之后回归做家庭主妇的卢胜慧,从小家教严苛,一直是个乖乖女,但其实隐藏着内心不断要涌出来的欲望和炸弹。热情又可爱的购物狂陈真熙,因为老爸手中坐拥大楼,从小就是金枝玉叶,她将韩书珍视作楷模,忙于学习她的举手投足', 3),
(9, '龙猫', '9.jpg', '为了方便妻子草壁靖子养病,草壁达郎决定带着两个女儿草壁皋月和草壁米搬到草壁靖子所在疗养院附近的乡下,父女三人入住了一间年久失修的老房子。小姐妹俩很快发现看似平凡无奇的乡下有很多神奇的事物,无人居住的房屋里能聚能散还能飞的“煤灰”、森林里的小精灵、森林的主人龙猫和笑口常开的猫巴士。', 3);
```
*****
### 8、更新记录
* `UPDATE`数据表`SET`字段1`='值1',`字段2`='值2'... WHERE 更新条件`
* 不要无条件更新
```
UPDATE category SET `alias`='日韩新片' WHERE cate_id = 3
```
*****
### 9、删除记录
* `DELETE FROM`数据表`WHERE 删除条件`
* 与更新一样, 不能省略删除条件
```
DELETE FROM movies WHERE mov_id = 9
```
>[info] `INSERT / UPDATE / DELETE`: 都是写操作, 会影响到当前数据表中的记录内容,返回受影响的记录数量
*****
### 10、查询操作
* `SELECT`字段列表`FROM`数据表名`WHERE 查询条件`
* 结果集控制: `ORDER BY`排序, `GROUP BY`分组, `LIMIT`限制数量...
* 举例: `SELECT * FROM `user` WHERE `id`> 10 LIMIT 5`
* 查询语句是最灵活,也是最常用的功能, 日常80%以上操作与查询相关
* 查询不会影响到表中数据, 返回结果集
```
DELETE FROM movies WHERE mov_id = 9
```
*****
# :-: PDO操作数据库
### 1. 什么是 PDO
* PDO: (Php Data Object) php数据对象
* PDO 统一了PHP访问各种类型数据库的访问方式
* 一句话, 不管什么类型数据库, PDO一招搞定
![](http://kanyun.8car.net/php/db5.png)
*****
#### 2. PDO 连接
* `PDO`: pdo对象(连接对象)
![](http://kanyun.8car.net/php/db7.png)
```
# connect.php文件
// 数据库连接参数
$db = [
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'php',
'username' => 'root',
'password' => 'root',
];
// 配置数据源DSN信息
$dsn = "{$db['type']}:host={$db['host']};dbname={$db['dbname']}";
// 连接数据库
try {
$pdo = new PDO($dsn, $db['username'], $db['password']);
} catch (PDOException $e) {
die('Connection Failed: ' . $e->getMessage());
}
```
*****
### 3. PDO 预处理
* `PDOStatement`: 预处理对象(SQL语句对象)
* `prepare()`: 预处理方法, 用来生成预处理对象`PDOStatement`
```
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'INSERT INTO `system` SET `sys_id`= :sys_id, `title`=:title, `desc`=:desc, `key`=:key, `copy`=:copy';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
```
*****
### 4. PDO 绑定参数
* `bindParam()`: 将参数绑定到SQL语句模板上
* 常用的预定义常量:
* `PDO::PARAM_INT`: 整数类型
* `PDO::PARAM_STR`: 字符串类型
* `PDO::FETCH_ASSOC`: 获取结果集中的关联部分
```
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'INSERT INTO `system` SET `sys_id`= :sys_id, `title`=:title, `desc`=:desc, `key`=:key, `copy`=:copy';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$sys_id = 1;
$title = '私人影院';
$desc = '收集全网最新最全的影视资源';
$key = '国产,欧美,日韩';
$copy = '欧阳克';
$stmt->bindParam('sys_id', $sys_id, PDO::PARAM_INT);
$stmt->bindParam('title', $title, PDO::PARAM_STR);
$stmt->bindParam('desc', $desc, PDO::PARAM_STR);
$stmt->bindParam('key', $key, PDO::PARAM_STR);
$stmt->bindParam('copy', $copy, PDO::PARAM_STR);
```
*****
### 5. PDOStatement 类常用方法
* `execute()`: 执行SQL语句(读/写)
* `rowCount()`: 返回受影响的记录数量(不适合SELECT)
* `errorInfo()`: 返回错误信息数组
* `fetch()`: 获取结果集中的下一行
* `fetchAll()`: 返回结果集中的所有行
* `fetchColumn()`: 返回结果集下一行的单独的一列
* `bindColumn()`: 将结果集某字段绑定到指定变量上
```php
# 新增记录
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'INSERT INTO `system` SET `sys_id`= :sys_id, `title`=:title, `desc`=:desc, `key`=:key, `copy`=:copy';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$sys_id = 1;
$title = '私人影院';
$desc = '收集全网最新最全的影视资源';
$key = '国产,欧美,日韩';
$copy = '欧阳克';
$stmt->bindParam('sys_id', $sys_id, PDO::PARAM_INT);
$stmt->bindParam('title', $title, PDO::PARAM_STR);
$stmt->bindParam('desc', $desc, PDO::PARAM_STR);
$stmt->bindParam('key', $key, PDO::PARAM_STR);
$stmt->bindParam('copy', $copy, PDO::PARAM_STR);
// 5. 执行SQL操作
if ($stmt->execute()) {
if ($stmt->rowCount() > 0) {
echo '成功添加' . $stmt->rowCount(). '条记录, 该记录的主键id是: ' . $pdo->lastInsertId();
}
} else {
die('<pre>' . print_r($stmt->errorInfo(), true));
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
```
```
# 更新记录
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'UPDATE `category` SET `name` = :name, `alias` = :alias WHERE `cate_id`=:cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$name = 'xjj';
$alias = '小姐姐';
$cate_id = 4;
$stmt->bindParam('name', $name, PDO::PARAM_STR);
$stmt->bindParam('alias', $alias, PDO::PARAM_STR);
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
if ($stmt->execute()) {
if ($stmt->rowCount() > 0) {
echo '成功更新了' . $stmt->rowCount() . '条记录';
}
} else {
die('<pre>' . print_r($stmt->errorInfo(), true));
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
```
```
# 删除记录
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'DELETE FROM `category` WHERE `cate_id`=:cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 4;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
if ($stmt->execute()) {
if ($stmt->rowCount() > 0) {
echo '成功删除了' . $stmt->rowCount() . '条记录';
}
} else {
die('<pre>' . print_r($stmt->errorInfo(), true));
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
```
```
# 查询1: fetch() + while()
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'SELECT * FROM `movies` WHERE `cate_id` = :cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 1;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
$stmt->execute();
// 遍历
while ($movie = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo '<pre>' . print_r($movie, true);
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
```
```
# 查询2: fetchAll()
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'SELECT * FROM `movies` WHERE `cate_id` = :cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 3;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
$stmt->execute();
// 遍历, 返回二维数组
$movies = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($movies as $movie) {
echo '<pre>' . print_r($movie, true);
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
```
```
# 查询3: bindColumn()
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'SELECT * FROM `movies` WHERE `cate_id` = :cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 3;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
$stmt->execute();
// 将结果集中的记录中的字段, 绑定到指定的变量上
$stmt->bindColumn('name', $name);
$stmt->bindColumn('detail', $detail);
while ($stmt->fetch(PDO::FETCH_ASSOC)) {
$detail = mb_substr($detail,0, 20,'utf-8');
echo '片名: ' . $name . '<br>' . '简介: ' . $detail . '...<hr>';
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
```
*****
### 6. pdo操作数据库基本流程
1. 连接数据库,创建pdo对象
* `$pdo = new PDO($dsn, $username, $password);`
2. 执行SQL语句完成数据库操作
* 创建SQL语句对象: `$stmt = $pdo->prepare($sql)`
* 执行SQL查询: `$stmt->execute()`
* 对执行结果进行解析或进一步处理
3. [可选]销毁pdo对象,关闭连接: `$pdo = null`
![](http://kanyun.8car.net/php/db8.png)
*****
# :-: 数据库管理网站内容
### 1、`connect.php`公共配置文件
```
// 数据库连接参数
$db = [
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'php',
'username' => 'root',
'password' => 'root',
];
// 配置数据源DSN信息
$dsn = "{$db['type']}:host={$db['host']};dbname={$db['dbname']}";
// 连接数据库
try {
$pdo = new PDO($dsn, $db['username'], $db['password']);
} catch (PDOException $e) {
die('Connection Failed: ' . $e->getMessage());
}
```
*****
### 2、头尾公共文件 `header.php` 和 `footer.php`
```
<?php
// 连接数据库:$pdo
require 'connect.php';
// 获取网站配置信息(SEO)
$sql = 'SELECT * FROM `system` LIMIT 1';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$system = $stmt->fetch(PDO::FETCH_ASSOC);
// 获取栏目信息
$sql = 'SELECT `cate_id`,`name`,`alias` FROM `category`';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$cates = $stmt->fetchAll(PDO::FETCH_ASSOC);
$cate_count = count($cates); // 栏目数量
// 获取影视信息
$sql = 'SELECT `mov_id`,`name`,`image`, `detail`, `cate_id` FROM `movies`';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$movies = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/style.css">
<meta name="description" content="<?php echo $system['desc'] ?>">
<meta name="keywords" content="<?php echo $system['key'] ?>">
<title><?php echo $system['title'] ?></title>
</head>
<body>
<!--头部导航-->
<div class="header">
<ul class="nav">
<li><a href="index.php">首页</a></li>
<?php foreach ($cates as $cate) : ?>
<li><a href="list.php?cate_id=<?php echo $cate['cate_id']; ?>"><?php echo $cate['alias'] ?></a></li>
<?php endforeach; ?>
</ul>
</div>
```
```
<!--底部版权-->
<div class="footer">
<p class="copyright"><?php echo $system['copy']; ?>© 版权所有</p>
</div>
</body>
</html>
```
*****
### 3、样式和图片
```css
# style.css
.header {
background-color: brown;
height: 30px;
}
.nav li {
list-style:none;
min-width:80px;
line-height: 30px;
float: left;
}
.nav li a {
text-decoration: none;
color: white;
}
.nav {
overflow: hidden;
}
.footer {
height: 30px;
background-color: #636363;
color: white;
text-align: center;
line-height: 30px;
}
```
<img src="http://kanyun.8car.net/php/1.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/2.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/3.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/4.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/5.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/6.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/7.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/8.jpg" width="100" height="100" alt="图片名称" align=center>
<img src="http://kanyun.8car.net/php/9.jpg" width="100" height="100" alt="图片名称" align=center>
*****
### 4、首页
```
include __DIR__ . "/header.php";
foreach ($cates as $cate) {
echo "<h2>{$cate['alias']}</h2>";
echo '<ol>';
foreach ($movies as $movie) {
if ($cate['cate_id'] === $movie['cate_id']) {
echo "<li><a href='detail.php?mov_id=" .$movie['mov_id']. "'>{$movie['name']}</a></li>";
}
}
echo '</ol>';
}
include __DIR__ . '/footer.php';
```
*****
### 5、列表
```php
include __DIR__ . '/header.php';
// 获取栏目ID
// 注: 数据表读取的值,都是以字符类型,这里不必再转换
$cate_id = $_GET['cate_id'];
foreach ($cates as $cate) {
if ($cate['cate_id'] === $cate_id) {
echo "<h2>{$cate['alias']}</h2>";
echo '<ol>';
// 遍历该栏目ID对应的影视信息
foreach ($movies as $movie) {
if ($cate['cate_id'] === $movie['cate_id']) {
echo "<li><a href='detail.php?mov_id=" .$movie['mov_id']. "'>{$movie['name']}</a></li>";
}
}
echo '</ol>';
};
}
include __DIR__ . '/footer.php';
```
*****
### 6、详情
```php
include __DIR__ . '/header.php';
$mov_id = $_GET['mov_id'];
foreach ($movies as $movie) {
if ($movie['mov_id'] === $mov_id) {
echo "<h3>{$movie['name']}</h3>";
echo '<img src="/images/'.$movie['image'].'" alt="" width="300">';
echo "<p style='text-indent: 2em'>{$movie['detail']}</p>";
}
};
include __DIR__ . '/inc/footer.php';
```
- 序言
- PHP基础
- 认识PHP
- 环境安装
- PHP语法
- 流程控制
- PHP数组
- PHP函数
- PHP类与对象
- PHP命名空间
- PHP7新特性
- PHP方法库
- PHP交互
- 前后端交互
- 项目常规开发流程
- MySQL数据库
- 会话控制
- Ajax分页技术
- 细说函数
- 类与对象
- 对象进阶
- 类与对象进阶
- OOP面向对象
- 设计模式
- 路由与模板引擎
- 异常类
- PHP爬虫
- PHP抓取函数
- PHP匹配函数
- 正则表达式
- PHP字符串函数
- 抓取实战
- PHP接口
- 了解接口
- PHP插件
- PHPSpreadsheet
- ThinkPHP6
- 安装
- 架构
- 数据库
- 数据库操作
- 视图
- 模版
- 模型
- 杂项
- 命令行
- 交互
- 微信小程序
- 介绍
- 配置
- 组件
- 交互
- API
- 其他知识
- 百度小程序
- 介绍
- 配置
- 组件
- 交互
- API
- 其他知识
- Linux
- 服务器上线流程
- 安装svn
- MySQL
- 认识MySQL
- MySQL函数
- 杂项
- composer依赖管理工具