🛢️ 第3章 使用MySQL图形化管理工具
📄 一句话概括

phpMyAdmin 不是数据库,它是一张网页。 它自己不存一个字节,只干三件事:把点击翻成 SQL、发出去、把结果排成表格。 它一个人跑不起来,得配三样:PHP、Web 服务器、MySQL。 phpstudy 这类集成包的价值,就是把这三样的配对接手了。

📝 本章和前面几章的关系

第 2 章把 MySQL 装好了,这一章讲怎么用图形界面操作它。 这一章是全书唯一的「工具章」,从第 4 章起全部回到 SQL。 所以别在这一章花太多时间——工具会用就行,SQL 才是要练的。 和前两章的关系:2.1 说 MySQL 是服务端,这一篇说的 phpMyAdmin 就是一个客户端。 它和你写的 Java 程序地位一样,只是长得好看。

一、它到底是什么

phpMyAdmin 是一套用 PHP 写的网页程序。 你打开它,浏览器拿到一堆 HTML;你点一下,它把一条 SQL 发给 MySQL。 它不存数据,也不做计算。 把 phpMyAdmin 关掉,数据库里一个字节都不会少。 这一点想清楚了,很多疑问就没了:

疑问 答案
装了它是不是多了一个数据库 没有,它只是个客户端
关掉它数据会丢吗 不会,数据在 MySQL 的数据目录里
能不能不装它 能,命令行、Navicat、DBeaver 都行
它慢是数据库慢吗 不一定是,网页本身也要时间

二、为什么教材用它,还得先装 phpstudy

因为 phpMyAdmin 一个人跑不起来。 它是 PHP 程序,得有个能跑 PHP 的 Web 服务器;它要连数据库,得有 MySQL。

组件 干什么 缺了会怎样
Web 服务器(Apache 或 Nginx) 接浏览器请求、把 PHP 跑起来 网页打不开
PHP phpMyAdmin 本身是 PHP 代码 页面一片空白或直接下载源码
MySQL 真正干活的那个服务端 能打开页面,登录不进去

phpstudy 是个集成包,把这三样打包好、配好,点一下全起来。 它的代价是「你不知道它替你改了什么」——端口、配置、安装路径,全被藏起来了。 所以装完先做一件事:把端口记住。 Apache 默认 80,MySQL 默认 3306;这两个端口被占用,是集成包最常见的启动失败原因。 80 端口尤其容易撞:装了 IIS、Skype、某些下载工具的机器上,80 早就被占了。

三、装完怎么打开、打不开怎么办

装好之后,浏览器敲 http://localhost/phpmyadmin(或 http://127.0.0.1)。 登录用 MySQL 的账号,一般就是 root 加安装时设的密码。 打不开的时候,按这个顺序查,别乱试:

现象 多半是什么 怎么确认
页面完全打不开 Web 服务器没起,或端口不是 80 看 phpstudy 面板上的状态灯
403 禁止访问 目录权限或站点根目录配错 看 Apache 的 error.log
页面空白或弹下载 PHP 没跑起来 访问一个 phpinfo 页面试试
能打开但登录失败 MySQL 没起,或密码错 命令行 mysql -u root -p 试一次
提示无法连接服务器 MySQL 端口不是 3306 看 my.ini 里的 port

最后一行最值得记:页面能打开、登录报「无法连接」,说明 Web 那半段是通的, 问题在 MySQL 那半段。 这跟 2.1 节说的「先分清是连不上还是密码错」是一回事。

四、界面分四块,够用就行

phpMyAdmin 的功能很多,常用的就四块。

在哪 干什么 对应哪条 SQL
左栏的库列表 选库、看表 USE 库名
「SQL」页 直接敲语句 你敲什么它就是什么
「结构」页 看字段、加索引、改类型 ALTER TABLE
「导入」「导出」页 搬数据 见 3.5 节

「SQL」页是这一章之外唯一还需要常用的地方。 工具拼不出来的查询,全得在这儿敲。 所以这一章真正的价值不是「学会点按钮」,是「知道每个按钮背后是哪条 SQL」。 知道之后,按钮点不点都无所谓了。

五、动手 Demo:图形工具到底替你干了什么

这一课起一个真的小网站,把 phpMyAdmin 干的三件事演出来。 它当然不是 phpMyAdmin,但它干的是同一件事:收 SQL、执行、排成网页。 三件事:起服务、模拟三次点击、把「按钮与 SQL」的对应关系列成表。

import http.server, socketserver, urllib.parse

