第一章:PHP与MySQL基础回顾
说实话,每次带新人入门,我都会从这一章开始讲起。为什么?因为基础不牢,后面全是坑。我自己带过不少项目,见过太多人连环境都没配好就开始写代码,结果调试三天找不到问题在哪。
这一章,咱们就把地基打扎实。你想想看,盖楼要是地基歪了,后面装修得再好也没用,对吧?
1.1 PHP环境搭建——别小看这一步
我记得刚入行那会儿,配个环境折腾了一整天。现在方便多了,但我还是建议你用集成环境。我个人习惯用 XAMPP 或者 PHPStudy,省心。
搭建步骤其实就三步:
- 下载安装包——去官网下,别去第三方站点,你懂的
- 一键启动——Apache 和 MySQL 都亮绿灯就行
- 验证环境——写个 phpinfo() 看看版本
重要提醒:PHP 版本建议用 7.4 以上,最好是 8.0 或 8.1。为什么?因为 PDO 在 PHP 7 之后才真正成熟,而且性能提升很明显。我在项目中从 5.6 升到 8.0,接口响应时间直接砍了一半。
验证代码很简单:
<?php
phpinfo();
?>
看到那个大大的 PHP 版本号了吗?嗯,环境就算搭好了。
1.2 MySQL基础操作——CRUD 是基本功
MySQL 这东西,说白了就是个存数据的地方。但怎么存、怎么取,这里头有讲究。
我见过最离谱的事——有人用 MySQL 存 JSON 字符串,然后查的时候用 LIKE 模糊匹配。嗯,那酸爽,谁用谁知道。
咱们先过一遍最基本的操作:
创建数据库和表
CREATE DATABASE IF NOT EXISTS `course_db` DEFAULT CHARSET utf8mb4;
USE `course_db`;
CREATE TABLE `users` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL,
`email` VARCHAR(100) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
我的小建议:字符集一定要用 utf8mb4,别用 utf8。为什么?因为 utf8 存不了 emoji 表情。我曾经有个项目,用户昵称里带了个 😂,结果直接报错。从那以后,我所有项目都统一用 utf8mb4。
增删改查——四板斧
| 操作 | SQL 语句 | 说明 |
|---|---|---|
| 增 | INSERT INTO users (username, email) VALUES ('张三', 'zhangsan@test.com') |
插入一条记录 |
| 删 | DELETE FROM users WHERE id = 1 |
删除指定记录 |
| 改 | UPDATE users SET email = 'new@test.com' WHERE id = 1 |
更新指定字段 |
| 查 | SELECT * FROM users WHERE username = '张三' |
查询记录 |
避坑指南:我曾经在线上环境执行过 UPDATE users SET email = 'xxx' —— 忘了加 WHERE 条件。结果呢?全表用户的邮箱都被改了。嗯,那天晚上我加班到凌晨三点。所以,生产环境操作前,一定先 SELECT 一下看看影响范围。
1.3 PDO扩展介绍——PHP连接MySQL的正确姿势
说到 PHP 连 MySQL,老司机都知道有三种方式:mysql、mysqli、PDO。
mysql 扩展?别用了,PHP 7 已经把它删了。mysqli 呢?能用,但只支持 MySQL。而 PDO —— 这才是现代 PHP 该用的方式。
为什么我推荐 PDO?三个理由:
- 支持多种数据库——MySQL、PostgreSQL、SQLite 随便切,改个连接字符串就行
- 预处理语句——防 SQL 注入的利器,比手动转义靠谱一百倍
- 异常处理——出错了能优雅地捕获,而不是直接白屏
来看一个 PDO 连接示例:
<?php
$host = '127.0.0.1';
$dbname = 'course_db';
$username = 'root';
$password = '';
$charset = 'utf8mb4';
try {
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
echo "连接成功!";
} catch (PDOException $e) {
die("连接失败:" . $e->getMessage());
}
?>
注意这三个配置项:
ERRMODE_EXCEPTION——让 PDO 抛出异常,而不是返回错误码。这样你就能用 try-catch 捕获了FETCH_ASSOC——返回关联数组,用字段名取值,比数字索引好读多了EMULATE_PREPARES = false——关闭模拟预处理,使用 MySQL 原生预处理。性能更好,也更安全
用 PDO 执行查询也很简单:
<?php
// 插入数据
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->execute(['李四', 'lisi@test.com']);
// 查询数据
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([1]);
$user = $stmt->fetch();
// 遍历结果集
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
echo $row['username'] . ' - ' . $row['email'] . '<br>';
}
?>
我的习惯:我会把 PDO 连接封装成一个单例类,放在一个 Database.php 文件里。整个项目只连接一次数据库,避免重复连接浪费资源。后面几章我会详细讲这个封装技巧。
好了,这一章的内容就这些。环境搭好了,MySQL 基本操作会了,PDO 也认识了——接下来咱们就可以真正开始玩 PHP 和 MySQL 的深度整合了。
下一章,我会带你用 PDO 实现一个完整的用户管理系统,包括注册、登录、信息修改。到时候你会发现,PDO 的预处理语句到底有多香。