第一章:PHP与MySQL基础回顾

说实话,每次带新人入门,我都会从这一章开始讲起。为什么?因为基础不牢,后面全是坑。我自己带过不少项目,见过太多人连环境都没配好就开始写代码,结果调试三天找不到问题在哪。

这一章,咱们就把地基打扎实。你想想看,盖楼要是地基歪了,后面装修得再好也没用,对吧?

1.1 PHP环境搭建——别小看这一步

我记得刚入行那会儿,配个环境折腾了一整天。现在方便多了,但我还是建议你用集成环境。我个人习惯用 XAMPP 或者 PHPStudy,省心。

搭建步骤其实就三步:

  1. 下载安装包——去官网下,别去第三方站点,你懂的
  2. 一键启动——Apache 和 MySQL 都亮绿灯就行
  3. 验证环境——写个 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,老司机都知道有三种方式:mysqlmysqliPDO

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 的预处理语句到底有多香。