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,程序化方式
php
$link = mysqli_connect("hostname", "username", "password", "database");
// PHP 8+ 必须显式设置字符集
mysqli_set_charset($link, "utf8mb4");
b.语法:MySQLi,面向对象的方式
php
$mysqli = new mysqli("hostname", "username", "password", "database");
// PHP 8+ 连接失败会自动抛出mysqli_sql_exception
$mysqli->set_charset("utf8mb4");
c.语法:PHP 数据对象 (PDO) 方式
php
$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
<?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
<?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
<?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
<?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
<?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
<?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
<?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
<?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
扩展未安装或未启用
- 找到 PHP 安装目录下的
php.ini
配置文件(可通过phpinfo()
中的Loaded Configuration File
查看路径)。- 打开
php.ini
,搜索并取消注释(删除前面的;
)以下行:
php
<?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
<?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
<?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
<?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
<?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
<?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
<?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
<?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
<?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 表单
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
// 验证表单数据(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
<?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
<?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
<?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
<?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。若插入失败(如违反唯一约束),返回值为0
或false
(依扩展而定)。
结语
通过本文的学习,我们从 PHP 8 + 连接 MySQL 的基础语法入手,逐步掌握了数据库创建、表结构设计、数据插入(含单条 / 批量 / 表单提交)、预处理语句防注入,以及最后插入 ID 获取等核心操作。
核心要点可总结为三点:一是根据场景选择合适的连接方式(MySQLi 适合纯 MySQL 场景,PDO 适合跨库需求);二是始终以预处理语句作为数据操作的标准实践,这是防范 SQL 注入的关键;三是理解 "连接 - 建库 - 建表 - 插入" 的完整流程,为后续学习查询、更新、删除等操作打下基础。
技术的掌握离不开实践,建议你结合文中示例搭建本地环境,尝试修改参数、模拟异常场景(如重复插入、权限不足),深入理解每一步的原理。后续我们将继续探讨 MySQL 数据查询、更新与删除操作,敬请关注。