PHP 与 MySQL 详解实战入门(1)

发布于:2025-08-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

PHP 与 MySQL 详解实战入门(1)

前言

在 Web 开发领域,PHP 与 MySQL 的组合一直是构建动态网站和后端系统的经典搭配。随着 PHP 8 + 的普及,其在性能、类型安全和错误处理上的优化让这一组合更加高效可靠。
对于刚接触后端开发的新手,或需要更新知识体系的开发者来说,从数据库连接到数据操作的每一步都充满细节:如何安全连接 MySQL?如何创建数据库和表结构?如何避免 SQL 注入风险?如何高效插入数据并追踪记录?

本文基于 PHP 8 + 环境,系统讲解 MySQLi(过程式 / 面向对象)与 PDO 两种连接方式,从数据库创建、表结构设计,到单条 / 批量数据插入,再到预处理语句的安全实践和最后插入 ID 的获取,手把手带你掌握 PHP 操作 MySQL 的核心流程。无论你是零基础入门,还是需要规范代码风格,这份指南都能帮你打好基础。


PHP与MYSQL

(1)PHP MySQL 连接

1.通过 PHP 连接到 MySQL 的方法

为了存储或访问 MySQL 数据库中的数据,您首先需要连接到 MySQL 数据库服务器。PHP 8 + 提供两种连接方式:

  • MySQLi(改进的 MySQL):仅支持 MySQL 数据库,提供面向对象和过程式两种 API
  • PDO(PHP 数据对象):支持多数据库,仅提供面向对象 API

提示:MySQLi 适合 MySQL 专属项目,PDO 适合跨数据库场景。PHP 8 + 中 MySQLi 在性能和 MySQL 特有功能支持上更具优势,推荐优先使用。

a.语法:MySQLi,程序化方式
$link = mysqli_connect("hostname", "username", "password", "database");
// PHP 8+ 必须显式设置字符集
mysqli_set_charset($link, "utf8mb4");
b.语法:MySQLi,面向对象的方式
$mysqli = new mysqli("hostname", "username", "password", "database");
// PHP 8+ 连接失败会自动抛出mysqli_sql_exception
$mysqli->set_charset("utf8mb4");
c.语法:PHP 数据对象 (PDO) 方式
$pdo = new PDO("mysql:host=hostname;dbname=database;charset=utf8mb4", "username", "password");
// PHP 8+ 推荐设置异常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

