# :-: 數據庫基本常識
### 1、什么是MySQL
* `DBMS`: ( Database Management System)數據庫管理系統
* `RDBMS`: (Relational Database Management System)
* 中文: 關系型數據庫管理系統
* 關系: 可暫時簡單的理解為一張二維表格
* `MySQL`: 最流行的**關系型數據庫管理系統**
*****
### 2、為什么 MySQL 如此流行
* 免費開源, 使用簡單: 使用成本低
* 性能優異, 社區活躍: 遇到問題可快速找到解決方案
* 巨頭維護, 安全放心: Oracle公司產品
* 與 PHP / Apache 是一對基友, 不離不棄, 生死相依
*****
### 3、RDBMS 基本術語
* 數據庫: 一組相關聯的數據表的集合, 類似于目錄
* 數據表: 一張用來存儲數據的二維表格, 類似于文件
>[info] 數據庫與數據表之間的關系, 類似于目錄與文件之間的關系

* 行: 也叫記錄, 是一組相關數據的集合, 例如某個用戶的相關信息
* 列: 也叫字段, 某個具體數據,例如用戶姓名: admin
* 主鍵: 唯一識別某一行記錄的字段名稱, 一張表只能有一個主鍵,例如id
* 外鍵: 關于關聯二張數據表的,即當前表的外鍵,應該是另一張表的主鍵
* 索引: 類似字典的索引, 在特定字段上創建,用來快速查詢數據

*****
### 4、數據庫管理工具
* MySQL工具很多,主要有客戶端和網頁版
* phpMyAdmin 網頁版
* Navicat for MySql 客戶端
*****
### 5、MySQL數據類型

*****
### 6、常用數據庫操作語句
* 最常用的就是: `CURD` 增刪改查
* `SQL`語句編寫規范
* 關鍵字全部大寫: `SELECT / INSERT / DELETE / UPDATE ...`
* 表名與字段名使用反引號定界符: 表名`user`, 字段名`email`
* 具體值,有類型與長度等屬性

*****
### 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一招搞定

*****
#### 2. PDO 連接
* `PDO`: pdo對象(連接對象)

```
# 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`

*****
# :-: 數據庫管理網站內容
### 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依賴管理工具