> For the complete documentation index, see [llms.txt](https://sinkcup.gitbook.io/php-web-tutorial-for-phbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sinkcup.gitbook.io/php-web-tutorial-for-phbook/zh_hans/0/pdo_mysql.md).

# PDO MySQL

## 如果文章有成千上万篇，该怎样保存？

数据保存有多种方式，比如单机文件（JSON、txt）、单机数据库（SQLite、Access）、网络数据库（MySQL/MariaDB、Oracle、SQL Server）等等，根据项目需要进行选型。做Web一般采用开源并且免费的MySQL/MariaDB，本书也以MySQL为例。

学校里应该学过SQL，如果没学过，请先自学《SQL 教程》<http://www.w3school.com.cn/sql/>。

自学：1天。

假设这个在线阅读项目叫做“reader”，需要一个“文章”表“articles”。建库建表代码如下：

```
CREATE DATABASE `reader` DEFAULT CHARACTER SET utf8;
USE `reader`;
CREATE TABLE `articles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `author` varchar(20) DEFAULT NULL,
  `title` varchar(50) DEFAULT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

然后修改`add_article_submit.php`，把文章保存到数据库中即可。代码如下：

```
<?php
$input = $_POST;
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=reader;charset=utf8';
$user = 'root';
$password = '1';
$db = new PDO($dsn, $user, $password); //连接数据库

$sql = 'INSERT INTO `articles` (`author`, `title`, `content`) VALUES (' . '\'' . $input['author'] . '\',\'' . $input['title'] . '\',\'' . $input['content'] . '\');';

$stmt = $db->query($sql); //执行SQL
$id = $db->lastInsertId(); //获得自增id

if (!empty($id)) {
    $notice = '保存成功';
} else {
    $notice = '出错了';
}
$d = array();
$d['notice'] = array(
    'msg' => $notice,
);
require_once __DIR__ . '/notice.html';
```

然后首页`index.php`把这些文章查出来即可，代码如下：

```
<?php
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=reader;charset=utf8';
$user = 'root';
$password = '1';
$db = new PDO($dsn, $user, $password);

$sql = 'SELECT `id`, `author`, `title`, `content` FROM `articles` LIMIT 10';

$stmt = $db->query($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$articles = $stmt->fetchAll();

$d = array();
$d['articles'] = $articles;
require_once __DIR__ . '/index.html';
```

然后单篇阅读页`get_article.php`，根据id，查出一篇即可，这样比查出来所有文章合理多了。代码如下：

```
<?php
$input = $_GET;
$d = array();
if (!isset($input['id']) || empty($input['id'])) {
    $d['notice'] = array(
        'msg' => '出错了：缺少参数',
    );
    require __DIR__ . '/notice.html';
    exit;
}

$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=reader;charset=utf8';
$user = 'root';
$password = '1';
$db = new PDO($dsn, $user, $password);

$sql = 'SELECT `author`, `title`, `content` FROM `articles` WHERE id=' . $input['id'] . ' LIMIT 1';

$stmt = $db->query($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$r = $stmt->fetchAll();

if (empty($r)) {
    $d['notice'] = array(
        'msg' => '出错了：查无此文',
    );
    require __DIR__ . '/notice.html';
    exit;
}

$d = array();
$d['article'] = $r[0];
require_once __DIR__ . '/get_article.html';
```

代码下载：<https://github.com/sinkcup/php-ebook-online-reader/tree/0.4.1>

现在可以发表、查看首页、单篇阅读，功能都实现了。

## 总结一下

### 我的技术水平

| HTML | PHP     | 数据存储  | HTTP协议   | 程序员的自我修养 | 装备           | 等级  |
| ---- | ------- | ----- | -------- | -------- | ------------ | --- |
| 语义化  | 让内容动起来  | 单机文件  | GET、POST |          | PC + Windows | 0.2 |
|      | 表现与业务分离 |       | charset  | Unicode  |              | 0.3 |
|      | PDO     | MySQL |          |          |              | 0.4 |

### 已解决的问题

* 如何用PHP操作MySQL数据库？

  使用PDO即可。
* PDO、php\_mysqli和php\_mysql的区别是什么？

  请自学了解。注意：php\_mysql已废弃。
* 【没钱，对现在的年轻人意味着什么？】

  luckystar神探：来，讲个故事。 从前有个骚年叫小明。不是姚小明，不是黄小明，也不是郭小明。就是一个普普通通的、扎人堆里找不出来的小明。 男，二十多岁，家境普通。口头禅是「还不是因为老子穷」。 高中时，和…… <http://zhi.hu/1P8D>（分享自知乎）

### 待解决的问题

* 访问index.php是正常网页，但访问index.html看到了什么？

  请进行实验。且听下回分解。
* `index.php`、`get_article.php`等多个文件里都连了数据库，如果密码变了，每个地方都要改，怎么办？

  且听下回分解。