参数说明:

  • hostname:MySQL 服务器地址(通常为localhost
  • username/password:数据库访问凭据(PHP 8 + 环境强制要求设置密码)
  • database:默认使用的数据库名
  • utf8mb4:PHP 8 + 强制推荐的字符集(支持 Emoji 和完整 Unicode)
特性 MySQLi 程序化方式 MySQLi 面向对象方式 PDO 方式
API 风格 函数式(如mysqli_connect() 对象方法(如$mysqli->connect() 纯面向对象(如$pdo->query()
数据库支持 仅支持 MySQL 仅支持 MySQL 支持 12 + 数据库(MySQL、PostgreSQL 等)
错误处理 需手动检查错误(如mysqli_error() PHP 8 + 自动抛出mysqli_sql_exception 可设置抛出PDOException
预处理语句占位符 仅支持问号占位符(? 仅支持问号占位符(? 支持命名占位符(:name)和问号
扩展性 较弱,依赖函数调用 较强,面向对象设计 最强,抽象层支持自定义驱动
适用场景 小型 MySQL 项目,偏好过程式编程 中大型 MySQL 项目,面向对象架构 跨数据库项目,需统一接口
2.在线示例
a.MySQLi 程序化方式
<?php
/* 尝试MySQL服务器连接(PHP 8+ 标准) */
$link = mysqli_connect("localhost", "db_user", "secure_pass", "demo");
 
// 检查连接
if (!$link) {
    throw new mysqli_sql_exception("错误:无法连接。" . mysqli_connect_error());
}
// 设置字符集
if (!mysqli_set_charset($link, "utf8mb4")) {
    throw new mysqli_sql_exception("字符集设置失败:" . mysqli_error($link));
}
 
// 打印主机信息
echo "连接成功。主机信息: " . mysqli_get_host_info($link);
?>
b.MySQLi 面向对象方式
<?php
/* 尝试MySQL服务器连接(PHP 8+ 面向对象方式) */
try {
    $mysqli = new mysqli("localhost", "db_user", "secure_pass", "demo");
    // 连接失败会自动抛出异常,无需手动检查false
    
    // 设置字符集
    if (!$mysqli->set_charset("utf8mb4")) {
        throw new mysqli_sql_exception("字符集设置失败:" . $mysqli->error);
    }
    
    // 打印主机信息
    echo "连接成功。主机信息:" . $mysqli->host_info;
} catch (mysqli_sql_exception $e) {
    die("错误:无法连接。" . $e->getMessage());
}
?>
c.PDO 方式
<?php
/* 尝试MySQL服务器连接(PHP 8+ PDO方式) */
try {
    // DSN中直接指定字符集(PHP 8+ 推荐)
    $pdo = new PDO("mysql:host=localhost;dbname=demo;charset=utf8mb4", "db_user", "secure_pass");
    
    // 设置错误模式为异常(PHP 8+ 调试友好)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 打印主机信息
    echo "连接成功。主机信息:" . $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS);
} catch (PDOException $e) {
    die("错误:无法连接。 " . $e->getMessage());
}
?>

注意:

  • PHP 8 + 环境中,禁止使用空密码和root用户直接连接数据库
  • 生产环境应创建专用数据库账户并限制权限
  • utf8mb4是唯一推荐的字符集,避免使用utf8(存在字符支持不全问题)
3.关闭 MySQL 数据库服务器连接

脚本执行结束后连接会自动关闭,如需提前关闭,PHP 8 + 提供以下方式:

1.MySQLi 程序化方式
<?php
$link = mysqli_connect("localhost", "db_user", "secure_pass", "demo");
if (!$link) {
    throw new mysqli_sql_exception("错误:无法连接。" . mysqli_connect_error());
}
mysqli_set_charset($link, "utf8mb4");
 
echo "连接成功。主机信息: " . mysqli_get_host_info($link);
 
// 关闭连接
mysqli_close($link);
?>
2.MySQLi 面向对象方式
<?php
try {
    $mysqli = new mysqli("localhost", "db_user", "secure_pass", "demo");
    $mysqli->set_charset("utf8mb4");
    
    echo "连接成功。主机信息: " . $mysqli->host_info;
    
    // 关闭连接(PHP 8+ 空安全运算符,避免未定义变量错误)
    $mysqli?->close();
} catch (mysqli_sql_exception $e) {
    die("错误:无法连接。" . $e->getMessage());
}
?>
3.PDO 方式
<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=demo;charset=utf8mb4", "db_user", "secure_pass");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "连接成功。主机信息: " .$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS);
} catch (PDOException $e) {
    die("错误:无法连接。" . $e->getMessage());
}
 
// 关闭连接(释放资源)
unset($pdo);
?>

(2)PHP创建数据库

1. 过程式方式(MySQLi)
<?php
/* 连接MySQL服务器 */
$host = 'localhost';
$user = 'db_admin'; // 避免使用root用户
$pass = 'secure_pass_123'; // 强制设置密码

// 建立连接
$link = mysqli_connect($host, $user, $pass);

// 检查连接(PHP 8+ 严格错误处理)
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}

// 定义创建数据库的SQL语句
$sql = "CREATE DATABASE demo";

// 执行查询
if (mysqli_query($link, $sql)) {
    echo "数据库 'demo' 创建成功";
} else {
    throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . mysqli_error($link));
}

// 关闭连接
mysqli_close($link);
?>
2. 面向对象方式(MySQLi)
<?php
/* 连接MySQL服务器(PHP 8+ 异常处理) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';

try {
    // 实例化连接(PHP 8+ 连接失败会自动抛出mysqli_sql_exception)
    $mysqli = new mysqli($host, $user, $pass);

    // 定义创建数据库的SQL语句
    $sql = "CREATE DATABASE demo";

    // 执行查询
    if ($mysqli->query($sql) === true) {
        echo "数据库 'demo' 创建成功";
    } else {
        throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . $mysqli->error);
    }

    // 关闭连接
    $mysqli->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. PDO 方式

出现 操作失败:could not find driver的原因是pdo_mysql 扩展未安装或未启用

  1. 找到 PHP 安装目录下的 php.ini 配置文件(可通过 phpinfo() 中的 Loaded Configuration File 查看路径)。
  2. 打开 php.ini,搜索并取消注释(删除前面的 ;)以下行:
<?php
/* 连接MySQL服务器(PHP 8+ PDO规范) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';

try {
    // 建立PDO连接(设置异常模式)
    $pdo = new PDO("mysql:host=$host", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 定义并执行创建数据库的SQL语句
    $sql = "CREATE DATABASE demo";
    $pdo->exec($sql);
    echo "数据库 'demo' 创建成功";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    // 释放连接
    unset($pdo);
}
?>

(3)PHP MySQL 创建表

1. 过程式方式(MySQLi)
<?php
/* 连接MySQL并指定数据库 */
$host = 'localhost';
$user = 'db_admin'; // 专用数据库用户
$pass = 'secure_pass_123'; // 强密码
$dbname = 'demo'; // 目标数据库

// 建立连接
$link = mysqli_connect($host, $user, $pass, $dbname);

// 检查连接(PHP 8+ 严格错误处理)
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}

// 设置字符集(PHP 8+ 强制要求)
mysqli_set_charset($link, 'utf8mb4');

// 定义创建表的SQL语句(指定引擎和字符集)
$sql = "CREATE TABLE persons (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(30) NOT NULL,
    last_name VARCHAR(30) NOT NULL,
    email VARCHAR(70) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

// 执行查询
if (mysqli_query($link, $sql)) {
    echo "表 'persons' 创建成功";
} else {
    throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . mysqli_error($link));
}

// 关闭连接
mysqli_close($link);
?>
2. 面向对象方式(MySQLi)
<?php
/* 连接MySQL并指定数据库(PHP 8+ 异常处理) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';
$dbname = 'demo';

try {
    // 实例化连接(自动抛出异常)
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    
    // 设置字符集
    $mysqli->set_charset('utf8mb4');

    // 定义创建表的SQL语句
    $sql = "CREATE TABLE persons (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(30) NOT NULL,
        last_name VARCHAR(30) NOT NULL,
        email VARCHAR(70) NOT NULL UNIQUE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

    // 执行查询
    if ($mysqli->query($sql) === true) {
        echo "表 'persons' 创建成功";
    } else {
        throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . $mysqli->error);
    }

    // 关闭连接(空安全运算符避免未定义错误)
    $mysqli?->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. PDO 方式
<?php
/* 连接MySQL并指定数据库(PHP 8+ PDO规范) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';
$dbname = 'demo';

try {
    // 建立PDO连接(DSN指定字符集)
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] // 直接设置异常模式
    );

    // 定义创建表的SQL语句
    $sql = "CREATE TABLE persons (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(30) NOT NULL,
        last_name VARCHAR(30) NOT NULL,
        email VARCHAR(70) NOT NULL UNIQUE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

    // 执行查询
    $pdo->exec($sql);
    echo "表 'persons' 创建成功";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    // 释放连接
    unset($pdo);
}
?>

(4)向 MySQL 表插入数据

MySQL 中通过INSERT INTO语句插入新记录。结合 PHP,可通过数据库扩展的查询方法执行该语句。推荐使用预处理语句防止 SQL 注入,同时强化错误处理。

1. 插入单条记录
a.过程式方式(MySQLi)
<?php
$host = 'localhost';
$user = 'db_admin'; // 专用账户,禁止root
$pass = 'SecurePass@2024'; // 强密码
$dbname = 'demo';

// 连接数据库
$link = mysqli_connect($host, $user, $pass, $dbname);
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($link, 'utf8mb4');

// 使用预处理语句(防止SQL注入)
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($link, $sql);

// 绑定参数(i=int, s=string,此处均为字符串)
mysqli_stmt_bind_param($stmt, 'sss', $firstName, $lastName, $email);

// 定义要插入的值
$firstName = 'Peter';
$lastName = 'Parker';
$email = 'peterparker@mail.com';

// 执行语句
if (mysqli_stmt_execute($stmt)) {
    echo "记录插入成功,新记录ID:" . mysqli_insert_id($link);
} else {
    throw new mysqli_sql_exception("插入失败:" . mysqli_stmt_error($stmt));
}

// 释放资源
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
b.面向对象方式(MySQLi)
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(PHP 8+ 自动抛异常)
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    $mysqli->set_charset('utf8mb4');

    // 预处理语句
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($sql);

    // 绑定参数
    $stmt->bind_param('sss', $firstName, $lastName, $email);

    // 赋值
    $firstName = 'Peter';
    $lastName = 'Parker';
    $email = 'peterparker@mail.com';

    // 执行
    if ($stmt->execute()) {
        echo "记录插入成功,新记录ID:" . $mysqli->insert_id;
    } else {
        throw new mysqli_sql_exception("插入失败:" . $stmt->error);
    }

    // 关闭资源
    $stmt->close();
    $mysqli->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
c.PDO 方式
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(指定字符集和异常模式)
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    // 预处理语句
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
    $stmt = $pdo->prepare($sql);

    // 绑定参数并执行
    $stmt->execute([
        ':first_name' => 'Peter',
        ':last_name' => 'Parker',
        ':email' => 'peterparker@mail.com'
    ]);

    echo "记录插入成功,新记录ID:" . $pdo->lastInsertId();
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    unset($pdo);
}
?>
2. 批量插入多条记录

通过单个INSERT语句插入多行,效率更高。

a.过程式方式(MySQLi)
<?php
$link = mysqli_connect('localhost', 'db_admin', 'SecurePass@2024', 'demo');
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}
mysqli_set_charset($link, 'utf8mb4');

// 批量插入的SQL(使用预处理)
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($link, $sql);
mysqli_stmt_bind_param($stmt, 'sss', $first, $last, $email);

// 待插入的数据
$persons = [
    ['John', 'Rambo', 'johnrambo@mail.com'],
    ['Clark', 'Kent', 'clarkkent@mail.com'],
    ['Harry', 'Potter', 'harrypotter@mail.com']
];

// 循环执行
foreach ($persons as $p) {
    $first = $p[0];
    $last = $p[1];
    $email = $p[2];
    if (!mysqli_stmt_execute($stmt)) {
        throw new mysqli_sql_exception("插入失败:" . mysqli_stmt_error($stmt));
    }
}

echo "批量插入成功,共插入 " . count($persons) . " 条记录";

mysqli_stmt_close($stmt);
mysqli_close($link);
?>
b.PDO 方式(更简洁)
<?php
try {
    $pdo = new PDO(
        "mysql:host=localhost;dbname=demo;charset=utf8mb4",
        'db_admin',
        'SecurePass@2024',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $pdo->prepare($sql);

    $persons = [
        ['John', 'Rambo', 'johnrambo@mail.com'],
        ['Clark', 'Kent', 'clarkkent@mail.com'],
        ['Harry', 'Potter', 'harrypotter@mail.com']
    ];

    // 批量执行
    foreach ($persons as $p) {
        $stmt->execute($p);
    }

    echo "批量插入成功,共插入 " . count($persons) . " 条记录";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. 从 HTML 表单插入数据
步骤 1:创建 HTML 表单
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>添加记录</title>
</head>
<body>
    <form action="insert.php" method="post">
        <p>
            <label>名:</label>
            <input type="text" name="first_name" required>
        </p>
        <p>
            <label>姓:</label>
            <input type="text" name="last_name" required>
        </p>
        <p>
            <label>邮箱:</label>
            <input type="email" name="email" required>
        </p>
        <input type="submit" value="提交">
    </form>
</body>
</html>
步骤 2:处理表单数据
a.MySQLi 面向对象方式(预处理)
<?php
// 验证表单数据(PHP 8+ 严格验证)
if (empty($_POST['first_name']) || empty($_POST['last_name']) || empty($_POST['email'])) {
    die("错误:所有字段为必填项");
}
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    die("错误:邮箱格式无效");
}

$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    $mysqli->set_charset('utf8mb4');

    // 预处理语句(防止SQL注入)
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(
        'sss', 
        //每个字符对应一个参数的类型,这里的 'sss' 表示:
		//第一个 s:对应第一个参数 $_POST['first_name'],类型为字符串(string)
		//第二个 s:对应第二个参数 $_POST['last_name'],类型为字符串(string)
		//第三个 s:对应第三个参数 $_POST['email'],类型为字符串(string)
        $_POST['first_name'],
        $_POST['last_name'],
        $_POST['email']
    );

    if ($stmt->execute()) {
        echo "记录插入成功,ID:" . $mysqli->insert_id;
    } else {
        throw new mysqli_sql_exception("插入失败:" . $stmt->error);
    }

    $stmt->close();
    $mysqli->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
b.PDO 方式(预处理)
<?php
// 表单验证
if (!isset($_POST['first_name'], $_POST['last_name'], $_POST['email'])) {
    die("错误:缺少字段");
}
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
    die("错误:邮箱格式无效");
}

try {
    $pdo = new PDO(
        "mysql:host=localhost;dbname=demo;charset=utf8mb4",
        'db_admin',
        'SecurePass@2024',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:fn, :ln, :em)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':fn' => $_POST['first_name'],
        ':ln' => $_POST['last_name'],
        ':em' => $email // 使用过滤后的邮箱
    ]);

    echo "记录插入成功,ID:" . $pdo->lastInsertId();
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
}
?>

防止 SQL 注入
必须使用预处理语句prepare() + execute()),替代mysqli_real_escape_string()。预处理语句会自动转义特殊字符,是最安全的方式。

(5)MySQL 获取最后插入的 ID

为什么需要获取最后插入的 ID?

当表中存在AUTO_INCREMENT类型的主键(如id列)时,MySQL 会自动为新插入的记录生成唯一 ID。在以下场景中需要获取该 ID:

  • 向主表插入记录后,需将该 ID 作为外键插入从表(如订单表与订单详情表)。
  • 插入成功后,需跳转至新记录的详情页(需用 ID 定位)。
1. MySQLi 过程式方式
<?php
$host = 'localhost';
$user = 'db_admin'; 
$pass = 'SecurePass@2024'; // 强密码
$dbname = 'demo';

// 连接数据库
$link = mysqli_connect($host, $user, $pass, $dbname);
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($link, 'utf8mb4');

// 使用预处理语句插入记录(推荐,防SQL注入)
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($link, $sql);
mysqli_stmt_bind_param($stmt, 'sss', $firstName, $lastName, $email);

// 赋值并执行
$firstName = 'Ron';
$lastName = 'Weasley';
$email = 'ronweasley@example.com';
mysqli_stmt_execute($stmt);

// 获取最后插入的ID
$lastId = mysqli_insert_id($link);
echo "记录插入成功,最后插入的ID:{$lastId}";

// 释放资源
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
2. MySQLi 面向对象方式
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(PHP 8+ 连接失败自动抛异常)
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    $mysqli->set_charset('utf8mb4');

    // 预处理插入
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('sss', $firstName, $lastName, $email);

    // 执行插入
    $firstName = 'Ron';
    $lastName = 'Weasley';
    $email = 'ronweasley@example.com';
    $stmt->execute();

    // 获取最后插入的ID(通过对象属性)
    $lastId = $mysqli->insert_id;
    echo "记录插入成功,最后插入的ID:{$lastId}";

    // 关闭资源(空安全运算符防未定义错误)
    $stmt?->close();
    $mysqli?->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. PDO 方式
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(设置异常模式)
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    // 预处理插入(使用命名占位符)
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:fn, :ln, :em)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':fn' => 'Ron',
        ':ln' => 'Weasley',
        ':em' => 'ronweasley@example.com'
    ]);

    // 获取最后插入的ID(通过lastInsertId()方法)
    $lastId = $pdo->lastInsertId();
    echo "记录插入成功,最后插入的ID:{$lastId}";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    unset($stmt, $pdo);
}
?>

适用条件
仅当表中存在AUTO_INCREMENT类型的列(通常为主键),且插入操作成功时,才能获取到有效 ID。若插入失败(如违反唯一约束),返回值为0false(依扩展而定)。


结语

通过本文的学习,我们从 PHP 8 + 连接 MySQL 的基础语法入手,逐步掌握了数据库创建、表结构设计、数据插入(含单条 / 批量 / 表单提交)、预处理语句防注入,以及最后插入 ID 获取等核心操作。
核心要点可总结为三点:一是根据场景选择合适的连接方式(MySQLi 适合纯 MySQL 场景,PDO 适合跨库需求);二是始终以预处理语句作为数据操作的标准实践,这是防范 SQL 注入的关键;三是理解 “连接 - 建库 - 建表 - 插入” 的完整流程,为后续学习查询、更新、删除等操作打下基础。
技术的掌握离不开实践,建议你结合文中示例搭建本地环境,尝试修改参数、模拟异常场景(如重复插入、权限不足),深入理解每一步的原理。后续我们将继续探讨 MySQL 数据查询、更新与删除操作,敬请关注。