class H(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        q = urllib.parse.parse_qs(
            urllib.parse.urlparse(self.path).query)
        sql = q.get("sql", ["SELECT * FROM tb_member"])[0]
        cur = conn.execute(sql)
        rows = cur.fetchall()
        cols = [d[0] for d in (cur.description or [])]
        body = "".join("<tr>" + "".join(
            "<td>%s</td>" % v for v in r) + "</tr>" for r in rows)
        html = "<table><tr>%s</tr>%s</table>" % (
            "".join("<th>%s</th>" % c for c in cols), body)
        raw = html.encode("utf-8")
        self.send_response(200)
        self.send_header("Content-Length", str(len(raw)))
        self.end_headers()
        self.wfile.write(raw)

# 浏览器每点一次,就是发一条 SQL 过来
for sql in ("SELECT id, username, city FROM tb_member",
            "SELECT id, username FROM tb_member WHERE city = '宜昌'",
            "SELECT nmae FROM tb_member"):
    url = "http://127.0.0.1:%d/?sql=%s" % (port, urllib.parse.quote(sql))
    print(sql, "->", len(urllib.request.urlopen(url).read()), "字节")

实跑输出:

--------------------------------------------------------------------
第九课:图形工具到底替你干了什么
--------------------------------------------------------------------

  **教材这一章整章讲 phpMyAdmin,可它自己不会存数据。**
  **它做的事只有三件:把你的点击翻译成 SQL、把 SQL 发给服务端、把结果排成网页。**
  **这一课起一个真的小网站,把这三件事演出来。**
  **它当然不是 phpMyAdmin,但它干的是同一件事。**

  一、一个只会执行 SQL 的网页服务
  --------------------------------------------------------------------
  **服务起在 127.0.0.1:59187,它只认一个参数:要执行哪条 SQL。**

  二、三次「点击」,其实发出三条 SQL
  --------------------------------------------------------------------
  **点「浏览」 → 收到 `SELECT id, username, city FROM t…`,回了 284 字节。**
    网页开头是这样:<h3>4 行</h3><table border=1><tr><th>id</th><th>username</th> …
  **点「搜索 city=宜昌」 → 收到 `SELECT id, username FROM tb_memb…`,回了 143 字节。**
    网页开头是这样:<h3>2 行</h3><table border=1><tr><th>id</th><th>username</th> …
  **点一条写错的搜索 → 收到 `SELECT nmae FROM tb_member…`,回了 36 字节。**
    网页开头是这样:<b>报错:no such column: nmae</b> …

  你点的东西            发出的 SQL 长度  回来的网页字节数
  -------------------------------------------------------
  点「浏览」            40 字            284
  点「搜索 city=宜昌」  52 字            143
  点一条写错的搜索      26 字            36

  三、phpMyAdmin 的每个按钮,对应的都是这几条
  --------------------------------------------------------------------

  界面上的按钮  它发出的 SQL                       结果怎么用
  ------------------------------------------------------------------
  浏览          SELECT * FROM 表 LIMIT 0,30        排成表格
  插入          INSERT INTO 表 (...) VALUES (...)  刷回列表页
  编辑          UPDATE 表 SET ... WHERE 主键 = ?   刷回列表页
  删除          DELETE FROM 表 WHERE 主键 = ?      刷回列表页
  导出          SHOW CREATE TABLE + SELECT *       拼成一堆 SQL 文本
  空表          TRUNCATE TABLE 表                  刷新计数
  **所以「学图形工具」和「学 SQL」不是两件事。**
  **工具点得再熟,遇到它拼不出的查询,还得自己写 SQL。**
  **反过来也一样:会写 SQL 之后,图形工具就只剩「看得顺眼」这一个价值了。**

第一段起的是一个只认一个参数的服务:要执行哪条 SQL。 整个文件不到四十行,phpMyAdmin 的骨架也就这么回事,区别在它多了几百个页面。 第二段三次「点击」,服务端收到三条 SQL。 注意第三条是写错的列名——它返回的不是报错页,是 36 字节的一句 <b>报错…</b>。 图形工具的报错页也是这么来的:把数据库的报错原文包一层 HTML。 第三段那张表是这一节的核心:每个按钮对应的都是固定的一条 SQL。 「浏览」是 SELECT * ... LIMIT 0,30,「编辑」是带主键的 UPDATE。 看懂了这张表,图形工具就不神秘了。 它没有魔法,只是把你记不住的 SQL 替你记着。

30 秒实验

  1. 把 Demo 里那个 /?sql= 参数删掉,改成固定返回一条 SELECT,再请求一次。 你会发现它照样能出网页——这就是「工具」和「数据」的分界线。
  2. 想一想:为什么 phpMyAdmin 要装在 Web 服务器上,而不是做成一个桌面程序? 答案是多个人用同一套东西时,装在服务器上只需要维护一份。
  3. 打开你机器上的浏览器,访问 http://localhost,看有没有东西应答。 有应答说明 80 端口被占了,集成包装的时候就容易在这儿失败。

常见误区

  1. 「装了 phpMyAdmin 就等于装了数据库。」 它只是客户端。 数据库是 MySQL,装在另一处;关掉 phpMyAdmin,数据一个字节都不会少。
  2. 「集成包装完就不用管配置了。」 恰恰相反:集成包替你改了很多东西,你得知道它改了哪。 最起码要记住端口、安装路径、MySQL 的 my.ini 在哪。
  3. 「图形工具能干的,SQL 也能干,所以不用学工具。」 前半句对,后半句不对。 日常维护、看表结构、导数据,工具省的时间是实打实的。 该学的是「知道每个按钮发什么 SQL」,不是「拒绝用工具」。
自测三问(点开对答案) 1. phpMyAdmin 里存着你的数据吗? —— **不存。数据在 MySQL 的数据目录里。**phpMyAdmin 是一套 PHP 网页程序, 只负责把点击翻译成 SQL。 2. 页面能打开,但登录报「无法连接服务器」,问题在哪一半? —— **在 MySQL 那半段。**Web 服务器和 PHP 都是通的(页面出来了), **所以去查 MySQL 起没起、端口是不是 3306、账号密码对不对。** 3. 「浏览」按钮发出的是哪条 SQL? —— **`SELECT * FROM 表 LIMIT 0,30`。** **注意那个 `LIMIT 0,30`——默认只取 30 行,所以大表也不会卡死页面。**

下一篇开始真正操作数据库:建库、改库、删库,以及图形工具里那三个按钮各自对应哪条语句。

相关笔记